خوارزمية فرق تسد

في علم الحاسوب ، يُشير مصطلح "فرق تسد" ، الذي كان في الأصل مبدأً سياسياً ، إلى نموذج تصميم خوارزمي . تقوم خوارزمية "فرق تسد" بتقسيم المشكلة بشكل متكرر إلى مشكلتين فرعيتين أو أكثر من النوع نفسه أو من نوع مشابه، حتى تصبح هذه المشكلات بسيطة بما يكفي لحلها مباشرة. ثم تُدمج حلول المشكلات الفرعية للحصول على حل للمشكلة الأصلية.

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

قد يكون تصميم خوارزميات فرق تسد فعّالة أمرًا صعبًا. وكما هو الحال في الاستقراء الرياضي ، غالبًا ما يكون من الضروري تعميم المسألة لجعلها قابلة للحل التكراري . وعادةً ما يتم إثبات صحة خوارزمية فرق تسد بالاستقراء الرياضي، ويتم تحديد تكلفتها الحسابية غالبًا عن طريق حل العلاقات التكرارية .

فرق تسد

أسلوب فرق تسد لترتيب القائمة (38، 27، 43، 3، 9، 82، 10) ترتيبًا تصاعديًا. النصف العلوي: تقسيم القائمة إلى قوائم فرعية؛ المنتصف: ترتيب قائمة مكونة من عنصر واحد أمر بسيط؛ النصف السفلي: تجميع القوائم الفرعية المرتبة.

يُستخدم نموذج فرق تسد غالبًا لإيجاد الحل الأمثل للمشكلة. وتتلخص فكرته الأساسية في تقسيم المشكلة المعطاة إلى مشكلتين فرعيتين أو أكثر متشابهتين، ولكن أبسط، ثم حل كل منهما على حدة، ودمج حلولهما لحل المشكلة الأصلية. تُحل المشكلات البسيطة نسبيًا مباشرةً. على سبيل المثال، لترتيب قائمة معينة من n عددًا طبيعيًا ، تُقسم إلى قائمتين تحتوي كل منهما على n /2 عددًا تقريبًا، ثم تُرتب كل قائمة على حدة، ويُدمج الناتجان معًا بشكل مناسب للحصول على النسخة المرتبة من القائمة المعطاة (انظر الصورة). يُعرف هذا الأسلوب بخوارزمية فرز الدمج .

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

يُعد أحد التطبيقات المهمة لأسلوب فرق تسد هو التحسين، حيث إذا تم تقليل مساحة البحث ("تقليمها") بعامل ثابت في كل خطوة، فإن الخوارزمية الكلية لها نفس التعقيد التقاربي لخطوة التقليم، مع اعتماد الثابت على عامل التقليم (عن طريق جمع السلسلة الهندسية )؛ ​​وهذا ما يُعرف بالتقليم والبحث .

أمثلة تاريخية مبكرة

تتمثل الأمثلة المبكرة لهذه الخوارزميات في المقام الأول في خوارزمية التناقص والتغلب - حيث يتم تقسيم المشكلة الأصلية تباعاً إلى مشاكل فرعية فردية ، ويمكن حلها بالفعل بشكل تكراري.

تتمتع خوارزمية البحث الثنائي ، وهي خوارزمية تعتمد على مبدأ "التناقص والتغلب" حيث تكون المسائل الفرعية أصغر بنحو النصف من المسائل الأصلية، بتاريخ طويل. ورغم ظهور وصف واضح لهذه الخوارزمية على الحواسيب عام 1946 في مقال لجون موشلي ، فإن فكرة استخدام قائمة مرتبة من العناصر لتسهيل البحث تعود على الأقل إلى بابل عام 200  قبل الميلاد. [ 6 ] ومن الخوارزميات القديمة الأخرى التي تعتمد على مبدأ "التناقص والتغلب" خوارزمية إقليدس لحساب القاسم المشترك الأكبر لعددين عن طريق اختزالهما إلى مسائل فرعية أصغر فأصغر، ويعود تاريخها إلى عدة قرون قبل الميلاد.

يُعد وصف جاوس عام 1805 لما يسمى الآن بخوارزمية تحويل فورييه السريع كولي-توكي (FFT) مثالًا مبكرًا على خوارزمية فرق تسد مع مشاكل فرعية متعددة ، على الرغم من أنه لم يحلل عدد عملياتها كميًا، ولم تنتشر خوارزميات FFT على نطاق واسع حتى أعيد اكتشافها بعد أكثر من قرن.

خوارزمية فرز الدمج هي خوارزمية مبكرة ذات مشكلتين فرعيتين تم تطويرها خصيصًا لأجهزة الكمبيوتر وتم تحليلها بشكل صحيح ، وقد اخترعها جون فون نيومان في عام 1945. [ 8 ]

ومن الأمثلة البارزة الأخرى الخوارزمية التي اخترعها أناتولي أ. كاراتسوبا عام 1960 [ 9 ] والتي يمكنها ضرب عددين مكونين من n رقمًا فييا(نسجل23){\displaystyle O(n^{\log _{2}3})}العمليات (في تدوين Big O ). دحضت هذه الخوارزمية تخمين أندريه كولموغوروف لعام 1956 بأنΩ(ن2){\displaystyle \Omega (n^{2})}ستكون هناك حاجة إلى عمليات لإنجاز تلك المهمة.

كمثال آخر على خوارزمية فرق تسد التي لم تكن تعتمد في الأصل على الحواسيب، يقدم دونالد كنوث الطريقة التي يستخدمها مكتب البريد عادةً لتوجيه البريد: تُفرز الرسائل في أكياس منفصلة لمناطق جغرافية مختلفة، ويُفرز كل كيس من هذه الأكياس بدوره في مجموعات لمناطق فرعية أصغر، وهكذا حتى يتم تسليمها. [ 6 ] يرتبط هذا بفرز الجذر ، الذي وُصف لآلات فرز البطاقات المثقبة في وقت مبكر من عام 1929. [ 6 ]

المزايا

حل المشكلات الصعبة

تُعدّ استراتيجية "فرق تسد" أداةً فعّالةً لحلّ المشكلات المعقدة من الناحية المفاهيمية: فكل ما تتطلبه هو طريقة لتقسيم المشكلة إلى مشكلات فرعية، وحلّ الحالات البسيطة، ودمج المشكلات الفرعية في المشكلة الأصلية. وبالمثل، لا تتطلب استراتيجية "التقليل والتغلب" سوى اختزال المشكلة إلى مشكلة واحدة أصغر، مثل لغز برج هانوي الكلاسيكي ، الذي يُختزل فيه تحريك برج ارتفاعهن{\displaystyle n}لتحريك برج شاهق الارتفاعن-1{\displaystyle n-1}.

كفاءة الخوارزمية

غالباً ما يساعد نموذج فرق تسد في اكتشاف الخوارزميات الفعالة. كان هذا النموذج مفتاحاً، على سبيل المثال، لطريقة كاراتسوبا للضرب السريع، وخوارزميات الفرز السريع والفرز بالدمج، وخوارزمية ستراسن لضرب المصفوفات ، وتحويلات فورييه السريعة.

في جميع هذه الأمثلة، أدى أسلوب D&C إلى تحسين التكلفة التقاربية للحل. على سبيل المثال، إذا كانت (أ) الحالات الأساسية ذات حجم ثابت ومحدود، فإن جهد تقسيم المسألة ودمج الحلول الجزئية يتناسب طرديًا مع حجم المسألة.ن{\displaystyle n}و(ب) يوجد عدد محدودص{\displaystyle p}من المشكلات الفرعية ذات الحجم ~نص{\displaystyle {\frac {n}{p}}}في كل مرحلة، ستكون تكلفة خوارزمية فرق تسديا(نسجلصن){\displaystyle O(n\log _{p}n)}.

بالنسبة لأنواع أخرى من أساليب فرق تسد، يمكن تعميم أوقات التشغيل أيضًا. على سبيل المثال، عندما يستغرق (أ) عمل تقسيم المشكلة ودمج الحلول الجزئيةجن{\displaystyle cn}الوقت، أينن{\displaystyle n}حجم الإدخال وج{\displaystyle c}أ) ثابت ما؛ ب) عندمان<2{\displaystyle n<2}، يستغرق تنفيذ الخوارزمية وقتًا محدودًا بـج{\displaystyle c}ج) هناكq{\displaystyle q}مسائل فرعية حيث يكون حجم كل مسألة فرعية ~ن2{\displaystyle {\frac {n}{2}}}ثم، تكون أوقات التشغيل كما يلي:

  • إذا كان عدد المسائل الفرعيةq>2{\displaystyle q>2}إذاً، فإن وقت تشغيل خوارزمية فرق تسد يكون محدوداً بـيا(نسجل2q){\displaystyle O(n^{\log _{2}q})}.
  • إذا كان عدد المسائل الفرعية واحدًا بالضبط، فإن وقت تشغيل خوارزمية فرق تسد يكون محدودًا بـيا(ن){\displaystyle O(n)}[ 10 ]

أما إذا استغرق الأمر بدلاً من ذلك عملية تقسيم المشكلة ودمج الحلول الجزئيةجن2{\displaystyle cn^{2}}الوقت، وهناك مشكلتان فرعيتان لكل منهما حجمن2{\displaystyle {\frac {n}{2}}}إذاً، فإن وقت تشغيل خوارزمية فرق تسد يكون محدوداً بـيا(ن2){\displaystyle O(n^{2})}[ 10 ]

التوازي

تُعد خوارزميات فرق تسد مناسبة بشكل طبيعي للتنفيذ في أجهزة متعددة المعالجات ، وخاصة أنظمة الذاكرة المشتركة حيث لا يلزم التخطيط المسبق لتوصيل البيانات بين المعالجات لأنه يمكن تنفيذ المشكلات الفرعية المتميزة على معالجات مختلفة.

الوصول إلى الذاكرة

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

توجد نفس الميزة فيما يتعلق بأنظمة التخزين الهرمية الأخرى، مثل NUMA أو الذاكرة الافتراضية ، وكذلك بالنسبة لمستويات متعددة من ذاكرة التخزين المؤقت: بمجرد أن تصبح المشكلة الفرعية صغيرة بما يكفي، يمكن حلها ضمن مستوى معين من التسلسل الهرمي، دون الوصول إلى المستويات الأعلى (الأبطأ).

التحكم في التقريب

في العمليات الحسابية التي تتضمن تقريبًا، كالأعداد العشرية ، قد تُعطي خوارزمية فرق تسد نتائج أكثر دقة من طريقة تكرارية تبدو مكافئة لها ظاهريًا. على سبيل المثال، يمكن جمع N عددًا إما بحلقة بسيطة تُضيف كل قيمة إلى متغير واحد، أو بخوارزمية فرق تسد تُسمى الجمع الثنائي ، والتي تُقسّم مجموعة البيانات إلى نصفين، وتحسب مجموع كل نصف بشكل تكراري، ثم تجمع المجموعين. مع أن الطريقة الثانية تُجري نفس عدد عمليات الجمع التي تُجريها الأولى وتتحمل عبء الاستدعاءات التكرارية، إلا أنها عادةً ما تكون أكثر دقة. [ 12 ]

مشاكل التنفيذ

التكرار

تُنفَّذ خوارزميات فرق تسد بشكل طبيعي كإجراءات تكرارية . في هذه الحالة، تُخزَّن المسائل الفرعية الجزئية المؤدية إلى المسألة قيد الحل حاليًا تلقائيًا في مكدس استدعاءات الإجراءات . الدالة التكرارية هي دالة تستدعي نفسها ضمن تعريفها.

مكدس صريح

يمكن أيضًا تنفيذ خوارزميات فرق تسد بواسطة برنامج غير تكراري يخزن المسائل الفرعية الجزئية في بنية بيانات محددة، مثل مكدس أو طابور أو طابور أولوية . يتيح هذا الأسلوب مزيدًا من الحرية في اختيار المسألة الفرعية المراد حلها لاحقًا، وهي ميزة مهمة في بعض التطبيقات، مثل التكرار العرضي أولًا وطريقة التفرع والتقييد لتحسين الدوال. كما يُعد هذا الأسلوب الحل القياسي في لغات البرمجة التي لا تدعم الإجراءات التكرارية.

حجم الرزمة

في التطبيقات التكرارية لخوارزميات البحث والإنشاء، يجب التأكد من وجود ذاكرة كافية مخصصة لمكدس التكرار، وإلا فقد يفشل التنفيذ بسبب تجاوز سعة المكدس . تتميز خوارزميات البحث والإنشاء الموفرة للوقت عادةً بعمق تكرار صغير نسبيًا. على سبيل المثال، يمكن تنفيذ خوارزمية الفرز السريع بحيث لا تتطلب أبدًا أكثر منسجل2ن{\displaystyle \log _{2}n}استدعاءات متكررة متداخلة للفرزن{\displaystyle n}أغراض.

Stack overflow can be difficult to prevent when using recursive procedures, since many compilers treat the recursion stack as a contiguous block of memory, and some reserve a fixed amount of space for it. In addition, compilers may store more information on the recursion stack than is strictly required, including the return address, unchanged parameters, and the procedure’s local variables. As a result, the likelihood of stack overflow may be reduced by limiting the number of parameters and local variables in the recursive procedure, or by replacing recursion with an explicit stack data structure.

Choosing the base cases

In any recursive algorithm, there is considerable freedom in the choice of the base cases, the small subproblems that are solved directly in order to terminate the recursion.

Choosing the smallest or simplest possible base cases is more elegant and usually leads to simpler programs, because there are fewer cases to consider and they are easier to solve. For example, a Fast Fourier Transform algorithm could stop the recursion when the input is a single sample, and the quicksort list-sorting algorithm could stop when the input is the empty list; in both examples, there is only one base case to consider, and it requires no processing.

On the other hand, efficiency often improves if the recursion is stopped at relatively large base cases, and these are solved non-recursively, resulting in a hybrid algorithm. This strategy avoids the overhead of recursive calls that do little or no work and may also allow the use of specialized non-recursive algorithms that, for those base cases, are more efficient than explicit recursion. A general procedure for a simple hybrid recursive algorithm is short-circuiting the base case, also known as arm's-length recursion. In this case, whether the next step will result in the base case is checked before the function call, avoiding an unnecessary function call. For example, in a tree, rather than recursing to a child node and then checking whether it is null, checking null before recursing avoids half the function calls in some algorithms on binary trees. Since a D&C algorithm eventually reduces each problem or sub-problem instance to a large number of base instances, these often dominate the overall cost of the algorithm, especially when the splitting/joining overhead is low. Note that these considerations do not depend on whether recursion is implemented by the compiler or by an explicit stack.

Thus, for example, many library implementations of quicksort will switch to a simple loop-based insertion sort (or similar) algorithm once the number of items to be sorted is sufficiently small. Note that, if the empty list were the only base case, sorting a list with n{\displaystyle n} entries would entail maximally n{\displaystyle n}استدعاءات خوارزمية الفرز السريع التي لا تفعل شيئًا سوى العودة فورًا. زيادة الحالات الأساسية إلى قوائم بحجم 2 أو أقل ستؤدي إلى التخلص من معظم هذه الاستدعاءات عديمة الفائدة، وبشكل عام، تُستخدم حالة أساسية أكبر من 2 عادةً لتقليل الوقت المُستغرق في تكلفة استدعاء الدوال أو معالجة المكدس.

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

يُعرف الشكل المعمم لهذه الفكرة باسم "فك التكرار" أو "التوسيع"، وقد تم اقتراح تقنيات متنوعة لأتمتة عملية توسيع الحالة الأساسية. [ 14 ]

البرمجة الديناميكية للمسائل الفرعية المتداخلة

