سيشرح هذا البرنامج التعليمي البحث الثنائي & amp؛ البحث الثنائي العودي في Java جنبًا إلى جنب مع الخوارزمية والتنفيذ وأمثلة Java Binary Seach Code:
البحث الثنائي في Java هو تقنية تُستخدم للبحث عن قيمة أو مفتاح مستهدف في مجموعة. إنها تقنية تستخدم تقنية "فرق تسد" للبحث عن مفتاح.
المجموعة التي سيتم تطبيق البحث الثنائي عليها للبحث عن مفتاح تحتاج إلى فرزها بترتيب تصاعدي.
عادة ، تدعم معظم لغات البرمجة تقنيات البحث الخطي والبحث الثنائي والتجزئة المستخدمة للبحث عن البيانات في المجموعة. سنتعلم التجزئة في دروسنا اللاحقة.
البحث الثنائي في Java
البحث الخطي هو أسلوب أساسي. في هذه التقنية ، يتم اجتياز المصفوفة بشكل تسلسلي ويتم مقارنة كل عنصر بالمفتاح حتى يتم العثور على المفتاح أو الوصول إلى نهاية المصفوفة.
نادرًا ما يستخدم البحث الخطي في التطبيقات العملية. البحث الثنائي هو الأسلوب الأكثر استخدامًا لأنه أسرع بكثير من البحث الخطي.
توفر Java ثلاث طرق لإجراء بحث ثنائي:
- استخدام النهج التكراري
- باستخدام نهج تعاودي
- باستخدام طريقة Arrays.binarySearch ().
في هذا البرنامج التعليمي ، سنقوم بتنفيذ ومناقشة كل هذه 3 طرق.
خوارزمية للبحث الثنائي في Java
في الثنائيطريقة البحث ، يتم تقسيم المجموعة بشكل متكرر إلى نصف ويتم البحث عن العنصر الرئيسي في النصف الأيسر أو الأيمن من المجموعة اعتمادًا على ما إذا كان المفتاح أقل أو أكبر من العنصر الأوسط للمجموعة.
خوارزمية بحث ثنائي بسيطة كما يلي:
- احسب العنصر الأوسط للمجموعة.
- قارن العناصر الرئيسية مع العنصر الأوسط.
- إذا كان المفتاح = العنصر الأوسط ، فسنقوم بإرجاع موضع الفهرس المتوسط للمفتاح الموجود.
- Else If key & gt؛ منتصف العنصر ، ثم يكمن المفتاح في النصف الأيمن من المجموعة. وهكذا كرر الخطوات من 1 إلى 3 في النصف السفلي (الأيمن) من المجموعة.
- Else key & lt؛ منتصف العنصر ، ثم يكون المفتاح في النصف العلوي من المجموعة. ومن ثم تحتاج إلى تكرار البحث الثنائي في النصف العلوي.
كما ترى من الخطوات أعلاه ، في البحث الثنائي ، يتم تجاهل نصف العناصر في المجموعة بعد المقارنة الأولى مباشرة.
لاحظ أن نفس تسلسل الخطوات ينطبق على البحث الثنائي التكراري والمتكرر.
دعنا نوضح خوارزمية البحث الثنائي باستخدام مثال.
على سبيل المثال ، خذ المصفوفة المرتبة التالية المكونة من 10 عناصر.
دعونا نحسب الموقع الأوسط للمصفوفة.
Mid = 0 + 9/2 = 4
# 1) Key = 21
أولاً ، سنقارن قيمة المفتاح مع [mid] ونجد أن قيمة العنصر عندmid = 21.
وهكذا نجد هذا المفتاح = [mid]. ومن ثم تم العثور على المفتاح في الموضع 4 في المصفوفة.
# 2) المفتاح = 25
نقارن المفتاح أولاً قيمة إلى منتصف. كما (21 & lt؛ 25) ، سنبحث مباشرة عن المفتاح في النصف العلوي من المصفوفة.
الآن سنجد منتصف النصف العلوي من المصفوفة. المصفوفة.
Mid = 4 + 9/2 = 6
القيمة في الموقع [mid] = 25
الآن نحن قارن العنصر الرئيسي مع العنصر الأوسط. لذلك (25 == 25) ، ومن ثم وجدنا المفتاح في الموقع [mid] = 6.
وهكذا نقسم المصفوفة مرارًا وتكرارًا ومن خلال مقارنة العنصر الرئيسي بالمنتصف ، نقرر في أي نصف ابحث عن المفتاح. يعد البحث الثنائي أكثر كفاءة من حيث الوقت والصحة وهو أسرع كثيرًا.
تنفيذ البحث الثنائي Java
باستخدام الخوارزمية أعلاه ، دعنا ننفذ برنامج بحث ثنائي في Java باستخدام نهج تكراري. في هذا البرنامج ، نأخذ مثالاً للمصفوفة ونجري بحثًا ثنائيًا على هذه المصفوفة.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("The input array: " + Arrays.toString(numArray)); //key to be searched int key = 20; System.out.println("\nKey to be searched=" + key); //set first to first index int first = 0; //set last to last elements in array int last=numArray.length-1; //calculate mid of the array int mid = (first + last)/2; //while first and last do not overlap while( first = last ){ //if the mid key, then key to be searched is in the first half of array if ( numArray[mid] last ){ System.out.println("Element is not found!"); } } }
الإخراج:
مصفوفة الإدخال: [5 ، 10 ، 15 ، 20 ، 25، 30، 35]
المفتاح المراد البحث عنه = 20
العنصر موجود في الفهرس: 3
البرنامج أعلاه يُظهر نهجًا تكراريًا للبحث الثنائي. في البداية ، يتم التصريح عن المصفوفة ، ثم يتم تحديد المفتاح المطلوب البحث عنه.
بعد حساب منتصف المصفوفة ، تتم مقارنة المفتاح بالعنصر الأوسط. ثم اعتمادا على ما إذا كانالمفتاح أقل من أو أكبر من المفتاح ، يتم البحث عن المفتاح في النصف السفلي أو العلوي من المصفوفة على التوالي.
بحث ثنائي متكرر في Java
يمكنك أيضًا إجراء بحث ثنائي باستخدام تقنية العودية. هنا ، يتم استدعاء طريقة البحث الثنائي بشكل متكرر حتى يتم العثور على المفتاح أو استنفاد القائمة بأكملها.
البرنامج الذي ينفذ بحثًا ثنائيًا متكررًا موضح أدناه:
import java.util.*; class Main{ //recursive method for binary search public static int binary_Search(int intArray[], int low, int high, int key){ //if array is in order then perform binary search on the array if (high>=low){ //calculate mid int mid = low + (high - low)/2; //if key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //if intArray[mid] > key then key is in left half of array if (intArray[mid] > key){ return binary_Search(intArray, low, mid-1, key);//recursively search for key }else //key is in right half of the array { return binary_Search(intArray, mid+1, high, key);//recursively search for key } } return -1; } public static void main(String args[]){ //define array and key int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("Input List: " + Arrays.toString(intArray)); int key = 31; System.out.println("\nThe key to be searched:" + key); int high=intArray.length-1; //call binary search method int result = binary_Search(intArray,0,high,key); //print the result if (result == -1) System.out.println("\nKey not found in given list!"); else System.out.println("\nKey is found at location: "+result + " in the list"); } }
الإخراج:
قائمة الإدخال: [1، 11، 21، 31، 41، 51، 61، 71، 81، 91
المفتاح المراد البحث عنه :
تم العثور على المفتاح في الموقع: 3 في القائمة
باستخدام طريقة Arrays.binarySearch ().
توفر فئة Arrays في Java طريقة "binarySearch ()" التي تقوم بإجراء بحث ثنائي على المصفوفة المحددة. تأخذ هذه الطريقة المصفوفة والمفتاح المراد البحث فيهما كوسيطات وتعيد موضع المفتاح في المصفوفة. إذا لم يتم العثور على المفتاح ، فإن الطريقة ترجع -1.
يقوم المثال أدناه بتنفيذ طريقة Arrays.binarySearch ().
import java.util.Arrays; class Main{ public static void main(String args[]){ //define an array int intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("The input Array : " + Arrays.toString(intArray)); //define the key to be searched int key = 50; System.out.println("\nThe key to be searched:" + key); //call binarySearch method on the given array with key to be searched int result = Arrays.binarySearch(intArray,key); //print the return result if (result 0) System.out.println("\nKey is not found in the array!"); else System.out.println("\nKey is found at index: "+result + " in the array."); } }
الإخراج:
صفيف الإدخال: [10، 20، 30، 40، 50، 60، 70، 80، 90]
المفتاح المطلوب البحث عنه: 50
تم العثور على المفتاح في الفهرس: 4 في المصفوفة.
الأسئلة المتداولة
Q # 1) كيف تكتب بحثًا ثنائيًا ؟
الإجابة: عادة ما يتم إجراء البحث الثنائي عن طريق تقسيم المصفوفة إلى نصفين. إذا كان المفتاح المطلوب البحث عنه أكبر من العنصر الأوسط ،ثم يتم البحث في النصف العلوي من المصفوفة عن طريق تقسيم المصفوفة الفرعية والبحث عنها حتى يتم العثور على المفتاح.
وبالمثل ، إذا كان المفتاح أقل من العنصر الأوسط ، فسيتم البحث عن المفتاح في الجزء السفلي نصف المصفوفة.
Q # 2) أين يستخدم البحث الثنائي؟
الإجابة: يستخدم البحث الثنائي أساسًا للبحث عن البيانات المصنفة في تطبيقات البرامج خاصة عندما تكون مساحة الذاكرة مضغوطة ومحدودة.
س # 3) ما هو O الكبير للبحث الثنائي؟
إجابة : التعقيد الزمني للبحث الثنائي هو O (logn) حيث n هو عدد العناصر في المصفوفة. تعقيد مساحة البحث الثنائي هو O (1).
Q # 4) هل البحث الثنائي متكرر؟
الإجابة: نعم. نظرًا لأن البحث الثنائي هو مثال على استراتيجية فرق تسد ويمكن تنفيذها باستخدام العودية. يمكننا تقسيم المصفوفة إلى نصفين واستدعاء نفس الطريقة لإجراء البحث الثنائي مرارًا وتكرارًا.
س # 5) لماذا يسمى البحث الثنائي؟
الإجابة: تستخدم خوارزمية البحث الثنائي استراتيجية فرق تسد التي تقطع المصفوفة بشكل متكرر إلى نصفين أو جزأين. وبالتالي يتم تسميته بالبحث الثنائي.
الخاتمة
البحث الثنائي هو تقنية البحث المستخدمة بكثرة في Java. شرط إجراء بحث ثنائي هو أنه يجب فرز البيانات بترتيب تصاعدي.
يمكن أن يكون البحث الثنائينفذت إما باستخدام نهج تكراري أو تكراري. توفر فئة المصفوفات في Java أيضًا طريقة 'binarySearch' التي تقوم بإجراء بحث ثنائي على المصفوفة.
في دروسنا اللاحقة ، سوف نستكشف تقنيات الفرز المختلفة في Java.