خوارزمية فرق تسد
في علم الحاسوب ، يُشير مصطلح "فرق تسد" ، الذي كان في الأصل مبدأً سياسياً ، إلى نموذج تصميم خوارزمي . تقوم خوارزمية "فرق تسد" بتقسيم المشكلة بشكل متكرر إلى مشكلتين فرعيتين أو أكثر من النوع نفسه أو من نوع مشابه، حتى تصبح هذه المشكلات بسيطة بما يكفي لحلها مباشرة. ثم تُدمج حلول المشكلات الفرعية للحصول على حل للمشكلة الأصلية.
تُعدّ تقنية فرق تسد أساسًا للخوارزميات الفعّالة للعديد من المشكلات، مثل الفرز (مثل الفرز السريع ، والفرز بالدمج )، وضرب الأعداد الكبيرة (مثل خوارزمية كاراتسوبا )، وإيجاد أقرب زوج من النقاط ، والتحليل النحوي (مثل المحللات النحوية من أعلى إلى أسفل )، وحلّ مسائل SAT ، [ 1 ] وحساب تحويل فورييه المنفصل ( FFT ). [ 2 ]
قد يكون تصميم خوارزميات فرق تسد فعّالة أمرًا صعبًا. وكما هو الحال في الاستقراء الرياضي ، غالبًا ما يكون من الضروري تعميم المسألة لجعلها قابلة للحل التكراري . وعادةً ما يتم إثبات صحة خوارزمية فرق تسد بالاستقراء الرياضي، ويتم تحديد تكلفتها الحسابية غالبًا عن طريق حل العلاقات التكرارية .
فرق تسد

