الخوارزميات Algorithms الجلسة الثالثة: الخوارزميات الجشعة (:)Greedy Algorithms يعتبر هذا النوع ذو نظر قصير لحل المشكلة ،حيث يعتمد هذا النوع من ال Algorithmsعلى الخيار الذي يظهر أنه الأفضل في كل خطوة من الحل دون النظر لأي عوامل أخرى قد تؤثر على الحل في الخطوات اللاحقة ،ويسمى هذا الخيار ( ،)Locally Optimal Stepوذلك على أمل أن نصل من خلاله لأفضل حل ( ،)Globally Optimal Solutionأي أن هذا ال Algorithmيعتمد على الخطوة القادمة فقط (الظاهرة أمامه الأفضل حاليًا فقط) على أمل الوصول بالنهاية للحل الأفضل. مزايا :Greedy يكون الحل بسيط. كتابته تكون سهلة نسبيًا مثل .Brute Force سلبيات :Greedy قد لا نصل للحل الأفضل دائ ًما ،لأن بعض المشاكل نحتاج فيها أكثر للتفكير بالخطوات المستقبلية التي قد تؤثر على نتيجة الحل ،وليس التفكير بالخطوة الحالية فقط ،أي أن ( )Locally Optimal Stepليست دائ ًما تجعلنا نصل (.)Globally Optimal Solution ******* مثال رقم ( )1على :Greedy المطلوب (المشكلة): لنفرض أننا نريد سحب مبلغ مالي من البنك ،وفئات العملات المتوفرة هي ( )50,20,10,5,1دينار، فمثلاً لو أردنا سحب مبلغ ( )29دينار يمكن سحبهم بالفئات التالية )1*50+4*10+2*1( :وبالتالي يكون عدد الأوراق ( ،)7أو بالفئات التالية ( )1*50+2*20+2*1وعدد الأوراق ( ،)5أي أن عدد الأوراق في المجموعة الثانية أقل من الأولى ،المطلوب عمل برنامج بحيث :يعطيني أقل عدد أوراق ممكن للمبلغ المسحوب. سنقوم بإدخال رقم يمثل المبلغ التي سيتم سحبها وسنرمز له بالرمز ،mوسيكون الرقم المدخل mقيمته بين 1و 111111أي ( ،)1<=m<=100000والمطلوب طباعة رقم يمثل أقل عدد ممكن من الأوراق المسحوبة. الحل: Page 1
يجب أن نأخذ بعين الاعتبار أنه لأخذ أقل عدد ممكن من الأوراق يجب أن نأخذ أكبر عدد ممكن من أكبر فئة من العملات في كل مرة ،أي إذا كان الرقم أكبر من 51فيجب أن نأخذ فئة ال 51بأكبر عدد ممكن من الأوراق في المبلغ ،ثم بعدها نبحث عن أكبر عدد ممكن من الأوراق من فئة 91من المبلغ الذي تبقى بعد احتساب المبلغ الذي ينطبق على فئة ال ،51ثم نأخذ أكبر عدد ممكن مما تبقى من المبلغ للفئة ،11وهكذا حتى ينتهي المبلغ. ******* Page 2
مثال رقم ( )2على :Greedy المطلوب (المشكلة): لنفرض أن لدينا كمية من الماء وعدد معين من الخزانات ولكل خزان سعة معينة ،ونريد توزيع كمية الماء على الخزانات بحيث نقوم بتعبئة الماء في أقل عدد ممكن من الخزانات. سنقوم بإدخال رقمين الأول الذي يمثل كمية الماء المطلوب توزيعها وسنرمز له بالرمز ،wوالرقم الثاني يمثل عدد عدد الخزانات المتوفرة وسنرمز له بالرمز nوستكون قيمتها بين 1و 11111أي ( ،)1<=n<=10000ثم بعدها سيتم إدخال مصفوفة من الأرقام تمثل سعة الخزانات التي عددها ،nوسنفترض أن كمية الماء أقل من أو تساوي سعة الخزانات أي بمعنى آخر بالتأكيد سيتم توزيع كل كمية الماء ،والمطلوب طباعة رقم يمثل أقل عدد ممكن من الخزانات التي نحتاجها لتعبئة كمية الماء. الحل :يجب أن نأخذ بعين الاعتبار أنه لأخذ أقل عدد ممكن من الخزانات يجب أن نبدأ بتعبئة أكبر خزان موجود، ثم نبحث للكمية المتبقية من الماء عن أكبر خزان بعده ،وهكذا حتى ننتهي من تعبئة كامل كمية الماء ،كما يجب أن نأخذ بعين الاعتبار أن ال arrayيجب أن تكون مرتبة من الأكبر للأصغر (لترتيب ال arrayسنستعين بمكتبة Algorithmالتي تحتوي على أمر جاهز للترتيب وهو sortوهذا الأمر يرتب ال arrayمن الأصغر للأكبر). ******* Page 3
مثال رقم ( )3على :Greedy لنفرض أن لدينا مجموعة من الأرقام السالبة والموجبة (بدون ،)1ونريد أن المطلوب (المشكلة): نأخذ أي مجموعة جزئية ( )subsetمن هذه الأرقام بحيث يكون لها أعلى ناتج ضرب ممكن ،فمثلاً لو أن لدينا الأرقام ( )3,7,-9,-5,5,-2فإننا سنأخذ ()3*7*-9*-5*5=4725لأنها تعطينا أعلى ناتج ضرب ممكن ،سنقوم بإدخال رقم يمثل عدد الأرقام التي نريدها وسنرمز له بالرمز nوستكون قيمتها بين 1و 11أي ( ،)1<=n<=18ثم بعدها سيتم إدخال الأرقام في مصفوفة aوستكون قيمتها بين -10و 11ولا تساوي 1أي (.)-10<=a[i]<=10, a[i]!=0 يجب أن نأخذ بعين الاعتبار أنه إذا كانت الأرقام موجبة فسوف نأخذها جميعا لأنها ستزيد قيمة الحل: الناتج ،أما إذا كانت الأرقام سالبة فيجب أخذها بأعداد زوجية ليصبح الناتج موجبًا أما إذا كانت فردية فسيكون الناتج سالبًا ولن يكون الجواب المطلوب ،وكذلك يجب أن يكون الرقم السالب الذي لن نأخذه هو الرقم الأقرب للصفر (بمعنى أن -2أقرب للصفر من .)-5 ******* Page 4
حيث لا يعمل :Greedy المشكلة ( )1الحقيبة :Knapsack Problemلو فرضنا أن لدينا حقيبة بسعة معينة ولدينا مجموعة من الأغراض لكل منها قيمة ووزن معين ،المطلوب تعبئة الحقيبة بالأغراض التي لها أكبر مجموع من القيمة ولا تتجاوز أوزانهم سعة الحقيبة. في الجهة ( )1من الصورة أعلاه من المنطقي أن نضع في الحقيبة ( )A,B,Dلآنها تعطي قيمة 11 والوزن ،11ولكن إذا أردنا حل المشكلة ب Greedyبأخذ الأغراض التي لها أعلى قيمة مقارنة بوزنها (أي نقسم ،)V/Wإلا أن هذه النتيجة لن تعطينا دائ ًما الحل الصحيح كما في الجهة ( )9من الصورة أعلاه ،حيث يظهر أن Bأفضل من Aولكن في الحقيقة أن الحل الأفضل هو Aوليس .B المشكلة ( :)2لو فرضنا أن لدينا سلسلة أرقام وصعوبة الانتقال من مربع لآخر هي الفرق بينهما ،ويمكننا الانتقال إما خطوة للمربع التالي مباشرة أو خطوتين للمربع يلي التالي ،والمطلوب السير من أول السلسة لآخرها وتكون الصعوبة أقل ما يمكن. في الجهة ( )1من الصورة أعلاه بطريقة Greedyالحل الانتقال من 1إلى 2مباشرة وتكون الصعوبة 1بدلاً من ،5لكن Greedyغير عملي في الجهة ( )9من الصورة أعلاه ،لأنه سينتقل من 9إلى 1ثم سيضطر للانتقال من 1إلى 5ومجموع الصعوبة سيكون ،5بينما الحل الأفضل الانتقال من 9إلى 4ثم من 4إلى 5 وتكون الصعوبة .3 ******* Page 5
الجلسة الرابعة: خوارزميات المؤشرين (:)Two Pointers يعتمد هذا النوع على مؤشرين ويستخدم عادة في ال arrayأو ما يشبه ال arrayونحتاج غالبًا أن تكون ال arrayمرتبة ،هذان المؤشران لديهما مرونة كبيرة حيث يمكن أن نضع أحدهما في البداية والآخر في النهاية أو نضع كل واحد منهما في بداية ،arrayكما يمكن نجعلهما يتحركان م ًعا أو أن يتحرك كل منهما بشكل منفصل عن الآخر بنا ًء على شرط معين. مثال رقم ( )1على ( Two Pointersلتوضيح طريقة عمله): المطلوب (المشكلة) :لو كانت لدينا arrayمرتبة تصاعديًا تحتوي على الأرقام ()1,1,2,3,5,6,8,10,11 والمطلوب أن نبحث عن رقمين فيها يكون مجموعهما x=10وإذا لم نجد يخبرني البرنامج أنه لا يوجد ،من الممكن أن نحل هذه المشكلة باستخدام Brute Forceوالمرور على كل الثنائيات الممكنة (أي نجمع أول رقم مع كل رقم في ال arrayمن بدايتها لنهايتها حتى نجد مجموع يطابق )xوذلك باستخدام loopداخل loop ( )Nested Loopsوبذلك تكون ال complexityهي ) ،O(n2كما في الكود الموجود بالصورة أدناه: ولكن يمكننا أن نستغل أن ال arrayمرتبة ونخفف ال complexityوذلك باستخدام :Two Pointers حيث سيكون لدينا مؤشرين :الأول في بداية ال arrayوالثاني في نهايتها ،وسنقوم بجمع الرقمين وفي هذه الحالة ( )1+11=12وهو رقم أكبر من الرقم المطلوب ،ومعنى ذلك أننا بحاجة لرقم أصغر ،ولأن ال arrayمرتبة فهذا يعني نعود بالمؤشر الثاني الذي في النهاية خطوة لليسار (للعنصر الذي يسبق )11وكذلك لا يزال المجموع أكبر من المطلوب ( )1+10=11ولذلك سنعود بالمؤشر الثاني خطوة أخرى لليسار ،وفي هذه الحالة أصبح المجموع أصغر من الرقم المطلوب ( )1+8=9وهذا يعني أننا أصبحنا بحاجة لرقم أكبر ،ولذلك سنحرك المؤشر الأول الذي في البداية خطوة لليمين ،ولأن الرقم الثاني في ال arrayأي ًضا 1فسيبقى المجموع أصغر من الرقم المطلوب ( )1+8=9ولذلك نحن لا زلنا بحاجة لرقم أكبر وسنحرك المؤشر الأول خطوة أخرى لليمين ،وبذلك سنكون وصلنا لمجموع يطابق الرقم المطلوب ( ،)2+8=10وبذلك سنلاحظ أن ال complexityستكون )O(n في أسوأ حالاتها (أسوأ حالة أن يستمر كلا المؤشرين بالتحرك إلى أن يلتقيا مع بعضهما). ******* Page 6
استكمال حل مشكلة المثال رقم ( )1على :Two Pointers في البداية يجب معرفة طريقة تعريف المؤشرين الذين سيؤشران على بداية ال arrayونهايتها ،فهناك أكثر من طريقة ولكن أسهل طريقة هي تعريف المؤشرين كمتغيرين من نوع intحيث سيؤشر كل منهما على ال indexفي ال ،arrayوكذلك يجب أن نحدد متى سيتوقف المؤشرين (وببساطة سيتوقفان عندما يلتقيان ،أي عندما تتساوى قيمتهما) أي أن المؤشرين سيستمران بالتحرك طالما أن المؤشر الأول أقل من المؤشر الثاني، لأنه لا يوجد معنى لأن يتعدى مؤشر مكان التقائه مع الآخر وتنعكس مواقعهما فهذا يعني أنهما سيمران على عناصر تم المرور عليها مسبقًا .سنقوم بإدخال nالذي سيمثل حجم ال arrayوسيكون بين 9و 1111أي ( ،)2<=n<=1000وكذلك سنقوم بإدخال xوهو الرقم المطلوب .سنقوم بإدخال عناصر ال ( arrayمرتبين تصاعديًا خلال الإدخال) وسنرمز لها بالرمز ،aوالمطلوب طباعة كلمة ( )yesإضافة للرقمين الذين مجموعهما يساوي xإذا وجدنا رقمين مجموعهما يساوي ،xأو كلمة ( )noإذا لم نجد أي رقمين مجموعهما يساوي .x ملاحظة :إذا أردنا إدخال عناصر المصفوفة غير مرتبة فيجب الاستعانة بمكتبة Algorithmوتطبيق الأمر sortبعد إدخال عناصر المصفوفة لترتيبها تصاعديًا ،كما في المثال رقم ( )2في .Greedy ******* Page 7
مثال رقم ( )2على :Two Pointers المطلوب (المشكلة) (:)Palindrome Palindromeهي مصطلح يطلق على الكلمة التي يمكن قراءتها بنفس الطريقة من اليمين لليسار ومن اليسار لليمين مثل ( )racecarالتي يمكن قراءتها بنفس الطريقة بالاتجاهين ،أما ( )eurekaفلا يمكن قراءتها بنفس الطريقة بالاتجاهين (.)akerue سنقوم بإدخال ( stringسلسلة أحرف /كلمة أو مجموعة كلمات) واحدة طولها بين 9و ،1111 والمطلوب تحويل ال stringالتي تم إدخالها إلى Palindromeبتغيير أقل عدد ممكن من الأحرف ،فمثلاً لو كانت الكلمة Palindromeفي الأصل فلن نغير أي حرف ،المطلوب طباعة رقم يمثل عدد الأحرف التي تم تغييرها ثم ال stringالجديدة بعد تغيير الأحرف. ملاحظة :يمكننا التعامل مع ال stringبأنه عبارة عن arrayمن الأحرف التي تش ّكل كلمة أو جملة. سنستخدم مؤشرين في البداية والنهاية ،ولكن في هذه المرة سيتم تحريكهما م ًعا في كل خطوة، الحل: في كل مرة سيتم مقارنة الحرفين الذين عليهما المؤشرين ،وإذا كانا متشابهين لا يقوم بأي تغيير وينتقل إلى التأشير إلى الحرفين التاليين وإذا كانا مختلفين سيتم تغيير حرف واحد منهما ،وسيتوقف المؤشران عندما يلتقيان مع الأخذ بعين الاعتبار أنه إذا كانت عدد حروف ال stringفردية فلن يتم تغيير الحرف الذي بالوسط مهما كان لأنه لن يؤثر على الجواب. ******* Page 8
مثال رقم ( )3على :Two Pointers المطلوب (المشكلة): لنفترض أن لدينا أشخاص موزعين على غرفتين ،ونحن نعرف أعمار جميع الأشخاص في الغرفتين، والمطلوب توزيع الأشخاص إلى مجموعات بحيث يكون في كل مجموعة شخصين (شخص من كل غرفة) بشرط أن يكون الفرق بين عمرهما أقل من ،9ولا يوجد مشكلة إذا بقي أشخاص من أي غرفة بدون مجموعات، فالمطلوب توزيع أكبر عدد ممكن من المجموعات. ستكون المدخلات رقمان nو mيمثلان عدد الأشخاص في كل غرفة ،ويكون عدد الأشخاص في كل غرفة بين 1و ،1111ثم يتم إدخال أعمار الأشخاص في كل غرفة ،والمطلوب طباعة رقم يمثل عدد المجموعات الممكن عملها. الحل: أولا يجب أن نرتب الأشخاص حسب الأعمار في كل غرفة ،ثم نضع مؤشرين الأول يؤشر على أول عنصر في ال arrayالأولى والثاني على أول عنصر في ال arrayالثانية ،ونقارن القيم التي عليها المؤشرين، إذا كان الفرق بينهما أقل من 9سنضعهم في نفس المجموعة ثم نحرك المؤشرين خطوة لليمين ،إذا كان الفرق 9 فأكثر سنحرك المؤشر الذي يؤشر على الرقم الأصغر ،وهكذا حتى يتعدى أحد المؤشرين نهاية الarray الخاصة به. Page 9
الكود: ******* Page 10
حيث لا يعمل :Two Pointers المشكلة (:)1 مثال رقم ( )1على :Two Pointersلو فرضنا أن ال arrayالتي تم إدخالها لم يتم إدخالها بترتيب تصاعدي وأدخلت الأرقام عشوائيًا (أي أن ال arrayغير مرتبة) ،عندها لن نتمكن من استخدام Algorithm ال ،Two Pointersلأننا اعتمدنا في حل المشكلة على أن المؤشر الأول يؤشر على أصغر عنصر في ال arrayوالمؤشر الثاني يؤشر على أكبر عنصر فيها وإذا أردنا أن نجعل الرقم أصغر نحرك المؤشر الثاني لليسار وإذا أردنا أن نجعل الرقم أكبر نحرك المؤشر الأول لليمين ،فإذا كانت ال arrayغير مرتبة لن نستطيع أن نضمن أن المؤشر الأول يؤشر على أصغر عنصر في ال arrayوأن المؤشر الثاني يؤشر على أكبر عنصر فيها ،لذلك لن يكون Two Pointersفعالاً في هذه الحالة. وبشكل عام نحن بحاجة دائ ًما أن يكون لدينا رؤية واضحة لطريقة تحريك المؤشرين في حل المشكلة، وإلا لن نتمكن من حل المشكاة باستخدام .Two Pointers المشكلة (:)2 لنفرض أن لدينا arrayتحتوي على أرقام موجبة وسالبة ( ،)11,6,8,-2,3,7,-9,7,-5,-3والمطلوب إيجاد ال sub arrayالتي لها أعلى مجموع ممكن ،قد يعتقد البعض أنه من الممكن وضع مؤشرين على بداية ال arrayثم البدء بجمع الأرقام وتحريك المؤشر الأول لليمين طالما كانت الأرقم موجبة ،وعند الوصول لرقم سالب نتجاوز هذا الرقم ونضع المؤشر الثاني عند أول رقم موجب بعده ونبدأ باحتساب sub arrayجديدة ،إلا أن هذه الطريقة لن تعطينا الجواب الصحيح دائ ًما لأنه من الممكن أن تحتوي ال sub arrayعلى أرقام سالبة ومع ذلك يكون لها أكبر مجموع ممكن كما في الصورة أدناه للأرقام ( )11+6+8-2+3+7=33حيث أن هذه الأرقام تعطينا أكبر مجموع ل sub arrayمن هذه ال( arrayأي أنه من الممكن وجود أدثر من sub array لأرقام موجبة وبينها أرقام سالبة إلا أن مجموعهم سيكون أكبر من أي مجموع لأي sub arrayمن الأرقام الموجبة) ،وبالتالي فإن فكرة تحريك المؤشرين على أساس الأرقام الموجبة والسالبة كانت فكرة خاطئة. ******* Page 11
الجلسة الخامسة: خوارزميات البحث الثنائي (:)Binary Search لو كان لدينا arrayونريد البحث عن رقم معين فيها فبالوضع الطبيعي أننا سنبدأ بالبحث من أول ال arrayلآخرها ،وطريقة البحث هذه تسمى ( )linear searchأو ( )sequential searchوالcomplexity له في أسوأ حالة ) ،O(nولكن لو فرضنا أننا نريد البحث عن كلمة في قاموس وهذا القاموس لا يوجد به علامات تحدد بداية كل حرف (عل ًما أن القاموس يكون دائ ًما مرتب أبجديًا) ،لو أردنا البحث بطريقة linear searchأي من البداية سيكون الوصول للكلمة بطيء وبحاجة لوقت طويل ،والحل الأفضل أن نفتح القاموس من منتصفه ونشاهد الحرف الذي فتحنا عليه ،فإذا كان الحرف الذي تبدأ به الكلمة من الحروف التي في الجزء الذي قبل المنتصف نهمل الجزء الذي بعده وإذا كانت في الجزء الذي بعد المنتصف نهمل الجزء الذي قبله ،أي لو فرضنا أن الكلمة التي نبحث عنها تبدأ بالحرف Hوفتحنا القاموس على حرف Mسنعلم أن الكلمة في الجزء الذي قبل Mولذلك سنهمل الجزء الذي بعد Mمن القاموس وسنعيد نفس الخطوات على النصف الأول من القاموس ،أي أننا سوف نعتبر أن القاموس هو الأحرف من Aإلى Mوسنفتح الجزء الذي قبل Mمن منتصفه ونتأكد من مكان الحرف ،Hأي أننا في كل مرة سوف نقسم المجموعة إلى نصفين ونهمل النصف الذي تأكدنا أن الجواب ليس به ثم نقسم النصف المتبقي إلى نصفين حتى نصل للحل. أي أن Binary Searchيعتمد أولاً على أن تكون البيانات مرتبة ،ويعتمد على أنه في كل مرة سنقوم بتقسيم المنطقة التي نبحث فيها إلى قسمين حتى نصل للحل ،ولذلك سمي ( Binary Searchالبحث الثنائي). إي أننا لو فرضنا أن عدد العناصر nفإن ال complexityلل Binary Searchهي عدد المرات التي سنقسم فيها nقبل أن تصبح )n/2( 1ولنعبر عن هذا الرقم نستخدم اللوغاريثم أي أن ال complexityهي )O(log n واللوغاريثم يجعل ال complexityأصغر بكثير ،أي أن ).O(log n)<O(n ******* Page 12
مثال رقم ( )1على :Binary Search المطلوب (المشكلة): هو أبسط مثال على Binary Searchوهو البحث عن رقم معين في arrayمرتبة وإذا وجدناه نطبع ال indexالخاص به وإذا لم نجده نطبع أنه غير موجود. المدخلات ستكون nوهو حجم ال arrayوستكون بين 1و ،100000وكذلك xوهو الرقم الذي نريد البحث عنه ،ثم بعدها يتم إدخال عناصر ال arrayمرتبة تصاعديًا (إذا لم يتم إدخالها مرتبة فيجب الاستعانة ب sortلترتيبها ،لأن Binary Searchإلا إذا كانت ال arrayمرتبة) ،والمطلوب طباعة ال indexللرقم إذا وجدناه و( (1-إذا لم نجده. الحل: في البداية سنقوم بتعريف المتغيرات ونقوم بإدخال القيم ،بعد ذلك سنحتاج لتعريف متغير من نوع bool سنسميه foundلنعرف من خلاله أننا وجدنا الرقم أم لم نجده وستكون قيمته في البداية ،falseبعد ذلك سنبدأ بجزء Binary Searchالذي يشبه طريقة المؤشرين ولكن سيكون لدينا 3مؤشرات( :الأول leftفي أقصى اليسار وستكون قيمته ،1والثاني rightفي أقصى اليمين وستكون قيمته ،n-1والثالث midالذي سيكون بين leftو rightوقيمته هي التي سنتأكد منها لنعرف الجزء الذي سنبحث فيه في الخطوة التالية وهو الذي سنقسم فيه ال arrayإلى جزأين في كل مرة ولن نضع له قيمة في البداية لأننا سنحسبه في كل مرة). داخل ال loopسنحسب أولاً قيمة midالتي ستكون عبارة عن المعدل بين leftو rightأي ( ،)mid=(left+right)/2ثم سنقارن العنصر الذي يؤشر عليه )a[mid]( midمع الرقم xوإذا كان يساويه فهذا يعني أننا وجدنا xفسنغير حالة foundإلى trueونخرج من ال ،loopإذا لم يكن كذلك فهذا يعني أن الرقم الذي يؤشر عليه midإما أصغر من xوبالتالي سنبحث بالجزء الذي على يمين midأو أكبر من xوسنبحث بالجزء الذي على يسار ،midلو فرضنا أن قيمة x=7مثلاً فهذا يعني أن xأصغر من الذي يؤشر عليه mid ولذلك سنهمل النصف الأيمن من ال arrayونجعل نهاية البحث هو ال indexالذي يسبق midأي ( )right=mid-1ولو كان xأكبر من الرقم الذي يؤشر عليه midسنهمل النصف الأيسر ونجعل بداية البحث ال indexالذي يلي midأي ( ،)left=mid+1والآن أصبح البحث في أحد جزأي ال arrayأي قسمناها لنصفين وأخذنا النصف الذي يهمنا فقط أي أصبحنا نبحث في arrayأصغر. وسنستمر بهذه الطريقة حتى نجد الرقم أو نتأكد أننا ليس لدينا إلا عنصر واحد في ال ،arrayوهذا يعني أن left=right=midولم نجد الرقم الذي يساوي ،xأي أن شرط الخروج من ال loopسيكون أن left أصبحت أكبر من rightوهذا يعني المؤشر الأيسر تجاوز المؤشر الأيمن دون العثور على الرقم. Page 13
الكود: ******* Page 14
مثال رقم ( )2على :Binary Search المطلوب (المشكلة) :لنفرض أن لدينا arrayمرتبة بحيث تكون تصاعدية في البداية ثم بعدها تنازلية ،مثلاً بهذا الشكل ( ،)10,12,15,19,17,9والمطلوب إيجاد أكبر عنصر في ال arrayباستخدام .Binary Search المدخلات ستكون nوهو حجم ال arrayوستكون بين 3و ،1000ثم بعدها يتم إدخال عناصر ال ،arrayوالمطلوب طباعة أكبر رقم في ال arrayباستخدام .Binary Search ستكون الطريقة شبيهة بالطريقة التي كانت في المثال رقم ( )1على ،Binary Searchولكن الحل: في هذه المرة بدلاً من أن نقارن midمع xسنقارن midمع الرقم الذي قبله والرقم الذي بعده (إذا كان الذي قبله والذي بعده أصغر منه فهذا يعني أنه أكبر عنصر في المجموعة ،وإذا كان أحدهما أكبر فسوف نتحرك تجاه الرقم الأكبر). ******* Page 15
Search
Read the Text Version
- 1 - 15
Pages: