سؤال

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

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

المحلول

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

نصائح أخرى

بيت القصيد من البحث الثنائي هو أنه بما أنه تم فرز البيانات بالفعل، يمكنك تحديد موقع المعلومات التي تريدها بسرعة.

خذ دليل الهاتف، الذي تم فرزه حسب الاسم الأخير.

كيف يمكنك العثور على شخص ما في دليل الهاتف؟تفتحه على صفحة تفترض أنها ستكون قريبة مما تريد، ثم تبدأ في تقليب الصفحات.

لكنك لا تقلب صفحة واحدة في كل مرة، إذا فاتك الكثير، تقلب مجموعة من الصفحات، ثم تبدأ أخيرًا في تقليب صفحة واحدة في كل مرة، حتى تبدأ أخيرًا في النظر إلى صفحة واحدة.

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

يقوم البحث الثنائي بإجراء مقارنة واحدة لكل عدد مضاعف من العناصر.لذا، فإن مجموعة العناصر المكونة من 1024 عنصر تتطلب حوالي 10 مقارنات، على الأكثر، للعثور على معلوماتك، أو على الأقل معرفة عدم وجودها.

إذا قمت، قبل تشغيل البحث الثنائي الفعلي، بإجراء فحص كامل للتحقق من فرز البيانات، فمن الأفضل أن تقوم فقط بإجراء فحص للمعلومات.سيتطلب التشغيل الكامل + البحث الثنائي عمليات N + log2 N، لذلك بالنسبة لـ 1024 عنصرًا، سيتطلب الأمر حوالي 1034 مقارنة، في حين أن المسح البسيط للمعلومات سيتطلب في المتوسط ​​النصف، وهو 512.

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


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

نعم ، يتضمن البحث الثنائي خطوات 0 (سجل n) والتحقق من أن التسلسل بالكامل يتضمن خطوات 0 (ن). من وجهة نظري ، من الجيد التحقق من ذلك في وضع التصحيح ، وليس أثناء الإصدار.

بحث ثنائي يفترض أنه يتم فرز بيانات الإدخال. إذن أنت على صواب.

الآن في التحقق بشكل عام ما إذا تم فرز البيانات بعض الوقت. لذا فإن تنفيذ هذا قبل كل بحث سيجعل البحث غير فعال حقًا.

المزيد من التفاصيل.

افترض أن "N" هو مقدار بياناتك.

البحث الثنائي الاحتياجات O(log(n)) العملية في أسوأ الحالات للعثور على عنصر. التأكد من أن البيانات يتم فرزها تتطلب O(n) عمليات.

لذلك إذا كنا سنتحقق من الشرط المسبق في كل مرة لكبر كبير جدًا n سنبدأ قضاء معظم الوقت في التحقق من الشرط المسبق من إجراء البحث الفعلي.

وليس من الصعب تحديد متى سترى مثل هذا التأثير. لقد حسبت مقدار الوقت الذي ستنفق فيه على البحث المسبق مقابل البحث الفعلي

  • لعنصر واحد لا تقضي أي وقت في البحث.
  • لعناصر 2 تنفق 50 ٪ على البحث.
  • مقابل 5 عناصر تنفقها 46 ٪ على البحث
  • مقابل 20 عنصرًا تنفق 22 ٪ على البحث.
  • مقابل 100 عنصر تنفق 7 ٪ على البحث.

وهلم جرا. في كل حالة ترتاح في الوقت المحدد هو الإنفاق على الشروط المسبقة.

بالإضافة إلى ما قاله أي شخص آخر عن وقت التشغيل (O (N) للتحقق من جميع العناصر ، مقابل O (سجل (N)) لتشغيل البحث الثنائي.)

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

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

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

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

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

بافتراض أن المروحة يمكن أن تعمل بأي سرعة من 0 دورة في الدقيقة إلى 5000 دورة في الدقيقة، فلن يتعين عليك في الواقع إنشاء قائمة بالسرعات المحتملة.يمكنك فقط العثور على متوسط ​​الحد الأدنى والحد الأقصى السابق في كل خطوة من خطوات البحث الثنائي.

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