دعونا نتحدث عن سبب كتب هذا أولاً. عندما ذهبت إلى المقابلة ، ذهبت إلى مقابلة Alibaba المعينة في الساعة 11 في اليوم السابق للمقابلة ، ووجدت فندقًا وبقيت في حوالي الساعة الواحدة. ، مما أدى مباشرة إلى نتائج سيئة للمقابلة في اليوم التالي (بالنسبة لأولئك الروبيان الكبار الذين يبحثون عن وظيفة لا ينبغي أن تقول مأساة للروبيان. لا يزال من المهم للغاية التحضير مسبقًا). عندما عدت من المقابلة ، كنت نائماً تقريبًا عندما مشيت ، حزينًا !!) عندما كانت المقابلة على وشك الانتهاء ، سألني القائم بإجراء المقابلة عن تسلسل فيبونشي. وكنت أعلم فقط أن عليّ تعيين ثلاثة متغيرات أو تهيئتها مع القائمة نهاية ، لا يمكنني إلا أن تكتب الطريقة الأولى تحت الحث خطوة بخطوة للمقابلة. الفترة الذهبية للإصلاح والذهب (يمكنك الذهاب بسرعة إذا كان لديك القدرة). مع Garbage ، لتحليل البيانات ، يمكن لـ Alibaba تحليل البيانات المفصلة للمستخدم المتنوعة التي تتقنها ، ويمكنها تحديد موقع أذواق المستخدمين واحتياجاتهم بشكل أفضل ، مما يوفر أفضل للدفع الدقيق ودفع الدقة. إذا كان حلم Tencent المستقبلي هو أن يكون المياه والكهرباء والغاز في حياة المستخدمين ، فإن حلم Alibaba المحتمل المحتمل هو طعام المستخدم والملابس والسكن والنقل ، وجمع المياه ، والكهرباء والغاز ، إلخ. O (∩_∩) o ~ دعنا ننتقل إلى الموضوع.
بالنسبة لمصممي الخوارزمية الممتازة ، لا يوجد سوى شيئين لرعاية على أساس تنفيذ هيئة وظيفة البرنامج: الأول هو التعقيد الزمني لخوارزمية التصميم ، والآخر هو تعقيد الفضاء (لوضعه بصراحة ، إنه الوقت والذاكرة المستخدمة لتنفيذ برنامج وكمية الذاكرة التي يشغلها ذلك. متطلبات ، عادة ما تكون موارد مساحة التبادل للوقت أو الكائنات الشائعة الاستخدام في الذاكرة لتحسين وقت الاستجابة (تقنية التخزين المؤقت ومعظم قواعد بيانات NOSQL الأكثر شعبية). للأنظمة المدمجة.
دعنا نتحدث عن التطبيقات الثلاثة لسلسلة Febonasi.
أولاً ، دعنا نتحدث عن تسلسل FeBonasi:
من وجهة نظر نصية ، يبدأ تسلسل Fibonacci بـ 0 و 1 ، ويتم إضافة معامل Fibonacci اللاحق بواسطة الرقمين السابقين ، ويكون نموذج التسلسل كما يلي:
0 ، 1 ، 1 ، 2 ، 3 ، 5 ، 8 ، 13 ، 21 ، 34 ، 55 ، 89 ، 144 ، 233 ، 377 ، 610 ، 987 ، 1597 ، 2584 ، 4181 ، 6765 ، 10946 , ...............
في الرياضيات ، يتم تعريفه بالطرق العودية:
f_0 = 0
f_1 = 1
f_n = f_ {n-1}+ f_ {n-2}
قم بتنفيذ المتطلبات: أدخل الرقم التسلسلي n والعودة للحصول على رقم FeBonacci المقابل
تنفيذ البرنامج 1 - الوظيفة الذاتية
نسخة الكود كما يلي:
/**
* وظيفة التأسيس الذاتي
* title: fntype1
* description: تودو
* paramparam n
* param @return
* @RETURN int
* throws استثناء
*/
الجمهور int fntype1 (int n) يلقي الاستثناء {
if (n == 0) {
العودة 0 ؛
} آخر إذا (n == 1 || n == 2) {
العودة 1 ؛
} آخر إذا (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2) ؛
if (temp <0) {
رمي استثناء جديد ("قيمة غير صالحة لنوع int ، كبيرة جدًا") ؛
}آخر{
عودة درجة الحرارة.
}
}آخر{
رمي استثناء جديد ("قيمة غير uniledalArgument لـ n ، يرجى إدخال n> = 0") ؛
}
}
عيوب هذه الطريقة: يجب أن يعرف عدد كبير من التكرارات مساحة المكدس باستمرار (يجب أن يعرف أولئك الذين يشاركون في تطوير الويب وتصحيح الأخطاء والصيانة قيمة موارد مكدس الخادم. إذا لفترة طويلة ، مما يؤدي إلى انهيار خادم الويب). يحدث وتصحيح التصحيح.
تنفيذ البرنامج 2 - وقت للفضاء
نسخة الكود كما يلي:
/**
* حان الوقت لتغيير المساحة
* title: fntype2
* description: تودو
* paramparam n
* param @return
* @RETURN int (n <0 return -1 ، Beyond Max int Size Return -2)
* throws
*/
public int fntype2 (int n) {
int النتيجة = -1 ؛
int temp1 = 0 ؛
int temp2 = 1 ؛
لـ (int index = 0 ؛ index <= n ؛ index ++) {
if (index == 0) {
النتيجة = temp1 ؛
} آخر إذا (index == 1) {
النتيجة = temp2 ؛
}آخر{
النتيجة = temp1+temp2 ؛
إذا (النتيجة <0) {
النتيجة = -2 ؛
استراحة؛
}
temp1 = temp2 ؛
temp2 = النتيجة ؛
}
}
نتيجة العودة
}
تُستخدم هذه الطريقة بشكل أساسي في: السيناريو 1: للسيناريوهات التي يتم فيها استخدام الكائنات أو المتغيرات في كثير من الأحيان ولن يتم استخدامها مرة أخرى بعد الاستخدام مرة واحدة ؛ وغالبا ما تستخدم هذه الطريقة في التصميم.
تنفيذ البرنامج 3 - مساحة للوقت
نسخة الكود كما يلي:
قائمة ثابتة خاصة <integer> fndata = new ArrayList <integer> () ؛
استاتيكي خاص int maxsize = 50000 ؛
/**
* المهيئة
* title: setfndata
* description: تودو
* param
* return void
* throws
*/
setfndata private static void () {
int النتيجة = -1 ؛
int temp1 = 0 ؛
int temp2 = 1 ؛
لـ (int index = 0 ؛ index <= maxSize ؛ index ++) {
if (index == 0) {
النتيجة = temp1 ؛
} آخر إذا (index == 1) {
النتيجة = temp2 ؛
}آخر{
النتيجة = temp1+temp2 ؛
إذا (النتيجة <0) {
النتيجة = -2 ؛
استراحة؛
}
temp1 = temp2 ؛
temp2 = النتيجة ؛
}
fndata.add (نتيجة) ؛
}
}
/**
* واجهة خارجية
* title: getfndata
* description: تودو
* paramparam n
* param @return
* regurn <span style = "font-family: sans-serif ؛"> (n beyond fndata.size () و n <0 return -1) </span>
* throws
*/
الجمهور int getfndata (int n) {
if (fndata.size () == 0) {
setfndata () ؛
}
if (fndata.size ()> n && n> = 0) {
إرجاع fndata.get (n) ؛
}آخر{
العودة -1 ؛
}
}
تُستخدم هذه الطريقة عمومًا في السيناريوهات التي توجد فيها الكائنات أو المتغيرات أو يتم استدعاؤها بشكل متكرر خلال دورة حياة البرنامج بأكملها ، مثل استدعاء واجهة خدمة الويب الخارجية ، وطبقة استمرار التجريد ، وتحميل معلمة ملف التكوين الشائعة الاستخدام ، وما إلى ذلك ، إلخ.
حالات الاختبار:
نسخة الكود كما يلي:
حزمة com.dbc.yangg.swing.test ؛
استيراد java.util.arraylist ؛
استيراد java.util.list ؛
/**
* أدخل رقم التسلسل n والعودة للحصول على رقم FeBonacci المقابل
* classname: init
* description: تودو
* Author [email protected]
* date 10 يناير 2014 الساعة 7:52:13 مساءً
*
*/
الفئة العامة init {
/**
* وظيفة التأسيس الذاتي
* title: fntype1
* description: تودو
* paramparam n
* param @return
* @RETURN int
* throws استثناء
*/
الجمهور int fntype1 (int n) يلقي الاستثناء {
if (n == 0) {
العودة 0 ؛
} آخر إذا (n == 1 || n == 2) {
العودة 1 ؛
} آخر إذا (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2) ؛
if (temp <0) {
رمي استثناء جديد ("قيمة غير صالحة لنوع int ، كبيرة جدًا") ؛
}آخر{
عودة درجة الحرارة.
}
}آخر{
رمي استثناء جديد ("قيمة غير uniledalArgument لـ n ، يرجى إدخال n> = 0") ؛
}
}
/**
* حان الوقت لتغيير المساحة
* title: fntype2
* description: تودو
* paramparam n
* param @return
* @RETURN int (n <0 return -1 ، Beyond Max int Size Return -2)
* throws
*/
public int fntype2 (int n) {
int النتيجة = -1 ؛
int temp1 = 0 ؛
int temp2 = 1 ؛
لـ (int index = 0 ؛ index <= n ؛ index ++) {
if (index == 0) {
النتيجة = temp1 ؛
} آخر إذا (index == 1) {
النتيجة = temp2 ؛
}آخر{
النتيجة = temp1+temp2 ؛
إذا (النتيجة <0) {
النتيجة = -2 ؛
استراحة؛
}
temp1 = temp2 ؛
temp2 = النتيجة ؛
}
}
نتيجة العودة
}
قائمة ثابتة خاصة <integer> fndata = new ArrayList <integer> () ؛
استاتيكي خاص int maxsize = 50000 ؛
/**
* مساحة لتغيير الوقت
* title: setfndata
* description: تودو
* param
* return void
* throws
*/
setfndata private static void () {
int النتيجة = -1 ؛
int temp1 = 0 ؛
int temp2 = 1 ؛
لـ (int index = 0 ؛ index <= maxSize ؛ index ++) {
if (index == 0) {
النتيجة = temp1 ؛
} آخر إذا (index == 1) {
النتيجة = temp2 ؛
}آخر{
النتيجة = temp1+temp2 ؛
إذا (النتيجة <0) {
النتيجة = -2 ؛
استراحة؛
}
temp1 = temp2 ؛
temp2 = النتيجة ؛
}
fndata.add (نتيجة) ؛
}
}
/**
*
* title: getfndata
* description: تودو
* paramparam n
* param @return
* return int (n Beyond fndata.size () و n <0 return -1)
* throws
*/
الجمهور int getfndata (int n) {
if (fndata.size () == 0) {
setfndata () ؛
}
if (fndata.size ()> n && n> = 0) {
إرجاع fndata.get (n) ؛
}آخر{
العودة -1 ؛
}
}
/**
*
* title: Main
* description: تودو
* paramparam argv
* return void
* throws
*/
الفراغ الثابت العام الرئيسي (سلسلة [] argv) {
init init = new init () ؛
int n = 46 ؛
يحاول {
System.out.println ("type1 ="+init.fntype1 (n)) ؛
} catch (استثناء e) {
// TODO AUTO CATCH BLOCK
System.out.println (E.GetMessage ()) ؛
}
System.out.println ("type2 ="+init.fntype2 (n)) ؛
System.out.println ("type3 ="+init.getfndata (n)) ؛
}
}
نتيجة الإخراج:
نسخة الكود كما يلي:
Type1 = 1836311903
Type2 = 1836311903
Type3 = 1836311903
عند تصميم الخوارزميات ، لا تتبع المفاهيم بشكل أعمى.
اسمحوا لي أن أشكو: أنا شخصياً أعتقد أن تصميم بنية البيانات الممتازة يمكن أن يبسط تعقيد تصميم الخوارزمية وتحسين قابلية قراءة الكود ، قابلية التوسع في البرنامج وكفاءة التنفيذ ؛
اسمحوا لي أن أشتكي مرة أخرى: يجب اتباع ثلاثة مبادئ عند إجراء تحليل: 1. التحليل من منظور المستخدم وطريقة التفكير. مبادئ تطوير البرنامج هي: تحسين ذوق الفرد بنشاط ، وتحليل الوظائف من منظور استخدام المستخدم وسيناريوهات الاستخدام ؛ هو الموقف الذي يتم استدعاء المستخدم في ما يلي ، ما هو الاستثناءات التي قد تكون ناتجة عن المعلمات ، ما هي الاستثناءات التي قد تحدث في تنفيذ الواجهة الخاصة بك والتقاط استثناءات محتملة ، إخراج واضح ، وظائف جيدة التوحد ؛ ثم على أساس ضمان تنفيذ الأعمال ، يجب عليك تصميم واجهة المستخدم كمستخدم من حيث عادات استخدام المستخدم والجوانب الأخرى. إنه أمر مثير للاهتمام ، أليس كذلك؟