تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الفرق بين الدالة BinarySearch و الدالة IndexOf في البحث داخل المصفوفات Arrays
#1
كاتب الموضوع : mmosbaha

بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

إخواني الكرام:

سأبدأ الموضوع بسؤال و هو: [INDENT]ما هي نتيجة البحث التالي:


كود :
[color=#0000ff]Dim[/color] MyArray() [color=#0000ff]As[/color] [color=#0000ff]Integer[/color] = {0, 1, 2, 3, 5, 5, 5, 6}

MsgBox(Array.IndexOf(MyArray, 5))

MsgBox(Array.LastIndexOf(MyArray, 5))

Array.Sort(MyArray)
MsgBox(Array.BinarySearch(MyArray, 5))
لماذا كانت النتيجة في البحث الأول 4 و في البحث الثاني 6 و في البحث الثالث 5 ؟


و الجواب هو :

عند البحث داخل المصفوفة بواسطة الدالة IndexOf تبدأ الدالة بمقارنة القيم ابتداءاً من أول قيمة ثم الثانية و هكذا حتى تصل إلى قيمة مطابقة فتكون نتيجة الدالة هي رقم الفهرس للقيمة المطابقة أو تصل إلى آخر قيمة في المصفوفة دون أن تجد قيمة مطابقة فتكون النتيجة هي -1

مثلاً المصفوفة هي كالتالي: [INDENT]0 الفهرس 0
1 الفهرس 1
2 الفهرس 2
3 الفهرس 3
5 الفهرس 4
5 الفهرس 5
5 الفهرس 6
6 الفهرس 7
[/INDENT]ستكون المقارنة كالتالي: [INDENT]5 = 0 الفهرس 0
5 = 1 الفهرس 1
5 = 2 الفهرس 2
5 = 3 الفهرس 3
5 = 5 الفهرس4
[/INDENT]و كذلك عند البحث بواسطة الدالة LastIndexOf فالطريقة نفسها و لكن يبدأ البحث من آخر قيمة في المصفوفة فتكون النتيجة 6 [INDENT]5 = 6 الفهرس 7
5 = 5 الفهرس6
[/INDENT]أما الدالة BinarySearch فتستخدم مع المصفوفات المرتبة و يجب عمل ترتيب للمصفوفة قبل استخدامها

و السبب هو أنها تقوم بتقسيم المصفوفة إلى قسمين و تقارن آخر قيمة في النصف الأول مع القيمة المطلوبة فتكون المقارنة كالتالي:

مثلاً المصفوفة هي كالتالي: [INDENT]0 الفهرس 0
1 الفهرس 1
2 الفهرس 2
3 الفهرس 3
تبدأ المقارنة من آخر قيمة في النصف العلوي
5 الفهرس 4
5 الفهرس 5
5 الفهرس 6
6 الفهرس 7
[/INDENT]ستكون المقارنة كالتالي: [INDENT]
5 = 3 الفهرس 3
[/INDENT]فإذا كانت النتيجة صحيحة تنتهي عملية البحث

و إذا كانت القيمة التي نبحث عنها أصغر من القيمة التي في وسط المصفوفة

تقوم الدالة بحذف النصف الأخير من المصفوفة

باعتبار أن جميع القيم التي فيه هي أكبر من القيمة التي نبحث عنها


أما إذا كانت القيمة التي نبحث عنها أكبر من القيمة التي في وسط المصفوفة

كما في المثال السابق فتقوم الدالة بحذف النصف الأول من المصفوفة

باعتبار أن جميع القيم التي فيه هي أصغر من القيمة التي نبحث عنها

فتصبح المصفوفة كالتالي: [INDENT]5 الفهرس 4
5 الفهرس 5
تبدأ المقارنة من آخر قيمة في النصف العلوي
5 الفهرس 6
6 الفهرس 7
[/INDENT]ثم تكرر العملية السابقة و تقسم القسم الباقي إلى قسمين و تقارنه مع قيمة البحث كالتالي: [INDENT]5 = 5 الفهرس 5
[/INDENT]عند نجاح المقارنة تكون النتيجة هي رقم الفهرس لآخر قيمة في القسم

و عند عدم التطابق تكرر العملية السابقة و تقسم القسم الباقي إلى قسمين و تقارنه مع قيمة البحث

حتى تجد قيمة مطايقة أو نحصل على قسم بقيمة واحدة غير قابل للقسمة

فتكون هذه القيمة هي أقرب قيمة بالنسبة للقيمة التي نحث عنها

و تكون نتيجة الدالة هي فهرس هذه القيمة مضاقاً إليه 1 مع عكس الإشارة

مثال:


كود :
[color=#0000ff]Dim[/color] MyArray() [color=#0000ff]As[/color] [color=#0000ff]Integer[/color] = {0, 1, 2, 3, 4, 6, 7, 8}

Array.Sort(MyArray)
MsgBox(Array.BinarySearch(MyArray, 5))
مثلاً المصفوفة هي كالتالي: [INDENT]0 الفهرس 0
1 الفهرس 1
2 الفهرس 2
3 الفهرس 3
4 الفهرس 4
6 الفهرس 5
7 الفهرس 6
8 الفهرس 7
[/INDENT]ستكون المقارنة كالتالي: [INDENT]5 = 3 الفهرس 3
5 = 6 الفهرس 5
5 = 4 الفهرس 4
5 = 6 الفهرس 5
[/INDENT]النتيجة هي - ( 5 + 1 ) = -6

و عند استخدام الدالة BinarySearch مع مصفوفة غير مرتبة

ستحصل على قيمة عشوائة كانت بالصدفة هي نهاية أحد الأقسام

و البحث بالدالة BinarySearch أسرع بكثير من البحث بالدالة IndexOf
[/INDENT]هذا و الله أعلم
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الاستفادة من بارمترات الاخراج من SQL Server داخل برنامجك ابو ليلى 1 202 20-08-16, 02:16 AM
آخر رد: الوادي
  [مقال] شرح الدالة String.Format sooriaty03 12 5,069 19-06-15, 11:53 PM
آخر رد: اسلام الكبابى
  معلومة مهمه فى المصفوفات ali.alfoly 2 800 30-08-13, 02:25 AM
آخر رد: ali.alfoly
  كيف تجعل كل شئ مستديرا داخل الفورم RaggiTech 0 708 05-10-12, 03:11 PM
آخر رد: RaggiTech
  كيف يمكننا البحث عن ملف بمحتوى معين ضمن شجرة مجلدات RaggiTech 0 557 05-10-12, 01:47 AM
آخر رد: RaggiTech
  تعلم التحكم في برنامج آخر من داخل برنامجك RaggiTech 0 557 03-10-12, 09:34 AM
آخر رد: RaggiTech
  تشغيل اكواد خاصة بحدث معين من داخل حدث اخر RaggiTech 0 251 03-10-12, 08:35 AM
آخر رد: RaggiTech
  تحويل الحروف العريية الى الأنجليزية والعكس (تطبيق خدمة جوجل لتدقيق كلمات البحث) RaggiTech 0 461 03-10-12, 07:57 AM
آخر رد: RaggiTech
  المصفوفات درس شامل (3) RaggiTech 0 484 03-10-12, 12:58 AM
آخر رد: RaggiTech
  المصفوفات درس شامل (2) RaggiTech 1 1,615 03-10-12, 12:57 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم