طرق فرز المصفوفات في الياقوت

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

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

يأخذ "عامل سفينة الفضاء" كائنين ويقارنهما ثم يعيد -1 أو 0 أو 1. هذا غامض بعض الشيء ، لكن العامل نفسه ليس لديه سلوك محدد جيدًا. لنأخذ كائنات رقمية على سبيل المثال. إذا كان لديك كائنين رقميين أ و بوتقييم أ <=> ب، ما تقييم التعبير؟ في حالة الأعداد ، من السهل معرفة ذلك. إذا كان a أكبر من b ، فسيكون -1 ، إذا كانا متساويين سيكون 0 وإذا كان b أكبر من a ، فسيكون 1. يتم استخدام هذا لإخبار خوارزمية الفرز أي من الكائنين يجب أن يذهب أولاً في

instagram viewer
مجموعة مصفوفة. تذكر فقط أنه إذا كان المعامل الأيسر سيأتي أولاً في المصفوفة ، فيجب أن يتم تقييمه إلى -1 ، وإذا كان يجب أن يكون اليد اليمنى أولاً ، فيجب أن يكون 1 ، وإذا كان لا يهم يجب أن يكون 0.

لا يتبع دائمًا مثل هذه القواعد مرتبة. ماذا يحدث إذا كنت تستخدم هذا العامل على كائنين من أنواع مختلفة؟ ربما ستحصل على استثناء. ماذا يحدث عندما تتصل 1 <=> "قرد"? سيكون هذا يعادل الاتصال 1. <=> ("قرد")، وهذا يعني أن الطريقة الفعلية يتم استدعاء على اليسار معامل و Fixnum # <=> إرجاع صفر إذا كان المعامل الأيمن ليس رقميًا. إذا أرجع عامل التشغيل لا شيء ، فستثير طريقة الفرز استثناءً. لذا ، قبل فرز المصفوفات ، تأكد من احتوائها على كائنات يمكن فرزها.

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

لديك صفيف من كائنات رقمية وترغب في فرزها. هناك طريقتان أساسيتان للقيام بذلك: فرز و فرز!. يقوم الأول بإنشاء نسخة من الصفيف ، وفرزها وإعادتها. يقوم النوع الثاني بفرز الصفيف في مكانه.

هذا أمر بديهي. لذلك دعونا نتناولها قليلاً. ماذا لو كنت لا تريد الاعتماد على مشغل سفينة الفضاء؟ ماذا لو كنت تريد سلوكًا مختلفًا تمامًا؟ تأخذ طريقتا الفرز معلمة كتلة اختيارية. تأخذ هذه الكتلة معلمتين ويجب أن تعطي قيمًا تمامًا مثلما يفعل عامل سفينة الفضاء: -1 و 0 و 1. لذا ، بالنظر إلى مصفوفة ، نريد تصنيفها بحيث تأتي جميع القيم القابلة للقسمة على 3 أولاً ، وتأتي جميع القيم الأخرى بعدها. الترتيب الفعلي لا يهم هنا ، فقط أن تلك التي يمكن تقسيمها على 3 تأتي أولاً.

كيف يعمل هذا؟ أولاً ، لاحظ وسيطة الكتلة لطريقة الفرز. ثانيًا ، لاحظ الأقسام المعيارية التي تم إجراؤها على معلمات الكتلة ، وإعادة استخدام عامل سفينة الفضاء. إذا كان واحدًا من مضاعفات 3 ، فسيكون المعامل 0 ، وإلا فسيكون 1 أو 2. نظرًا لأن 0 سيتم الفرز قبل 1 أو 2 ، فلا يهم سوى النموذج. استخدام معلمة كتلة مفيد بشكل خاص في المصفوفات التي تحتوي على أكثر من نوع واحد من العناصر ، أو عندما تريد الفرز حسب الفئات المخصصة التي لا تحتوي على عامل سفينة فضاء محدد.

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

instagram story viewer