فرز الدلو


فرز الدلو ، أو فرز الصناديق ، هو خوارزمية فرز تعمل عن طريق توزيع عناصر المصفوفة على عدد من الدلاء. ثم يتم فرز كل دلو على حدة، إما باستخدام خوارزمية فرز مختلفة، أو بتطبيق خوارزمية فرز الدلو بشكل متكرر. وهو فرز توزيعي ، وتعميم لفرز الحمام يسمح بمفاتيح متعددة لكل دلو، وهو قريب من فرز الجذر من حيث ترتيب الأرقام من الأكثر أهمية إلى الأقل أهمية. يمكن تنفيذ فرز الدلو باستخدام المقارنات، وبالتالي يمكن اعتباره أيضًا خوارزمية فرز مقارنة . يعتمد التعقيد الحسابي على الخوارزمية المستخدمة لفرز كل دلو، وعدد الدلاء المستخدمة، وما إذا كان المدخل موزعًا بشكل منتظم.
يعمل فرز الدلو على النحو التالي:
- قم بإنشاء مصفوفة من "الدلاء" الفارغة مبدئيًا.
- التشتت : قم بالمرور على المصفوفة الأصلية، وضع كل عنصر في خانته.
- قم بفرز كل دلو غير فارغ.
- التجميع : قم بزيارة الحاويات بالترتيب وأعد جميع العناصر إلى المصفوفة الأصلية.
الشفرة الزائفة
دالة bucketSort(array, k) هي الحاويات ← مصفوفة جديدة من k قوائم فارغة M ← 1 + القيمة الرئيسية القصوى في المصفوفة لـ i = 0 إلى طول(المصفوفة) قم بإدراج array[i] في buckets[floor(k × array[i] / M)] لـ i = 0 إلى k قم nextSort(buckets[i]) أعد سلسلة buckets[0]، ....، buckets[k]
لنفترض أن array هي المصفوفة المراد فرزها، و k هو عدد الخانات المستخدمة. يمكن حساب قيمة المفتاح الأقصى في زمن خطي بالمرور على جميع المفاتيح مرة واحدة. يجب استخدام دالة الجزء الصحيح (floor) لتحويل عدد عشري إلى عدد صحيح (وربما تحويل أنواع البيانات أيضًا). الدالة nextSort هي دالة فرز تُستخدم لفرز كل خانة. يُستخدم فرز الإدراج عادةً نظرًا لأدائه العالي نسبيًا مع الأعداد الصغيرة من العناصر، ولكن يمكن استخدام خوارزميات أخرى أيضًا، مثل فرز التحديد أو فرز الدمج . استخدام bucketSort نفسه كدالة nextSort يُنتج خوارزمية مشابهة لفرز الجذر ؛ على وجه الخصوص، الحالة n = 2 تُقابل الفرز السريع (مع احتمال وجود خيارات غير مناسبة للعناصر المحورية).
تحليل
تحليل أسوأ الحالات
عندما تحتوي المدخلات على عدة مفاتيح متقاربة (تجميع)، فمن المرجح أن تُوضع هذه العناصر في نفس المجموعة، مما ينتج عنه احتواء بعض المجموعات على عناصر أكثر من المتوسط. ويحدث أسوأ سيناريو عندما تُوضع جميع العناصر في مجموعة واحدة. عندها، سيتأثر الأداء العام بشكل كبير بالخوارزمية المستخدمة لفرز كل مجموعة، على سبيل المثالفرز الإدراج أوخوارزميات فرز المقارنة ، مثل فرز الدمج .
تحليل الحالة المتوسطة
لنفترض أن المدخلات موزعة بشكل منتظم. يمكن تنفيذ الخطوة الأولى، وهي تهيئة المجموعات وإيجاد قيمة المفتاح القصوى في المصفوفة، فيالوقت. إذا أمكن إجراء القسمة والضرب في وقت ثابت، فإن توزيع كل عنصر في مكانه المخصص يكلف أيضًابافتراض استخدام خوارزمية فرز الإدراج لفرز كل مجموعة، فإن تكلفة الخطوة الثالثة، أينهل طول الدلو مفهرس؟بما أننا نتحدث عن متوسط الوقت، فإن التوقعيجب تقييمها بدلاً من ذلك. دعليكن المتغير العشوائي الذيإذا عنصريتم وضعها في دلو، ووإلا. لدينا. لذلك،
يفصل السطر الأخير عملية الجمع إلى الحالاتوالقضيةبما أن احتمال ظهور عنصر ما موزع على الدلويكون،احتمالية أن يكون 1وصفر فيما عدا ذلك.
مع الجمع، سيكون
وأخيرًا، ستكون التعقيدات.
تتطلب الخطوة الأخيرة من فرز الدلو، وهي دمج جميع العناصر المصنفة في كل دلو،الوقت. لذلك، فإن التعقيد الكلي هولاحظ أنه إذا تم اختيار k لتكونثم يتم تشغيل فرز الدلومتوسط الوقت، بالنظر إلى مدخلات موزعة بشكل منتظم. [ 1 ]
التحسينات
تتمثل إحدى طرق التحسين الشائعة في إعادة العناصر غير المرتبة من المجموعات إلى المصفوفة الأصلية أولاً ، ثم تطبيق فرز الإدراج على المصفوفة بأكملها؛ ولأن وقت تشغيل فرز الإدراج يعتمد على مدى بُعد كل عنصر عن موقعه النهائي، فإن عدد المقارنات يظل صغيرًا نسبيًا، ويتم استغلال التسلسل الهرمي للذاكرة بشكل أفضل عن طريق تخزين القائمة بشكل متجاور في الذاكرة. [ 2 ]
إذا كان توزيع المدخلات معروفًا أو يمكن تقديره، فغالبًا ما يمكن اختيار مجموعات تحتوي على كثافة ثابتة (بدلاً من مجرد امتلاك حجم ثابت). وهذا يسمحمتوسط التعقيد الزمني حتى بدون مدخلات موزعة بشكل منتظم.
المتغيرات
فرز الدلو العام
تعتمد أكثر أنواع فرز الدلو شيوعًا على قائمة من n مدخلات رقمية تتراوح بين الصفر وقيمة قصوى M، وتقسم نطاق القيم إلى b دلو، حجم كل منها M / b . إذا تم فرز كل دلو باستخدام فرز الإدراج ، يمكن إثبات أن الفرز يعمل في زمن خطي متوقع (حيث يُحسب المتوسط لجميع المدخلات الممكنة). [ 3 ] مع ذلك، يتراجع أداء هذا الفرز مع التكتل؛ فإذا تقاربت العديد من القيم، ستقع جميعها في دلو واحد ويتم فرزها ببطء. يتم تجنب هذا التراجع في الأداء في خوارزمية فرز الدلو الأصلية بافتراض أن المدخلات مُولَّدة بواسطة عملية عشوائية توزع العناصر بشكل منتظم على الفترة [0,1) . [ 1 ]
فرز التقارب
على غرار فرز الدلو العام المذكور أعلاه، يعمل ProxmapSort بتقسيم مصفوفة المفاتيح إلى مصفوفات فرعية باستخدام دالة "مفتاح الخريطة" التي تحافظ على ترتيب جزئي للمفاتيح؛ فمع إضافة كل مفتاح إلى مصفوفته الفرعية، يُستخدم فرز الإدراج للحفاظ على ترتيب تلك المصفوفة الفرعية، مما ينتج عنه ترتيب المصفوفة بأكملها عند اكتمال ProxmapSort. يختلف ProxmapSort عن فرز الدلو في استخدامه لمفتاح الخريطة لوضع البيانات في مكانها التقريبي الصحيح بالترتيب المُرتب، مما يُنتج "خريطة تقارب" للمفاتيح.
فرز المدرج التكراري
يُضيف نوع آخر من فرز الدلو، يُعرف بفرز المدرج التكراري أو فرز العد ، خطوة أولية لحساب عدد العناصر التي ستقع في كل دلو باستخدام مصفوفة عد. [ 4 ] وباستخدام هذه المعلومات، يمكن ترتيب قيم المصفوفة في سلسلة من الدلو في مكانها من خلال سلسلة من عمليات التبادل، دون ترك أي مساحة إضافية لتخزين الدلو.
نوع ساعي البريد
فرز ساعي البريد هو نوع من فرز الدلو يستفيد من بنية هرمية للعناصر، تُوصف عادةً بمجموعة من السمات. هذه هي الخوارزمية المستخدمة في آلات فرز الرسائل في مكاتب البريد : يُفرز البريد أولاً بين الرسائل المحلية والدولية؛ ثم حسب الولاية أو المقاطعة أو الإقليم؛ ثم حسب مكتب البريد الوجهة؛ ثم حسب المسارات، وهكذا. ولأن المفاتيح لا تُقارن ببعضها، فإن زمن الفرز هو O( cn )، حيث يعتمد c على حجم المفتاح وعدد الدلو. وهذا مشابه لفرز الجذر الذي يعمل "من الأعلى إلى الأسفل"، أو "الرقم الأكثر أهمية أولاً". [ 5 ] [ 6 ]
فرز عشوائي
تُعدّ خوارزمية فرز الخلط [ 7 ] نوعًا من خوارزمية فرز الدلو، حيث تبدأ بإزالة أول ثُمن من العناصر n المراد فرزها، ثم تُفرزها بشكل متكرر، وتضعها في مصفوفة. ينتج عن ذلك n /8 "دلوًا" تُوزّع عليها العناصر المتبقية 7/8. بعد ذلك، تُفرز كل "دلو"، وتُدمج "الدلاء" معًا لتكوين مصفوفة مُفرزة.
مقارنة مع خوارزميات الفرز الأخرى
يمكن اعتبار فرز الدلو تعميمًا لفرز العد ؛ ففي الواقع، إذا كان حجم كل دلو 1، فإن فرز الدلو يتحول إلى فرز العد. يسمح حجم الدلو المتغير في فرز الدلو باستخدام ذاكرة O( n ) بدلًا من ذاكرة O( M )، حيث M هو عدد القيم المميزة؛ في المقابل، يتخلى عن أسوأ أداء لفرز العد، وهو O( n + M ).
يُعدّ فرز الدلو ذو الدلوين نسخةً من فرز البيانات السريع ، حيث تُختار قيمة المحور دائمًا لتكون القيمة الوسطى ضمن نطاق القيم. ورغم فعالية هذا الاختيار مع المدخلات ذات التوزيع المنتظم، فإنّ طرقًا أخرى لاختيار المحور في فرز البيانات السريع، مثل اختيار المحاور عشوائيًا، تجعله أكثر مقاومةً لتكتّل البيانات في توزيع المدخلات.
تبدأ خوارزمية فرز الدمج متعددة الاتجاهات (n -way mergesort) بتوزيع القائمة إلى n قائمة فرعية وفرز كل منها؛ إلا أن القوائم الفرعية الناتجة عن فرز الدمج تتداخل نطاقات قيمها، وبالتالي لا يمكن إعادة دمجها ببساطة عن طريق التسلسل كما في فرز الدلو. بدلاً من ذلك، يجب دمجها باستخدام خوارزمية دمج. ومع ذلك، يُعوض هذا العبء الإضافي بسهولة مرحلة التوزيع وإمكانية ضمان أن تكون كل قائمة فرعية بنفس الحجم، مما يوفر حدًا زمنيًا جيدًا في أسوأ الحالات.
يمكن اعتبار فرز الجذر من أعلى إلى أسفل حالة خاصة من فرز الدلو، حيث يكون كل من نطاق القيم وعدد الدلو مقيدًا بأن يكون قوة للعدد اثنين. وبالتالي، يكون حجم كل دلو أيضًا قوة للعدد اثنين، ويمكن تطبيق العملية بشكل متكرر. يُسرّع هذا الأسلوب مرحلة التوزيع، إذ يكفي فحص بادئة التمثيل الثنائي لكل عنصر لتحديد دلوه.
مراجع
- ١ ٢ توماس هـ. كورمن ؛ تشارلز إي. ليسرسون ؛ رونالد ل. ريفست وكليفورد شتاين . مقدمة في الخوارزميات .
يعمل فرز الدلو في زمن خطي في المتوسط. ومثل فرز العد، يتميز فرز الدلو بالسرعة لأنه يفترض شيئًا ما عن المدخلات. فبينما يفترض فرز العد أن المدخلات تتكون من أعداد صحيحة ضمن نطاق صغير، يفترض فرز الدلو أن المدخلات مُولَّدة بواسطة عملية عشوائية توزع العناصر بشكل منتظم على الفترة [٠، ١) . وتتلخص فكرة فرز الدلو في تقسيم الفترة [٠، ١) إلى n فترات فرعية متساوية الحجم، أو دلاء، ثم توزيع أعداد المدخلات n في هذه الدلاء. وبما أن المدخلات موزعة بشكل منتظم على الفترة [٠، ١) ، فلا نتوقع أن يقع عدد كبير من الأعداد في كل دلو. ولإنتاج المخرجات، نقوم ببساطة بفرز الأعداد في كل دلو، ثم نمر على الدلاء بالترتيب، ونسرد العناصر الموجودة في كل دلو.
- ↑ كورين، إي. ولوغار، أ. "الفرز في وقت خطي - اختلافات في فرز الدلو". مجلة علوم الحاسوب في الكليات ، 20، 1، ص 197-202. أكتوبر 2004.
- ↑ توماس هـ. كورمن ، تشارلز إي. ليسرسون ، رونالد ل. ريفست ، وكليفورد شتاين . مقدمة في الخوارزميات ، الطبعة الثانية. مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل، 2001. ISBN 0-262-03293-7القسم 8.4: فرز الدلو، الصفحات 174-177 .
- ↑ قاموس الخوارزميات وهياكل البيانات التابع للمعهد الوطني للمعايير والتكنولوجيا: فرز المدرج التكراري
- ↑ بلاك، بول إي.، محرر. (20 يونيو 2011). "فرز ساعي البريد" . قاموس الخوارزميات وهياكل البيانات . المعهد الوطني للمعايير والتكنولوجيا . تم الاسترجاع في 31 مارس 2026 .
تتضمن هذه المقالة نصًا من هذا المصدر، وهو متاح للعموم . - ↑ رامي، روبرت (أغسطس 1992). "فرز ساعي البريد" . مجلة مستخدمي لغة C/C++ . مؤرشف من الأصل في 28 يونيو 2009.
- ↑ نوع جديد ثوري من جون كوهين، 26 نوفمبر 1997
روابط خارجية
- خوارزميات الفرز
- أنواع مستقرة