في بعض المسائل، قد يؤدي التكرار المتفرع إلى تقييم المسألة الفرعية نفسها عدة مرات. في مثل هذه الحالات، قد يكون من المفيد تحديد حلول هذه المسائل الفرعية المتداخلة وحفظها، وهي تقنية تُعرف باسم التخزين المؤقت . وعند تطبيقها بشكل كامل، تُفضي إلى خوارزميات فرق تسد من الأسفل إلى الأعلى، مثل البرمجة الديناميكية .

انظر أيضاً

مراجع

  1. هيول، مارين جيه إتش ؛ كولمان، أوليفر؛ ويرينغا، سيرت؛ بير، أرمين (2012)، "المكعب والقهر: توجيه حلول CDCL SAT من خلال التنبؤات المسبقة"، الأجهزة والبرمجيات: التحقق والاختبار ، سلسلة محاضرات في علوم الحاسوب، المجلد  7261، سبرينغر برلين هايدلبرغ، الصفحات 50-65 ، doi : 10.1007/978-3-642-34188-5_8 ، ISBN  978-3-642-34187-8
  2. بلاهوت، ريتشارد (14 مايو 2014). خوارزميات سريعة لمعالجة الإشارات . مطبعة جامعة كامبريدج. الصفحات 139-143 . ISBN  978-0-511-77637-3.
  3. ^ توماس هـ. كورمين. تشارلز إي ليسرسون؛ رونالد ل. ريفست؛ كليفورد شتاين (31 يوليو 2009). مقدمة في الخوارزميات . مطبعة معهد ماساتشوستس للتكنولوجيا. رقم ISBN 978-0-262-53305-8.
  4. براسارد، جي، وبراتلي، بي. أساسيات الخوارزميات، برنتيس هول، 1996.
  5. أناني ف. ليفيتين، مقدمة في تصميم وتحليل الخوارزميات (أديسون ويسلي، 2002).
  6. 1 2 3 دونالد إي. كنوث، فن برمجة الحاسوب: المجلد 3، الفرز والبحث ، الطبعة الثانية (أديسون ويسلي، 1998).
  7. Heideman, MT, DH Johnson, and CS Burrus, “ Gauss and the history of the fast Fourier transform “, IEEE ASSP Magazine, 1, (4), 14–21 (1984).
  8. كنوت، دونالد (1998). فن برمجة الحاسوب: المجلد 3: الفرز والبحث . أديسون-ويسلي. ص 159. ISBN  0-201-89685-0.
  9. ^ كاراتسوبا، أناتولي أ . يوري ب. أوفمان (1962). "مقص كبير للسيارات". دوكلادي أكاديمي ناوك SSSR . 146 : 293 – 294.ترجمة كاراتسوبا، أ.؛ أوفمان، يو. (1963). "ضرب الأعداد متعددة الأرقام على الأوتوماتا" . الفيزياء السوفيتية دوكلادي . 7 : 595-596 . رمز Bibcode : 1963SPhD....7..595K .
  10. 1 2 كلاينبرج، جون؛ تاردوس ، إيفا (16 مارس 2005). تصميم الخوارزمية (1 ed.). تعليم بيرسون . ص 214 – 220. ISBN   9780321295354تم الاطلاع عليه بتاريخ 26 يناير 2025 .
  11. م. فريجو؛ سي إي ليسرسون؛ هـ. بروكوب (1999). "خوارزميات غير حساسة لذاكرة التخزين المؤقت" . الندوة السنوية الأربعون حول أسس علوم الحاسوب (رقم التصنيف 99CB37039) . الصفحات 285-297 . doi : 10.1109/SFFCS.1999.814600 . ISBN  0-7695-0409-4. S2CID 62758836 . 
  12. نيكولاس ج. هايام، " دقة جمع الفاصلة العائمة مجلة SIAM للحوسبة العلمية 14 (4)، 783-799 (1993).
  13. 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 .  
  14. رادو روجينا ومارتن رينارد، " فك التكرار لبرامج فرق تسد " في اللغات والمترجمات للحوسبة المتوازية ، الفصل 3، الصفحات 34-48. سلسلة محاضرات في علوم الحاسوب ، المجلد 2017 (برلين: سبرينغر، 2001).