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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [VB.NET] الاضافه مباشره من داخل GridControl loay775 0 24 31-03-24, 01:06 AM
آخر رد: loay775
  كود عرص ملف الوورد داخل أدات WebBrowser alsaab120 1 1,086 26-03-23, 02:57 PM
آخر رد: sanyor77
  معالجة التنبيهات في البرامج (استقبال تنبيهات داخل البرنامج) Dev Express ابو ليلى 9 9,284 10-02-22, 09:55 PM
آخر رد: عبدالحميد حسني
Photo كيفية اطهار جدول داخل الأخر alsouf 3 4,474 21-11-20, 09:15 AM
آخر رد: Anas Mahmoud
  الفرق بين تاريخين بدقه وبدون مشاكل (عدد الايام ممتاز) ali.alfoly 1 2,176 17-12-18, 07:39 PM
آخر رد: elgokr
  الفرق بين الأصناف Classes و الكائنات Objects RaggiTech 1 8,083 28-03-18, 10:30 PM
آخر رد: alsouf
  مقارنة صورتين و الحصول علي الفرق بينهم Comparing Two Images and Get Diff Image silverlight 0 4,899 30-06-17, 11:33 AM
آخر رد: silverlight
  Arrays In vb.net (المصفوفات) Basil Abdallah 0 3,636 22-12-16, 02:17 PM
آخر رد: Basil Abdallah
  الاستفادة من بارمترات الاخراج من SQL Server داخل برنامجك ابو ليلى 1 3,298 20-08-16, 02:16 AM
آخر رد: الوادي
  [مقال] شرح الدالة String.Format sooriaty03 12 17,826 19-06-15, 11:53 PM
آخر رد: اسلام الكبابى

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


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