أهلاً! سيكون درس اليوم مختلفًا قليلاً عن البقية. وسوف يختلف من حيث أنه يرتبط بشكل غير مباشر فقط بجافا. ومع ذلك، هذا الموضوع مهم جدًا لكل مبرمج. سنتحدث عن الخوارزميات . ما هي الخوارزمية؟ بعبارات بسيطة، إنها سلسلة من الإجراءات التي يجب إكمالها لتحقيق النتيجة المرجوة . نحن نستخدم الخوارزميات في كثير من الأحيان في الحياة اليومية. على سبيل المثال، كل صباح لديك مهمة محددة: الذهاب إلى المدرسة أو العمل، وفي نفس الوقت تكون:
- الملبس
- ينظف
- تغذيها
- الاستيقاظ باستخدام المنبه.
- استحم واغسل نفسك.
- قم بإعداد وجبة الإفطار وبعض القهوة أو الشاي.
- يأكل.
- إذا لم تقم بكي ملابسك في الليلة السابقة، قم بكويها.
- يرتدى ملابسة.
- اترك المنزل.
- قم بشراء أو تنزيل طبعة 1961 من قاموس ويبستر الدولي الجديد الثالث.
- ابحث عن كل اسم من قائمتنا في هذا القاموس.
- اكتب على قطعة من الورق صفحة القاموس التي يوجد عليها الاسم.
- استخدم قطع الورق لفرز الأسماء.
for
حلقة عادية تؤدي هذه المهمة
int[] numbers = new int[100];
// ...fill the array with numbers
for (int i: numbers) {
System.out.println(i);
}
ما هو مدى تعقيد هذه الخوارزمية؟ خطي، أي O(ن). يعتمد عدد الإجراءات التي يجب على البرنامج تنفيذها على عدد الأرقام التي يتم تمريرها إليه. إذا كان هناك 100 رقم في المصفوفة، فسيكون هناك 100 إجراء (عبارات لعرض السلاسل على الشاشة). إذا كان هناك 10000 رقم في المصفوفة، فيجب تنفيذ 10000 إجراء. هل يمكن تحسين خوارزميتنا بأي شكل من الأشكال؟ لا، بغض النظر عن ذلك، سيتعين علينا جعل N يمر عبر المصفوفة وتنفيذ عبارات N لعرض السلاسل على وحدة التحكم. النظر في مثال آخر.
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
لدينا فراغ LinkedList
ندخل فيه عدة أرقام. نحتاج إلى تقييم التعقيد الخوارزمي لإدراج رقم واحد في LinkedList
مثالنا، وكيف يعتمد ذلك على عدد العناصر في القائمة. الجواب هو O(1)، أي التعقيد المستمر . لماذا؟ لاحظ أننا نقوم بإدخال كل رقم في بداية القائمة. بالإضافة إلى ذلك، ستتذكر أنه عند إدراج رقم في ملف LinkedList
، فإن العناصر لا تتحرك في أي مكان. يتم تحديث الروابط (أو المراجع) (إذا نسيت كيفية عمل LinkedList، فاطلع على أحد دروسنا القديمة
). إذا كان الرقم الأول في قائمتنا هو x
, وقمنا بإدراج الرقم y في مقدمة القائمة، فكل ما علينا فعله هو ما يلي:
x.previous = y;
y.previous = null;
y.next = x;
عندما نقوم بتحديث الروابط، لا يهمنا عدد الأرقام الموجودة بالفعلLinkedList
، سواء كانت واحدة أو مليار. تعقيد الخوارزمية ثابت، أي O(1).
GO TO FULL VERSION