يُستخدم نموذج فرق تسد غالبًا لإيجاد الحل الأمثل للمشكلة. وتتلخص فكرته الأساسية في تقسيم المشكلة المعطاة إلى مشكلتين فرعيتين أو أكثر متشابهتين، ولكن أبسط، ثم حل كل منهما على حدة، ودمج حلولهما لحل المشكلة الأصلية. تُحل المشكلات البسيطة نسبيًا مباشرةً. على سبيل المثال، لترتيب قائمة معينة من n عددًا طبيعيًا ، تُقسم إلى قائمتين تحتوي كل منهما على n /2 عددًا تقريبًا، ثم تُرتب كل قائمة على حدة، ويُدمج الناتجان معًا بشكل مناسب للحصول على النسخة المرتبة من القائمة المعطاة (انظر الصورة). يُعرف هذا الأسلوب بخوارزمية فرز الدمج .
يُطلق مصطلح "فرق تسد" أحيانًا على الخوارزميات التي تُختزل كل مشكلة إلى مشكلة فرعية واحدة فقط، مثل خوارزمية البحث الثنائي لإيجاد سجل في قائمة مُرتبة (أو ما يُماثلها في الحوسبة العددية ، خوارزمية التنصيف لإيجاد الجذر ). [ 3 ] يمكن تنفيذ هذه الخوارزميات بكفاءة أعلى من خوارزميات "فرق تسد" العامة؛ وعلى وجه الخصوص، إذا استخدمت الاستدعاء الذاتي الذيل ، فيمكن تحويلها إلى حلقات بسيطة . مع ذلك، ووفقًا لهذا التعريف الواسع، يُمكن اعتبار أي خوارزمية تستخدم الاستدعاء الذاتي أو الحلقات "خوارزمية فرق تسد". لذلك، يرى بعض الباحثين أنه ينبغي استخدام مصطلح "فرق تسد" فقط عندما تُنتج كل مشكلة مشكلتين فرعيتين أو أكثر. [ 4 ] وقد اقتُرح مصطلح " الاختزال والتغلب " بدلاً من ذلك لفئة المشكلة الفرعية الواحدة. [ 5 ]
يُعد أحد التطبيقات المهمة لأسلوب فرق تسد هو التحسين، حيث إذا تم تقليل مساحة البحث ("تقليمها") بعامل ثابت في كل خطوة، فإن الخوارزمية الكلية لها نفس التعقيد التقاربي لخطوة التقليم، مع اعتماد الثابت على عامل التقليم (عن طريق جمع السلسلة الهندسية )؛ وهذا ما يُعرف بالتقليم والبحث .
أمثلة تاريخية مبكرة
تتمثل الأمثلة المبكرة لهذه الخوارزميات في المقام الأول في خوارزمية التناقص والتغلب - حيث يتم تقسيم المشكلة الأصلية تباعاً إلى مشاكل فرعية فردية ، ويمكن حلها بالفعل بشكل تكراري.
تتمتع خوارزمية البحث الثنائي ، وهي خوارزمية تعتمد على مبدأ "التناقص والتغلب" حيث تكون المسائل الفرعية أصغر بنحو النصف من المسائل الأصلية، بتاريخ طويل. ورغم ظهور وصف واضح لهذه الخوارزمية على الحواسيب عام 1946 في مقال لجون موشلي ، فإن فكرة استخدام قائمة مرتبة من العناصر لتسهيل البحث تعود على الأقل إلى بابل عام 200 قبل الميلاد. [ 6 ] ومن الخوارزميات القديمة الأخرى التي تعتمد على مبدأ "التناقص والتغلب" خوارزمية إقليدس لحساب القاسم المشترك الأكبر لعددين عن طريق اختزالهما إلى مسائل فرعية أصغر فأصغر، ويعود تاريخها إلى عدة قرون قبل الميلاد.
An early example of a divide-and-conquer algorithm with multiple subproblems is Gauss's 1805 description of what is now called the Cooley–Tukey fast Fourier transform (FFT) algorithm,[7] although he did not analyze its operation count quantitatively, and FFTs did not become widespread until they were rediscovered over a century later.
An early two-subproblem D&C algorithm that was specifically developed for computers and properly analyzed is the merge sort algorithm, invented by John von Neumann in 1945.[8]
Another notable example is the algorithm invented by Anatolii A. Karatsuba in 1960[9] that could multiply two n-digit numbers in operations (in Big O notation). This algorithm disproved Andrey Kolmogorov's 1956 conjecture that operations would be required for that task.
As another example of a divide-and-conquer algorithm that did not originally involve computers, Donald Knuth gives the method a post office typically uses to route mail: letters are sorted into separate bags for different geographical areas, each of these bags is itself sorted into batches for smaller sub-regions, and so on until they are delivered.[6] This is related to a radix sort, described for punch-card sorting machines as early as 1929.[6]
Advantages
Solving difficult problems
Divide and conquer is a powerful tool for solving conceptually difficult problems: all it requires is a way of breaking the problem into sub-problems, of solving the trivial cases, and of combining sub-problems to the original problem. Similarly, decrease and conquer only requires reducing the problem to a single smaller problem, such as the classic Tower of Hanoi puzzle, which reduces moving a tower of height to move a tower of height .
Algorithm efficiency
The divide-and-conquer paradigm often helps in the discovery of efficient algorithms. It was the key, for example, to Karatsuba's fast multiplication method, the quicksort and mergesort algorithms, the Strassen algorithm for matrix multiplication, and fast Fourier transforms.
في جميع هذه الأمثلة، أدى أسلوب D&C إلى تحسين التكلفة التقاربية للحل. على سبيل المثال، إذا كانت (أ) الحالات الأساسية ذات حجم ثابت ومحدود، فإن جهد تقسيم المسألة ودمج الحلول الجزئية يتناسب طرديًا مع حجم المسألة.و(ب) يوجد عدد محدودمن المشكلات الفرعية ذات الحجم ~في كل مرحلة، ستكون تكلفة خوارزمية فرق تسد.
بالنسبة لأنواع أخرى من أساليب فرق تسد، يمكن تعميم أوقات التشغيل أيضًا. على سبيل المثال، عندما يستغرق (أ) عمل تقسيم المشكلة ودمج الحلول الجزئيةالوقت، أينحجم الإدخال وب) عندما يكون ثابتًا ما؛ ب) عندما، يستغرق تنفيذ الخوارزمية وقتًا محدودًا بـج) هناكمسائل فرعية حيث يكون حجم كل مسألة فرعية ~ثم، تكون أوقات التشغيل كما يلي:
- إذا كان عدد المسائل الفرعيةإذاً، فإن وقت تشغيل خوارزمية فرق تسد يكون محدوداً بـ.
- إذا كان عدد المسائل الفرعية واحدًا بالضبط، فإن وقت تشغيل خوارزمية فرق تسد يكون محدودًا بـ[ 10 ]
أما إذا استغرق الأمر بدلاً من ذلك عملية تقسيم المشكلة ودمج الحلول الجزئيةالوقت، وهناك مشكلتان فرعيتان لكل منهما حجمإذاً، فإن وقت تشغيل خوارزمية فرق تسد يكون محدوداً بـ[ 10 ]
التوازي
تُعد خوارزميات فرق تسد مناسبة بشكل طبيعي للتنفيذ في أجهزة متعددة المعالجات ، وخاصة أنظمة الذاكرة المشتركة حيث لا يلزم التخطيط المسبق لتوصيل البيانات بين المعالجات لأنه يمكن تنفيذ المشكلات الفرعية المتميزة على معالجات مختلفة.
الوصول إلى الذاكرة
تميل خوارزميات فرق تسد بطبيعتها إلى الاستخدام الأمثل لذاكرة التخزين المؤقت . والسبب هو أنه بمجرد أن تصبح المسألة الفرعية صغيرة بما يكفي، يمكن، من حيث المبدأ، حلها وجميع مسائلها الفرعية داخل ذاكرة التخزين المؤقت ، دون الحاجة إلى الوصول إلى الذاكرة الرئيسية الأبطأ . تُسمى الخوارزمية المصممة لاستغلال ذاكرة التخزين المؤقت بهذه الطريقة " خوارزمية غير معتمدة على ذاكرة التخزين المؤقت" ، لأنها لا تتضمن حجم ذاكرة التخزين المؤقت كمعامل صريح . [ 11 ] علاوة على ذلك، يمكن تصميم خوارزميات فرق تسد للخوارزميات المهمة (مثل الفرز، وتحويل فورييه السريع، وضرب المصفوفات) لتكون خوارزميات مثالية غير معتمدة على ذاكرة التخزين المؤقت - فهي تستخدم ذاكرة التخزين المؤقت بطريقة مثالية على الأرجح، بمعنى تقاربي، بغض النظر عن حجم ذاكرة التخزين المؤقت. في المقابل، فإن النهج التقليدي لاستغلال ذاكرة التخزين المؤقت هو الحجب ، كما هو الحال في تحسين تداخل الحلقات ، حيث يتم تقسيم المسألة صراحةً إلى أجزاء ذات حجم مناسب - وهذا أيضًا يمكن أن يستخدم ذاكرة التخزين المؤقت على النحو الأمثل، ولكن فقط عندما يتم ضبط الخوارزمية لأحجام ذاكرة التخزين المؤقت المحددة لجهاز معين.
توجد نفس الميزة فيما يتعلق بأنظمة التخزين الهرمية الأخرى، مثل NUMA أو الذاكرة الافتراضية ، وكذلك بالنسبة لمستويات متعددة من ذاكرة التخزين المؤقت: بمجرد أن تصبح المشكلة الفرعية صغيرة بما يكفي، يمكن حلها ضمن مستوى معين من التسلسل الهرمي، دون الوصول إلى المستويات الأعلى (الأبطأ).
التحكم في التقريب
في العمليات الحسابية التي تتضمن تقريبًا، كالأعداد العشرية ، قد تُعطي خوارزمية فرق تسد نتائج أكثر دقة من طريقة تكرارية تبدو مكافئة لها ظاهريًا. على سبيل المثال، يمكن جمع N عددًا إما بحلقة بسيطة تُضيف كل قيمة إلى متغير واحد، أو بخوارزمية فرق تسد تُسمى الجمع الثنائي ، والتي تُقسّم مجموعة البيانات إلى نصفين، وتحسب مجموع كل نصف بشكل تكراري، ثم تجمع المجموعين. مع أن الطريقة الثانية تُجري نفس عدد عمليات الجمع التي تُجريها الأولى وتتحمل عبء الاستدعاءات التكرارية، إلا أنها عادةً ما تكون أكثر دقة. [ 12 ]
مشاكل التنفيذ
التكرار
تُنفَّذ خوارزميات فرق تسد بشكل طبيعي كإجراءات تكرارية . في هذه الحالة، تُخزَّن المسائل الفرعية الجزئية المؤدية إلى المسألة قيد الحل حاليًا تلقائيًا في مكدس استدعاءات الإجراءات . الدالة التكرارية هي دالة تستدعي نفسها ضمن تعريفها.
مكدس صريح
يمكن أيضًا تنفيذ خوارزميات فرق تسد بواسطة برنامج غير تكراري يخزن المسائل الفرعية الجزئية في بنية بيانات محددة، مثل مكدس أو طابور أو طابور أولوية . يتيح هذا الأسلوب مزيدًا من الحرية في اختيار المسألة الفرعية المراد حلها لاحقًا، وهي ميزة مهمة في بعض التطبيقات، مثل التكرار العرضي أولًا وطريقة التفرع والتقييد لتحسين الدوال. كما يُعد هذا الأسلوب الحل القياسي في لغات البرمجة التي لا تدعم الإجراءات التكرارية.
حجم الرزمة
في التطبيقات التكرارية لخوارزميات البحث والإنشاء، يجب التأكد من وجود ذاكرة كافية مخصصة لمكدس التكرار، وإلا فقد يفشل التنفيذ بسبب تجاوز سعة المكدس . تتميز خوارزميات البحث والإنشاء الموفرة للوقت عادةً بعمق تكرار صغير نسبيًا. على سبيل المثال، يمكن تنفيذ خوارزمية الفرز السريع بحيث لا تتطلب أبدًا أكثر مناستدعاءات متكررة متداخلة للفرزأغراض.
قد يكون منع تجاوز سعة المكدس صعبًا عند استخدام الإجراءات التكرارية، نظرًا لأن العديد من المترجمات تتعامل مع مكدس التكرار ككتلة متصلة من الذاكرة، وبعضها يحجز له مساحة ثابتة. إضافةً إلى ذلك، قد تخزن المترجمات معلومات أكثر مما هو مطلوب في مكدس التكرار، بما في ذلك عنوان الإرجاع، والمعاملات غير المتغيرة، والمتغيرات المحلية للإجراء. ونتيجةً لذلك، يمكن تقليل احتمالية تجاوز سعة المكدس عن طريق الحد من عدد المعاملات والمتغيرات المحلية في الإجراء التكراري، أو عن طريق استبدال التكرار ببنية بيانات مكدس صريحة.
اختيار الحالات الأساسية
في أي خوارزمية تكرارية، هناك حرية كبيرة في اختيار الحالات الأساسية ، وهي المشكلات الفرعية الصغيرة التي يتم حلها مباشرة من أجل إنهاء التكرار.
يُعدّ اختيار أصغر أو أبسط الحالات الأساسية الممكنة أكثر أناقةً، ويؤدي عادةً إلى برامج أبسط، نظرًا لقلة الحالات التي يجب مراعاتها وسهولة حلّها. على سبيل المثال، يمكن لخوارزمية تحويل فورييه السريع إيقاف الاستدعاء الذاتي عندما يكون المُدخل عينةً واحدة، ويمكن لخوارزمية فرز القوائم السريعة إيقاف الاستدعاء الذاتي عندما يكون المُدخل قائمةً فارغة؛ في كلا المثالين، توجد حالة أساسية واحدة فقط، ولا تتطلب أي معالجة.
من ناحية أخرى، غالبًا ما تتحسن الكفاءة إذا توقف الاستدعاء التكراري عند حالات أساسية كبيرة نسبيًا، وتم حل هذه الحالات بطريقة غير تكرارية، مما ينتج عنه خوارزمية هجينة . تتجنب هذه الاستراتيجية عبء الاستدعاءات التكرارية التي لا تُنجز عملًا يُذكر، وقد تسمح أيضًا باستخدام خوارزميات غير تكرارية متخصصة، تكون في تلك الحالات الأساسية أكثر كفاءة من الاستدعاء التكراري الصريح. يتمثل الإجراء العام لخوارزمية تكرارية هجينة بسيطة في اختصار الحالة الأساسية ، والمعروف أيضًا بالتكرار غير المباشر . في هذه الحالة، يتم التحقق مما إذا كانت الخطوة التالية ستؤدي إلى الحالة الأساسية قبل استدعاء الدالة، مما يتجنب استدعاء دالة غير ضروري. على سبيل المثال، في شجرة، بدلًا من الاستدعاء التكراري إلى عقدة فرعية ثم التحقق مما إذا كانت فارغة، فإن التحقق من كونها فارغة قبل الاستدعاء التكراري يتجنب نصف استدعاءات الدالة في بعض الخوارزميات على الأشجار الثنائية. بما أن خوارزمية D&C تُختزل في نهاية المطاف كل مسألة أو مسألة فرعية إلى عدد كبير من المسائل الأساسية، فإن هذه المسائل غالبًا ما تُهيمن على التكلفة الإجمالية للخوارزمية، خاصةً عندما يكون عبء التقسيم/الدمج منخفضًا. تجدر الإشارة إلى أن هذه الاعتبارات لا تعتمد على ما إذا كان المُصرّف يُنفّذ الاستدعاء الذاتي أم باستخدام مكدس صريح.
لذا، على سبيل المثال، ستتحول العديد من تطبيقات المكتبات لخوارزمية الفرز السريع إلى خوارزمية فرز إدراج بسيطة تعتمد على الحلقات (أو ما شابهها) بمجرد أن يصبح عدد العناصر المراد فرزها صغيرًا بما فيه الكفاية. لاحظ أنه إذا كانت القائمة الفارغة هي الحالة الأساسية الوحيدة، فإن فرز قائمة باستخدامستتضمن المشاركات الحد الأقصىاستدعاءات خوارزمية الفرز السريع التي لا تفعل شيئًا سوى العودة فورًا. زيادة الحالات الأساسية إلى قوائم بحجم 2 أو أقل ستؤدي إلى التخلص من معظم هذه الاستدعاءات عديمة الفائدة، وبشكل عام، تُستخدم حالة أساسية أكبر من 2 عادةً لتقليل الوقت المُستغرق في تكلفة استدعاء الدوال أو معالجة المكدس.
بدلاً من ذلك، يمكن استخدام حالات أساسية كبيرة تستخدم خوارزمية فرق تسد، ولكن تُنفذ الخوارزمية لمجموعة محددة مسبقًا من الأحجام الثابتة، حيث يمكن فك الخوارزمية بالكامل إلى كود خالٍ من التكرار والحلقات والشروط (مرتبط بتقنية التقييم الجزئي ). على سبيل المثال، يُستخدم هذا النهج في بعض تطبيقات تحويل فورييه السريع (FFT) الفعالة، حيث تكون الحالات الأساسية عبارة عن تطبيقات مفككة لخوارزميات FFT التي تعتمد على فرق تسد لمجموعة من الأحجام الثابتة. [ 13 ] يمكن استخدام طرق توليد الكود المصدري لإنتاج العدد الكبير من الحالات الأساسية المنفصلة اللازمة لتنفيذ هذه الاستراتيجية بكفاءة. [ 13 ]
يُعرف الشكل المعمم لهذه الفكرة باسم "فك التكرار" أو "التوسيع"، وقد تم اقتراح تقنيات متنوعة لأتمتة عملية توسيع الحالة الأساسية. [ 14 ]
البرمجة الديناميكية للمسائل الفرعية المتداخلة
في بعض المسائل، قد يؤدي التكرار المتفرع إلى تقييم المسألة الفرعية نفسها عدة مرات. في مثل هذه الحالات، قد يكون من المفيد تحديد حلول هذه المسائل الفرعية المتداخلة وحفظها، وهي تقنية تُعرف باسم التخزين المؤقت . وعند تطبيقها بشكل كامل، تُفضي إلى خوارزميات فرق تسد من الأسفل إلى الأعلى، مثل البرمجة الديناميكية .
انظر أيضاً
- طريقة أكرا-بازي – طريقة في علوم الحاسوب
- دالة التجميع القابلة للتحليل – نوع من الدوال في إدارة قواعد البيانات. صفحات تعرض أوصافًا مختصرة لأهداف إعادة التوجيه.
- نموذج التفرع والدمج – طريقة لإعداد وتنفيذ برامج الحاسوب المتوازية
- نظرية ماستر (تحليل الخوارزميات) – أداة لتحليل خوارزميات فرق تسد
- الاستقراء الرياضي – شكل من أشكال البرهان الرياضي
- MapReduce – نموذج البرمجة المتوازية
- الاستدلال (علوم الحاسوب) - نوع من الخوارزميات، ينتج حلولاً صحيحة تقريبًا
مراجع
- ↑ هيول، مارين جيه إتش ؛ كولمان، أوليفر؛ ويرينغا، سيرت؛ بير، أرمين (2012)، "المكعب والقهر: توجيه حلول CDCL SAT من خلال التنبؤات المسبقة"، الأجهزة والبرمجيات: التحقق والاختبار ، سلسلة محاضرات في علوم الحاسوب، المجلد 7261، سبرينغر برلين هايدلبرغ، الصفحات 50-65 ، doi : 10.1007/978-3-642-34188-5_8 ، ISBN 978-3-642-34187-8
- ↑ بلاهوت، ريتشارد (14 مايو 2014). خوارزميات سريعة لمعالجة الإشارات . مطبعة جامعة كامبريدج. الصفحات 139-143 . ISBN 978-0-511-77637-3.
- ^ توماس هـ. كورمين. تشارلز إي ليسرسون؛ رونالد ل. ريفست؛ كليفورد شتاين (31 يوليو 2009). مقدمة في الخوارزميات . مطبعة معهد ماساتشوستس للتكنولوجيا. رقم ISBN 978-0-262-53305-8.
- ↑ براسارد، جي، وبراتلي، بي. أساسيات الخوارزميات، برنتيس هول، 1996.
- ↑ أناني ف. ليفيتين، مقدمة في تصميم وتحليل الخوارزميات (أديسون ويسلي، 2002).
- 1 2 3 دونالد إي. كنوث، فن برمجة الحاسوب: المجلد 3، الفرز والبحث ، الطبعة الثانية (أديسون ويسلي، 1998).
- ↑ Heideman, MT, DH Johnson, and CS Burrus, “ Gauss and the history of the fast Fourier transform “, IEEE ASSP Magazine, 1, (4), 14–21 (1984).
- ↑ كنوت، دونالد (1998). فن برمجة الحاسوب: المجلد 3: الفرز والبحث . أديسون-ويسلي. ص 159. ISBN 0-201-89685-0.
- ^ كاراتسوبا، أناتولي أ . يوري ب. أوفمان (1962). "مقص كبير للسيارات". دوكلادي أكاديمي ناوك SSSR . 146 : 293 – 294.ترجمة كاراتسوبا، أ.؛ أوفمان، يو. (1963). "ضرب الأعداد متعددة الأرقام على الأوتوماتا" . الفيزياء السوفيتية دوكلادي . 7 : 595-596 . رمز Bibcode : 1963SPhD....7..595K .
- 1 2 كلاينبرج، جون؛ تاردوس ، إيفا (16 مارس 2005). تصميم الخوارزمية (1 ed.). تعليم بيرسون . ص 214 – 220. ISBN 9780321295354تم الاطلاع عليه بتاريخ 26 يناير 2025 .
- ↑ م. فريجو؛ سي إي ليسرسون؛ هـ. بروكوب (1999). "خوارزميات غير حساسة لذاكرة التخزين المؤقت" . الندوة السنوية الأربعون حول أسس علوم الحاسوب (رقم التصنيف 99CB37039) . الصفحات 285-297 . doi : 10.1109/SFFCS.1999.814600 . ISBN 0-7695-0409-4. S2CID 62758836 .
- ↑ نيكولاس ج. هايام، " دقة جمع الفاصلة العائمة "، مجلة SIAM للحوسبة العلمية 14 (4)، 783-799 (1993).
- 1 2 فريجو، م.؛ جونسون، س. ج. (فبراير 2005). "تصميم وتنفيذ FFTW3" (ملف PDF) . وقائع معهد مهندسي الكهرباء والإلكترونيات . 93 (2): 216-231 . Bibcode : 2005IEEEP..93..216F . CiteSeerX 10.1.1.66.3097 . doi : 10.1109/JPROC.2004.840301 . S2CID 6644892 .
- ↑ رادو روجينا ومارتن رينارد، " فك التكرار لبرامج فرق تسد " في اللغات والمترجمات للحوسبة المتوازية ، الفصل 3، الصفحات 34-48. سلسلة محاضرات في علوم الحاسوب ، المجلد 2017 (برلين: سبرينغر، 2001).
- خوارزميات فرق تسد
- الخوارزميات
- خوارزميات وأساليب التحسين
