تقييم الموضوع :
  • 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]هذا و الله أعلم
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مقارنة صورتين و الحصول علي الفرق بينهم Comparing Two Images and Get Diff Image silverlight 0 259 30-06-17, 11:33 AM
آخر رد: silverlight
  Arrays In vb.net (المصفوفات) Basil Abdallah 0 262 22-12-16, 02:17 PM
آخر رد: Basil Abdallah
  الاستفادة من بارمترات الاخراج من SQL Server داخل برنامجك ابو ليلى 1 527 20-08-16, 02:16 AM
آخر رد: الوادي
  [مقال] شرح الدالة String.Format sooriaty03 12 6,548 19-06-15, 11:53 PM
آخر رد: اسلام الكبابى
  معلومة مهمه فى المصفوفات ali.alfoly 2 1,090 30-08-13, 02:25 AM
آخر رد: ali.alfoly
  كيف تجعل كل شئ مستديرا داخل الفورم RaggiTech 0 1,036 05-10-12, 03:11 PM
آخر رد: RaggiTech
  كيف يمكننا البحث عن ملف بمحتوى معين ضمن شجرة مجلدات RaggiTech 0 673 05-10-12, 01:47 AM
آخر رد: RaggiTech
  تعلم التحكم في برنامج آخر من داخل برنامجك RaggiTech 0 738 03-10-12, 09:34 AM
آخر رد: RaggiTech
  تشغيل اكواد خاصة بحدث معين من داخل حدث اخر RaggiTech 0 531 03-10-12, 08:35 AM
آخر رد: RaggiTech
  تحويل الحروف العريية الى الأنجليزية والعكس (تطبيق خدمة جوجل لتدقيق كلمات البحث) RaggiTech 0 593 03-10-12, 07:57 AM
آخر رد: RaggiTech

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


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