المقدمة
أبسطلها البحث عن عدد في مصفوفة تحددة الحجم و يزداد الأمر تعقيدا عند الانتقال إلى البحث عن
كلمة داخل نص, تماما كما ترى في محررات النصوص العادية والتي تحتوي على خاصية 8 1118
1801866 حيث أن أُغلب المحررات الخالية تستخدم خوارزميه بحث تسمى 1301617-1/106016
محركات البحث و القواميس و المتصفحات التي تستخدم هذه الخوارزمية عند كتابتك لموقع بيدا جرف
لا تقتصر خوارزمية البحث على ما ذكرناه آنفا, فهناك نوع آخر من الخوارزبيات يُستخدم لإيجاد نص
قريب من النص الذي كنت تبحث عنه, حيث تقوم الموارزمية بالبحث عن 4 أو 5 كلمات قرية من
الكلمات الخاطعة, تماما كما يفعل ©ل008© عند الترجمة أو 157018 08566 عند كتابة نص
يجتوي على أخطاء إملائية و تعتمد أغلب هذه الخوارزميات على الوزن الصوي للحرف و من أشهرها
ليس هذا فقطء فمضادات الفيروسات تستخدم خوارزميات بحث سريعة للبحث عن وجود توقيع مطابق
لأحد بيانات الملف المراد فحصه؛ وما أن قواعد بيانات التواقيع تكون ضخمة للغاية فالبحث عن كل
توقيع سيكون بطيئا جدا وهناك الأفضل؛ حيث توجد خوارزميات بإمكانها البحث عن عده تواقيع في
نفس اللحظة وتستخدم بنية شجرية للقيام بهذا الأمر» هناك أيضا خوارزميات أخرى تعتمد على مفاهيم
متلفة مثل 1816 118803 وعدة أمور أخرى؛ و يُسمى هذا النوع من الموارزميات ب عامتئلن1
تستخدم مثل هذه الخوارزنيات مل تتقسماك .
الهدف : البحث عن قيمة المفتاح 1687 داخل المصفوفة ك2
حيث يبدا البحث من أول عنصر إلى أن تتهي المصفوفة, و في كل مرة نقارن محتوى الانة الحالية
ة المتغير 1
الذي يُثْل مكان وجود للفتاح 1567 في المصفوفة كدر أما إذا كانت القيمتان متلفتان تستتقل إلى
[3] 2 مع المفتاح زعك1, فإذاكانت القيمتان متساويتان ((©ج1 - [1] م سم إعاد
المنمادة ستكون 1-.
2 - الخوارزمية بلغة السي++
مل الخانة الحالنية مساوية للمفتاج ؟//(329 << [12)1]1 4
إعادة رقم الغانة التي يوجد بها المفتاع//رة لصغتاء»#
الدالة د[ع:111168:568 تستقبل 3 وسائط, الأول هو اسم المصفونة المراد البحث داخلها و الوسيظ
الثاني هو طول المصفوفة أما الوسيط الثالث فهو المفتاح الذي نبحث عنه. بكل بساطة قمنا باستخدام
حلقة 0] للمرور على جميع عناصر المصفوفة (لاحظ أن البحث خطي) واضعين بذلك شرط الحلقة
إذا كانت قيمة الخانة الحالية مّساوية لقيمة المفتاح فقم بإعادة رقم الخانة. (مفهوم إعادة
بالخروج من الدالة)
طيب ماذا عن الحالة العكسية 9 أقصد إذا كان المفتاح غير موحود في المصفوفة ؟ هنا تأتي فائدة إعادة 1-.
يمُكنك إبدال 1- بأي عدد سالب تماما, المهم أن لا يكون موجبا أو معدوما حتى لا يقع التباس بين
القيمة التي تدل على عدم وجود المفتاح و رقم الخانة التي يوجد بها الأخير.
في البداية قمنا بالإعلان عن مصفوفة باسم 1 عدد عناصرها 5 ثم قمنا أيضا بالإعلان عن متغير
باسم عت[ حيث طلبنا من للستخدم إدخال قيمة للمتغير. لنتقل إلى الجزء الأهم في ال 1228012 و هو
تطبيق الدالة 1111681568213 على المصفوفة 361124 و المتغير لزعع1 :
تم الإعلان عن متغير جديد باسم 0118] الدْءٍ
يحوي القيمة الممادة من طرف الدالة. بعد ذلك قمنا
بفحص قيمة 011318 فإذا كانت قيمته مساوية ل 1- فهذا يعني أن المفتاح غير موحود في المصفوئة و
إلا فالمفتاح موحود في الخانة رقم 011110+1] لأن الترقيم يبدا من صفر فالخانة رقم 0 هي الخانة الأول
الذاكرة و قد يتوقتف برناحك. يمكنك إرسال عدد أصغر من طول المصفوفة إذا كنت ترغب في أن
يقتصر البحث على جزء من المصقوة
إذا يُحد المفتاح أكثر من مرة في المصفوفة غ3 فإن الدالة ستعيد رقم أول خانة يظهر فيها المفتاح.عليك
الآن بتغيير الدالة لتعيد رقم آخر خانة يُوجد بمنا المفتاح.
و سيتم البحث داخل مصفوفة جزئية من المصفوفة الرئيسية. إذا كل ما ستقوم به هو إضافة متغير جديد
إلى جسم الدالة (أو لنقل عداد) و زيادة هذا العداد كلما وحدنا خانة مساوية للمفتاح هكذا :
في هذه الحالة ستستقبل الدالة أربع وسائط هي : اسم المصفوفة الجزئية و من أين تبدأ و أين تتهي ؟
كالعادة نبداً بالمرور على جميع عناصر المصفوثة و كل ما وحدنا خانة مُساوية للمفتاح أضفنا 1 إلى
قيمة العداد. عند نحاية الحلقة, إذا كانت قيمة العداد أكبر أو تساوي واحد إن لمفتاح يوحد على الأقل
مرة واحدة داخل المصفوفة و هنا ستتم إعادة قيمة المتغير 1013118 و في حالة المكس سجم إعادة 1-.
في الدالة الرئيسية قمنا بالإعلان عن مصفوفة تحتوي على 18 عنصر بينما قمنا بالبحث عن القيمة 17
داخل مصفوفة جزئية تتكون من 6 عناصر فقط (المصفوفة الجزئية تبداً من الخانة السادسة و حتى الثانية
عشر). برأيك ما نخرحات البرنامج ؟
3 - العقيد الرسي
الزمن المستغرق لتنفيذ هذه الخوارزمية يزيد كلما زاد حجم المصفوفة), إذا خوارزمية البحث الخطي لما
تعقيد زبي (000 - 1 (10.
في أفضل الحالات يمكن أن نجد المفتاح في أول خانة ([0)1 < 1 < (100 , و في الموسط
د -2- (70 و في أسوء الخالات يمكن أن نحد لمفتاح في الخانة الأخيرة كما يمكن أن
يكون هذا الأخير غير موجود.
كمثال للتوضيح لتفترض الحدول الآتي :
يوجد المفتاح في الخانة ذات اللون الأبيض و الخلفية السوداء و في كل مرة تنم مقارنة الخانة ذات اللون
الأحمر و الخلفية البيضاء مع المفتاح. لاحظ أنه من خلال البحث عن للفتاح تم تشكيل قطر لثلث
ي تبدأ بأول عنصر و تتتهي بالمفتاح.
4 - ملأ مصفوفة عشوائيا و اختبار سرعة الخوارزمية
قمت بإدراج هذه الفقرة لكي ألفت انتباهك أخي القارئ إلى مفهوم التعقيد الزمني من الناحية العملية.
المصفوفة بشكل عشوائي و من ثم نستدعي دالة البحث للبحث عن المفتاح.
بكل بساطة, توجد حالتان, إما أن يكون المفتاح غير موجود داخل المصفوفة أو العكس. الحالة الأول
تُخل أسواً حالات الخوارزمية أما الحالة الثانية فقد ممثل أفضل الحالات أو الالة المخوسطة. ما يهمنا في
هذه الفقرة هو عدد الخانات البي مرت بها الدالة قبل الوصول إلى المفتاح أو لنقل عدد للقارنات اللازمة
إذا لم يتم العثور على المفتاح فهذا يعني أن عدد للقارنات يساوي عدد عناصر المصفوفة أما إذا تم العثور
على المفتاح فهذا يعني أن عدد المقارنات يساوي رقم الخانة التي يوجد بها المفتاح + 1 لأن ترقيم عناصر
المي و
تكرار الأعداد العشوائية الممولدة يحتمد على عدة عوامل منها سعة محال الذي تم توليد الأعداد
ل سبق و أن كتبتُ موضوع يتحدث عن توليد الأعداد العشوائية بشيء من التفصيل, يمكنك
قد يدور في ذهتك السؤال التالي : هل نستطيع رصد الوقت الذي تستغرقه هذه الخوارزمية ؟
لكن ولسوء الحظ فإن هذه الدوال تعتمد بشكل كامل على النظام و خصوصا المعالج المكزي. يجب أن
يدعم النظام ما يسمى ب عداد الأداء عالي الدقة (تعنسية6 عمصمصصظ» 2 «منسامه 2 طونج
الغرض :
الدالة الأول هي لزعتعنو1>»15:6:هد:0<» 01:17 حيث تعطينا ترد العداد أو لنقل عدد الدورات
في الثانية الواحدة و تعيد صفاً إذا كان النظام لا يدعم العداد العالي الدقة. أما الدالة الثانية فهي
تنفيذ جزم معين من الكود و ذلك بامتذعاء الدالة «عتسصنه6 سمط بعد مباشرة قبل
الجزء الذي نريد تقييم مدته الزمنية ثم استدعائها مرة أخرى مباشرة بعده؛ ثم نحسب الفرق و تقسمه على
التودد فتحصل على الوقت الذي استفرقه تنفيذ ذلك الجزء من الكود. لنفرض مثلاً أن التردد كان
هي 3500, الفرق هو 2000؛ و بالقسمة على 50000 نحصل على 0.04 ثانية.
يمكنك أيضا استخدام م667 عدسيةة أو «ه©ا»ة67© إذا أردت معرفة النوقيت ب
يمكنك بحذه الإجراءات قياس الفروق الزمنية بدقة ميللي ثانية واحدة على الأكثر» وهذه الدقة قد تكون
كافية لقياس عمل الخوارزمية التي نتحدث عنها. بهذه الطريقة ستريح نفسك من الصداع الذي تسيبه
لك المؤقنات الأخرى مثل 976 و©11215. لموتت ©0126 يستخدم ما يحلو له في الجهاز
ليقدم أكبر دقة ممكنة. قد يعتمد في بعض الأجهزة على تعليمات مباشرة لا 3105 ون بعض
الحالات قد يقرأ القيم من أماكن أخرى غريبة. لذا ليست له وحدة ثابتة تستطيع استخدامهاء فعتدما
! قد تكون
تنادي الدالة #منسدمع» صمصطا»» وه :© ستستقبل قيمة .. الله أعلم ماذا تعني
الدورة هي معدل نبض ساعة المعالج 1086© :0::ع» 2:0 وقد تعني
إلى شيء ما يساعدك على تحويل هذه القيمة إلى وحدة زمنية كالثواني, وهنا تأقي الإجراء فائدة الدالة
لعمعسوعظلعصصطن ارت حيث تعيد عدد "الوحدات" في اثانية الواحدة.
مثلاً ٠ أعتنا لومسعوع »بخص :© القيمة 15000000 (15 مليون وحدة في
متباعدتين وطرحنا الفرق لتحصل على 45000000. الآن يمكننا أن نقسم هذه القيمة على التردد
في تزمين الصوت مع الصورة في مشغلات الأفلام كما يُستخدم في قياس الزمن المستفرق لتنفيذ
إلا أن هناك بعض الأمور التي تمنع 226 من أن يكون مؤقتاً مثاليا, تتخلص هذه الأمور في +
تعدد المعاللمات؛ والمعالمات التي تغير سرعتها بشكل مستمر. في حالة تعدد المعالهات؛ لو اعتمد
7 على عداد التعليمات في للعالج (وهي الحالة الأكثر شيوعاً) فإنك قد تحصل على نتائج غرية
بين النداءات المختلفة للإجراء» وذلك بحسب أي المعالحات قا المعالج الأول أنخز
نتائج مضحكة ! كأن يعود الزمن إلى الوواء ( يكون الفرق سالبا ) أو يقفز قفزات كبيرة مفاجئة
في الحالة الثانية فإن بعض المعالحات تغير سرعتها بشكل مستمر على حسب الطاقة المنوفرة» وهذه
المعاغات تتواجد بشكل رئيسي في الأجهزة المحمولة 181005 حيث يخفف المعالج من سرعته عتلما
يدخل في نظام توفير طاقة البطارية.. وهنا فإن قيمة التردد الي حسبناها مسبقاً تصبح خاطكة لأن
التردد قد تغير ويجب قراءته مرة أخرئ ...!
6 - اخبر قدراتك !
في إظهار رسا ترحينة بالإضافة ول لرتب الشهري الماعل و إلا طهر الرنامج ربلل نيد بأن: هلا العامل غير مسجل