بسم الله الرحمن الرحيم
كلنا يعرف ان هناك طريقتين أساسيتين للبحث عن رقم في مصفوفة معينة :
الطريقة الأولى و هي المرور على كل خانة و التأكد من احتواءها على الرقم الذي نبحث عنه و هي طريقة الى حد ما غير فعالة طبعا مع المصفوفات ذوات الحجم الكبير
الطريقة الثانية و هي البحث الثنائي و الذي يجب على المصفوفة ان تحتوي على أرقام متتابعة مثلا
كما تلاحظون المصفوفة تحتوي على أرقام في ترتيب تصاعدي ذلك أن هذا البحث يقوم على قسمة عدد الخانات الموجودة في المصفوفة على 2 و يقوم بمقارنة الرقم الذي نبحث عنه بالرقم الذي تحتويه الخانة رقم 4 (الجدول المبين أعلاه كمثال) اذا كان يساويه يرجع لنا رقم الخانة أما اذا كان أصغر منه يقوم تجاهل النصف الأعلى (من 4 الى 8) و العكس صحيح ... و هكذا الى ان يصل الى الرقم الذي نبحث عنه و هذه تعبر أسرع طريقة
لكنني اليوم جاءت على بالي فكرة لم أرها من قبل و لم أسمع عنها و أحببت ان أشارككم اياها و انا لست متأكد من كونها أسرع من البحث الثنائي .
المهم الفكرة تتلخص فيما يلي :
مثلا لدينا المصفوفة ( لنسمها مثلا S()) التي سنجري فيها البحث على الشكل التالي
و طبعا يجب على الأرقام الموجودة في المصفوفة أن يكونوا بترتيب تصاعدي (كما في البحث الثنائي)
الفكرة بكل بساطة تقوم على انشاء مصفوفة جديدة(لنسمها مثلا T()) تحتوي على معلومات المصفوفة الأصلية لكن بطريقة معكوسة هكذا :
يعني الخانة 2=1 و الخانة 5=2 و هكذا ...
و عند البحث سوف نقوم بالذهاب مباشرة الى الخانة استنادا على الرقم الذي نبحث عنه ... مثال :
اذا أراد الشخص معرفة موضع الرقم 7 في المصفوفة فسيكون الناتج هكذا :
X= T(7) = 3
اذا يتم البحث بطريقة أبسط و أسرع
لغاية الآن الأمور لازالت نظرية اذا فلننتقل للتطبيق
أنشئ فورم جديدة و ضع عليها Button & TextBox
في كود البوتن لا تكتب الآن أي شئ بل سوف نقوم أولا بأنشاء مصفوفة و هي التي سنبحث فيها و كودها تتم كتابته في منطقة الإعلانات العامة "General" و الكود كالتالي :
Dim T As Integer() = New Integer() {1, 3, 4, 5, 9, 10, 12, 13, 14, 16, 18, 19, 22, 26, 28, 29, 30, 36, 39, 41, 45, 48, 50, 54, 59, 65, 69, 74, 88}طبعا كما تلاحظ أخي العزيز اسمينا المصفوفة T() و أعطيناها عناصر جديدة و طبعا في تريتيب تصاعدي
بعد ذلك أنشئ Function جديدة و كودها كالتالي :
Private Function Search(ByVal Table As Integer(), ByVal Key As Integer) As Integer
1: Dim NewT As Integer() = New Integer(Table(Table.GetUpperBound(0))) {}
2: Dim I As Integer
3: Dim Buffer As String
4: For I = 0 To NewT.GetUpperBound(0) - 1
5: If I > Table.GetUpperBound(0) Then
6: Buffer = -1
7: Else
8: Buffer = Table(I)
9:
10: NewT(Buffer) = I
11: End If
12: Next
13: Return NewT(Key)
End Functionالآن في كود البوتن أكتب مثلا الكود التالي
MsgBox(Search(T, TextBox1.Text))
الآن الى شرح الكود
******* المصفوفة : *****
أظن أن الأمر واضح جدا بالنسبة للمصفوفة فنحن قمنا بانشاء مصفوفة جديدة و أضفنا لها عناصر جديدة
****** الفنكشن *********
السطر 1 : أنشاء المصفوفة الجديدة و تحديد بعدها الجديد و هو يساوي الرقم الأخير في المصفوفة الأصلية و في مثالنا هذا "88" و طبعا هذا واضح لأننا أخذنا بالأعتبار أن عناصر المصفوفة الأصلية ذات ترتيب تصاعدي اذا نقوم بتحديد البعد موافقا للرقم الأخير
السطر 2 و 3 : أعلان متغيرات سنحتاجها
السطر 4 : جملة تكرارية تبدأ من 0 و تنتهي عند الخانة الأخيرة في المصفوفة الجديدة NewT و ذلك من أجل المصفوفة الجديدة
السطر 5 و 6 و 7 : هنا نقوم بعمل جملة شرطية مفادها أنه اذا أصبح العداد I أكبر من عدد خانات المصفوفة الأصلية يقوم البرنامج بملأ الخانة المقابلة في المصفوفة الجديدة بالرقم -1 و هو الذي لا يوجد لدينا في المصفوفة (او يمكنك ملأها بأي شئ مثلا بحرف - لكن اذا أردت ذلك فيجب أن تغير نوع المصفوفة ال String)
السطر 8 : و ضع محتوى الخانة Table(I) في المتغير Buffer
(مثلا اذا كان العداد I يساوي 3 فالمتغير Buffer سيأخذ القيمة 5) و في السطر التالي سنعرف لماذا ;)
السطر 10 : كما قلنا . المتغير Buffer = 5 اذا ف NewT(Buffer) يساوي الخانة الخامسة و سيأخذ قيمة العداد و هي كما سبق الذكر 3 و هكذا تمت عملية عكس المصفوفة B)
السطر 13 : يقوم بارجاع محتوى الخانة رقم Key و هو الرقم الذي نبحث عنه :)
****** كود البوتن ******
أوضح منو مفيييييييييييييش
**************************
أتمنى أن تجربوا الطريقة
و أنا في أنتظار تعليقاتكم التي تهمني جدا
و السلام عليكم و رحمة الله و بركاته
