عثرت على مجموعة من علماء الرياضيات الذين يغنّون ويكتبون الأغاني أيضًا. لقد ألّفوا أغنية لكل عدد من أعدادهم المفضلة، وكما يمكنك أن تتخيل، لديهم الكثير من الأعداد المفضلة (مثل 0 أو 73 أو 6174).
أنت متشوّق لسماع الأغنية الخاصة بعددك المفضل، لكن مع كل هذه الأغاني التي عليك تصفّحها، قد يستغرق العثور على الأغنية المناسبة بعض الوقت. لحسن الحظ، رتّبوا أغانيهم في قائمة تشغيل مرتّبة حسب العنوان، وهو ببساطة العدد الذي تدور حوله الأغنية.
تدرك أنه يمكنك استخدام خوارزمية البحث الثنائي للعثور على أغنية بسرعة انطلاقًا من عنوانها.
مهمتك هي تنفيذ خوارزمية بحث ثنائي.
تعثر خوارزمية البحث الثنائي على عنصر في مصفوفة عبر تقسيمها إلى نصفين مرارًا، مع الاحتفاظ فقط بالنصف الذي يحتوي على العنصر الذي نبحث عنه. وهي تتيح لنا تضييق المواضع المحتملة لعنصرنا بسرعة حتى نجده، أو حتى نستبعد جميع المواضع الممكنة.
لا يعمل البحث الثنائي إلا عندما تكون المصفوفة مرتبة.
تبدو الخوارزمية هكذا:
إليك مثال:
لنفترض أننا نبحث عن العدد 23 في المصفوفة المرتبة التالية: [4, 8, 12, 16, 23, 28, 32].
[23, 28, 32].[23].ينبغي أن يطابق حلك سلوك دوال searchsorted المدمجة في Julia بالنسبة إلى حالات الاختبار.
وهذا يعني أنك، بدلًا من إرجاع فهرس أول عنصر مطابق تجده في المصفوفة، ستُرجع مدى يكون حده الأدنى فهرس أول عنصر مطابق في المصفوفة، وحده الأعلى فهرس آخر عنصر مطابق فيها.
لكن، لتبسيط حلك يمكنك أن تفترض أن العنصر المستهدف غير مكرر، باستثناء مجموعة اختبارات المهمة الإضافية الخاصة بالتطابقات المتعددة.
إذا لم يكن العنصر المبحوث عنه موجودًا في المصفوفة، فيجب أن تُرجع مدى فارغًا حده الأدنى هو الفهرس الذي يمكن عنده إدراج العنصر في المصفوفة المرتبة. والمدى الفارغ هو أي مدى يكون حده الأعلى أصغر من حده الأدنى.
اقرأ التوثيق والأمثلة الخاصة بدالة searchsorted لمزيد من التفاصيل:
searchsorted(a, x; by=<transform>, lt=<comparison>, rev=false)
Return the range of indices of a which compare as equal to x (using binary
search) according to the order specified by the by, lt and rev keywords,
assuming that a is already sorted in that order.
Return an empty range located at the insertion point if a does not contain
values equal to x.
See also: insorted, searchsortedfirst, sort, findall.
Examples
julia> searchsorted([1, 2, 4, 5, 5, 7], 4) # single match
3:3
julia> searchsorted([1, 2, 4, 5, 5, 7], 5) # multiple matches
4:5
julia> searchsorted([1, 2, 4, 5, 5, 7], 3) # no match, insert in the middle
3:2
julia> searchsorted([1, 2, 4, 5, 5, 7], 9) # no match, insert at end
7:6
julia> searchsorted([1, 2, 4, 5, 5, 7], 0) # no match, insert at start
1:0
by وlt وrev، بحيث يحدد by تحويلًا يُطبَّق على جميع عناصر المصفوفة، ويحدد lt مقارنة، ويحدد rev ما إذا كانت المصفوفة مرتبة بترتيب عكسي. وعند استخدام هذه المعاملات يجب أن تفترض أن المصفوفة قد رُتبت بالفعل باستخدام هذه المعاملات. راجع توثيق sort لمزيد من التفاصيل.سجّل في Exercism لتتعلّم وتتقن Julia عبر 35 مفهومًا128 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.