الفرق بين المراجعتين لصفحة: «Algorithms/Divide And Conquer»
لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 25: | سطر 25: | ||
== [[Algorithms/closest pair of points|أقرب زوج من النقاط]] == | == [[Algorithms/closest pair of points|أقرب زوج من النقاط]] == | ||
تبحث الخوارزمية عن أقرب زوج من النقاط في مجموعة من النقاط التي تنتمي إلى السطح <code>x-y</code>. يمكن حل المسألة بتعقيد زمني قدره <code>O(n^2)</code> وذلك بحساب المسافات التي تفصل بين أزواج النقاط كلها ومقارنة المسافات لمعرفة المسافة الأقصر. يمكن تقليص التعقيد الزمني إلى المقدار <code>O(nLogn)</code> باستخدام أسلوب فرِّق تسد. | تبحث الخوارزمية عن أقرب زوج من النقاط في مجموعة من النقاط التي تنتمي إلى السطح <code>x-y</code>. يمكن حل المسألة بتعقيد زمني قدره <code>O(n^2)</code> وذلك بحساب المسافات التي تفصل بين أزواج النقاط كلها ومقارنة المسافات لمعرفة المسافة الأقصر. يمكن تقليص التعقيد الزمني إلى المقدار <code>O(nLogn)</code> باستخدام أسلوب فرِّق تسد. | ||
== [[Algorithms/power x y|حساب ناتج رفع عدد إلى قوّة معينة]] == | |||
يمكن استخدام أسلوب فرِّق تسد في كتابة خوارزمية تحسب ناتج رفع عدد معين (ليكن <code>x</code>) إلى قوّة معينة (لتكن <code>y</code>)، مع افتراض أنّ قيمتي <code>x</code> و <code>y</code> صغيرتان نسبيًا ولن تتسببا في حدوث فيضان overflow. | |||
== [[Algorithms/median two equal sorted arrays|إيجاد الوسيط لمصفوفتين مرتبتين لهما الحجم نفسه]] == | |||
المطلوب في هذه الخوارزمية هو إيجاد الوسيط median للمصفوفة الناتجة عن دمج مصفوفتين مرتبتين ومتساويتين في الحجم. | |||
== [[Algorithms/longest common prefix|إيجاد البادئة المشتركة الطولى]] == | |||
تستخدم هذه الخوارزمية أسلوب فرق تسد في إيجاد البادئة المشتركة الطولى لمجموعة من السلاسل النصية. | |||
== [[Algorithms/floor sorted array|إيجاد أكبر عنصر في مصفوفة مرتبة يكون أصغر من العنصر المعطى]] == | |||
المطلوب في هذه المسألة هو إيجاد أكبر عنصر في مصفوفة مرتبة يكون أصغر من العنصر المعطى (ليكن <code>x</code>)، يسمّى هذا العنصر بأرضية العنصر <code>x</code>. | |||
== مصادر == | == مصادر == |
مراجعة 18:32، 24 ديسمبر 2019
أسلوب فرِّق تسُد هو من أساليب الخوارزميات الشائعة ويستند في عمله على التعاود recursion.
يقسِّم أسلوب فرِّق تسد المسألة إلى مسائل فرعية تشبه المسألة الأصلية، ويقدّم حلولًا للمسائل الفرعية بطريقة تعاودية، ثم يدمج حلول المسائل الفرعية وذلك لتقديم حلٍّ للمسألة الأصلية. ولمّا كان أسلوب فرِّق تسد يعمل بطريقة تعاودية، فيلزم أن تكون كل مسألة فرعية أصغر من المسألة الأصلية، ويجب أن يكون هناك حالة أساس لجميع المسائل الفرعية.
يمكن تقسيم طريقة عمل هذا الأسلوب إلى خطوات ثلاث:
- تقسيم Divide المسألة إلى عدد من المسائل الفرعية التي تكون نسخًا أصغر من المسألة الأصلية.
- التغلب Conquer على المسائل الفرعية وذلك بحلّها بطريقة تعاودية، ويمكن حل المسائل الفرعية كحالات أساسية إن كانت صغيرة بما فيه الكفاية.
- دمج Combine حلول المسائل الفرعية لتشكيل الحل النهائي للمسألة الأصلية.
أسلوب فرّق تسد مقابل البرمجة الديناميكية
يقسّم كلا الأسلوبين (فرّق تسد والبرمجة الديناميكية) المسألة المعطاة إلى مسائل فرعية لتحلّها بعد ذلك. ولكن تستخدم منهجية فرّق تسد عندما لا تجري معالجة المسألة الفرعية نفسها مرات عديدة. أما في حال تكرار المسائل الفرعية فيجب حينئذ استخدام البرمجة الديناميكية لحلّها. فعلى سبيل المثال لا تجري معالجة نفس المسائل الفرعية في خوارزمية البحث الثنائي بصورة متكررة؛ لذا تنتمي هذه الخوارزمية إلى منهج فرِّق تسد، أما خوارزمية متتالية فيبوناتشي فتعالج فيها نفس المسائل الفرعية عدة مرات؛ لذا يُفضل استخدام البرمجة الديناميكية لحلّها.
البحث الثنائي
تقارن الخوارزمية في كل خطوة العنصر المدخل x
مع قيمة العنصر الموجود في منتصف المصفوفة، وإن كانت القيمتان متطابقتين تعيد الخوارزمية موقع العنصر الموجود في منتصف المصفوفة، وإن لم تتطابق القيمتان وكانت قيمة x
أقل من قيمة العنصر الموجود في منتصف المصفوفة، تعاود الخوارزمية العمل على الجانب الأيسر من العنصر المتوسط، وإن لم تتطابق القيم تنتقل إلى الجزء الأيمن من المصفوفة.
الترتيب السريع
تختار الخوارزمية عنصرًا محوريًا، وتعيد ترتيب عناصر المصفوفة بطريقة تأخذ فيها العناصر التي تكون أصغر من العنصر المحوري الجانب الأيسر منه، والعناصر التي تكون أكبر من العنصر المحوري الجانب الأيمن. وترتب الخوارزمية في النهاية المصفوفات الفرعية بطريقة تعاودية على جانبي العنصر المحوري.
الترتيب بالدمج
تقسّم الخوارزمية المصفوفة إلى نصفين وترتبهما تعاوديًا وتدمجمها النصفين المرتبين بعضهما ببعض.
أقرب زوج من النقاط
تبحث الخوارزمية عن أقرب زوج من النقاط في مجموعة من النقاط التي تنتمي إلى السطح x-y
. يمكن حل المسألة بتعقيد زمني قدره O(n^2)
وذلك بحساب المسافات التي تفصل بين أزواج النقاط كلها ومقارنة المسافات لمعرفة المسافة الأقصر. يمكن تقليص التعقيد الزمني إلى المقدار O(nLogn)
باستخدام أسلوب فرِّق تسد.
حساب ناتج رفع عدد إلى قوّة معينة
يمكن استخدام أسلوب فرِّق تسد في كتابة خوارزمية تحسب ناتج رفع عدد معين (ليكن x
) إلى قوّة معينة (لتكن y
)، مع افتراض أنّ قيمتي x
و y
صغيرتان نسبيًا ولن تتسببا في حدوث فيضان overflow.
إيجاد الوسيط لمصفوفتين مرتبتين لهما الحجم نفسه
المطلوب في هذه الخوارزمية هو إيجاد الوسيط median للمصفوفة الناتجة عن دمج مصفوفتين مرتبتين ومتساويتين في الحجم.
إيجاد البادئة المشتركة الطولى
تستخدم هذه الخوارزمية أسلوب فرق تسد في إيجاد البادئة المشتركة الطولى لمجموعة من السلاسل النصية.
إيجاد أكبر عنصر في مصفوفة مرتبة يكون أصغر من العنصر المعطى
المطلوب في هذه المسألة هو إيجاد أكبر عنصر في مصفوفة مرتبة يكون أصغر من العنصر المعطى (ليكن x
)، يسمّى هذا العنصر بأرضية العنصر x
.
مصادر
- صفحة Divide and Conquer في توثيق الخوارزميات في موقع GeeksforGeeks.