سؤال

هناك نوع جديد (نسبيًا) في الكتلة يسمى Timsort.لقد تم استخدامه كقائمة فرز لـ Python، وسيكون كذلك الآن Array.sort الجديد في Java 7.

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

(أنظر أيضا منشور StackOverflow ذي الصلة.)

هل كانت مفيدة؟

المحلول

نقلا عن الجزء ذو الصلة من وظيفة مدونة محذوفة الآن: تصور خوارزميات الفرز: Python's Timsort

إن نهاية الأعمال في Timsort هي عملية دمج تعمل على أشواط من العناصر المحددة مسبقا. يتم اختيار Minrun الحد الأدنى لطول التشغيل للتأكد من أن الدمج النهائي متوازن قدر الإمكان - مقابل 64 عنصرا، يحدث Minrun 32. قبل بدء المزدج، يتم تمرير واحد من خلال البيانات للكشف عن أشواط موجودة مسبقا مسبقا عناصر. يتم التعامل مع Rescending Runs بواسطة ببساطة عكسها في مكانها. إذا كان طول التشغيل الناتج أقل من minrun، فسيتم تعزيزه إلى Minrun باستخدام فرز الإدراج. على صفيف خلطا مع عدم وجود عمليات تشغيل موجودة مسبقة مسبقا، تبدو هذه العملية تماما تخميننا أعلاه: كتل مسبقة الفرز من عناصر Minrun باستخدام فرز الإدراج، قبل الاندماج مع دمج فرز.

[...]

  • يجد Timsort تشغيل تنازليا، ويعكس المدى في المكان. يتم ذلك مباشرة على صفيف المؤشرات، لذلك يبدو "لحظة" من وجهة نظرنا.
  • يتم تشغيل المدى الآن إلى طول Minrun باستخدام فرز الإدراج.
  • لا يتم اكتشاف أي تشغيل في بداية الكتلة التالية، ويتم استخدام فرز الإدراج لفرز الكتلة بأكملها. لاحظ أن العناصر الفرز في أسفل هذه الكتلة لا تتم معالجتها خصيصا - لا تكتشف TIMSort أشواط تبدأ في منتصف الكتل التي يتم تعزيزها إلى Minrun.
  • أخيرا، يتم استخدام Mergesort لدمج المدى.

نصائح أخرى

لقد مر هذا التغيير من خلال القائمة البريدية لـ core-libs عندما دخلت لذلك كان هناك بعض المناقشات والروابط المفيدة هناك.هنا مراجعة الويب مع تغييرات مراجعة التعليمات البرمجية وكذلك التصحيح الأصلي.

التعليقات في الكود تقول:

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

التنفيذ يستفيد بشكل متساوٍ من التصاعدي و
ترتيب تنازلي في مجموعة المدخلات الخاصة به، ويمكن الاستفادة منها
ترتيب تصاعدي وتنازلي في أجزاء مختلفة من نفسه
مصفوفة الإدخالإنها مناسبة تمامًا لدمج مصفوفتين مصنفتين أو أكثر:
ببساطة قم بتسلسل المصفوفات وفرز المصفوفة الناتجة.
تم تعديل التنفيذ من قائمة تيم بيترز الخاصة ببايثون
تيمسورت.ويستخدم تقنيات من كتاب "المتفائل" لبيتر ماكلروي
الفرز والتعقيد النظري للمعلومات"، في وقائع
الندوة السنوية الرابعة لـ ACM-SIAM حول الخوارزميات المنفصلة، ​​الصفحات من 467 إلى 474،
يناير 1993.

مدفون هناك رابط مفيد جدًا لتفاصيل تنفيذ Python, ، وأعتقد أن هذا مكان رائع للبدء، متبوعًا بالكود.لكي يكون على مستوى عالٍ بشكل لا يصدق في هذا الشأن، يعمل timsort على تحسين الأداء من خلال ملاحظة عمليات تشغيل البيانات التي تم فرزها والاستفادة من تلك البنية أثناء الفرز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top