ეს სახელმძღვანელო აგიხსნის ორობით ძიებას & amp; რეკურსიული ორობითი ძებნა ჯავაში მის ალგორითმთან, იმპლემენტაციასთან და ჯავის ორობითი საძიებო კოდთან ერთად მაგალითები:
ორობითი ძებნა ჯავაში არის ტექნიკა, რომელიც გამოიყენება კოლექციის მიზნობრივი მნიშვნელობის ან გასაღების მოსაძებნად. ეს არის ტექნიკა, რომელიც იყენებს "დაყავი და იბატონე" ტექნიკას გასაღების მოსაძებნად.
კრებული, რომელზედაც ორობითი ძიება უნდა იქნას გამოყენებული გასაღების მოსაძებნად, უნდა დალაგდეს ზრდადი თანმიმდევრობით.
ჩვეულებრივ, პროგრამირების ენების უმეტესობა მხარს უჭერს Linear Search, Binary Search და Hashing ტექნიკას, რომლებიც გამოიყენება კოლექციაში მონაცემების მოსაძიებლად. ჩვენ ვისწავლით ჰეშინგს ჩვენს შემდგომ გაკვეთილებში.
ორობითი ძებნა Java-ში
ხაზოვანი ძიება არის ძირითადი ტექნიკა. ამ ტექნიკაში, მასივი თანმიმდევრულად იკვეთება და თითოეული ელემენტი შედარებულია გასაღებთან, სანამ გასაღები არ მოიძებნება ან მასივის დასასრული არ მიიღწევა.
ხაზოვანი ძიება იშვიათად გამოიყენება პრაქტიკულ აპლიკაციებში. ორობითი ძებნა არის ყველაზე ხშირად გამოყენებული ტექნიკა, რადგან ის ბევრად უფრო სწრაფია, ვიდრე ხაზოვანი ძიება.
Java გთავაზობთ ორობითი ძიების განხორციელების სამ გზას:
- გამოყენებით განმეორებითი მიდგომა
- რეკურსიული მიდგომის გამოყენება
- Arrays.binarySearch () მეთოდის გამოყენება.
ამ სახელმძღვანელოში ჩვენ განვახორციელებთ და განვიხილავთ ამ ყველაფერს 3 მეთოდი.
ალგორითმი ორობითი ძებნისთვის ჯავაში
ორობითიძიების მეთოდით, კოლექცია არაერთხელ იყოფა ნახევრად და საკვანძო ელემენტი იძებნება კოლექციის მარცხენა ან მარჯვენა ნახევარში იმის მიხედვით, არის თუ არა გასაღები კრებულის შუა ელემენტზე ნაკლები ან მეტი.
ორობითი ძიების მარტივი ალგორითმი ასეთია:
- გამოთვალეთ კოლექციის შუა ელემენტი.
- შეადარეთ ძირითადი ელემენტები შუა ელემენტთან.
- თუ გასაღები = შუა ელემენტი, მაშინ ჩვენ ვაბრუნებთ ნაპოვნი გასაღების შუა ინდექსის პოზიციას.
- Else If key > შუა ელემენტი, მაშინ გასაღები დევს კოლექციის მარჯვენა ნახევარში. ამრიგად, გაიმეორეთ ნაბიჯები 1-დან 3-მდე კოლექციის ქვედა (მარჯვნივ) ნახევარზე.
- Else კლავიში შუა ელემენტი, მაშინ გასაღები არის კოლექციის ზედა ნახევარში. აქედან გამომდინარე, თქვენ უნდა გაიმეოროთ ორობითი ძებნა ზედა ნახევარში.
როგორც ზემოაღნიშნული საფეხურებიდან ხედავთ, ბინარული ძიებაში კოლექციის ელემენტების ნახევარი იგნორირებულია პირველი შედარების შემდეგ.
გაითვალისწინეთ, რომ ნაბიჯების ერთი და იგივე თანმიმდევრობა მოქმედებს როგორც განმეორებადი, ასევე რეკურსიული ორობითი ძიებისთვის.
მოდით, ილუსტრაციით ორობითი ძიების ალგორითმი მაგალითის გამოყენებით.
მაგალითად , ავიღოთ 10 ელემენტისგან შემდგარი შემდეგი დახარისხებული მასივი.
მოდით გამოვთვალოთ მასივის შუა მდებარეობა.
Mid = 0+9/2 = 4
#1) გასაღები = 21
პირველ რიგში, ჩვენ შევადარებთ გასაღების მნიშვნელობას [შუა] ელემენტი და ჩვენ აღმოვაჩენთ, რომ ელემენტის მნიშვნელობა არისmid = 21.
ამგვარად, ჩვენ ვპოულობთ, რომ გასაღები = [შუა]. მაშასადამე, გასაღები ნაპოვნია მასივის მე-4 პოზიციაზე.
#2) გასაღები = 25
პირველ რიგში ვადარებთ გასაღებს ღირებულება შუა რიცხვებამდე. როგორც (21 25), ჩვენ პირდაპირ მოვძებნით გასაღებს მასივის ზედა ნახევარში.
ახლა კვლავ ვიპოვით შუას ზედა ნახევრისთვის. მასივი.
შუა = 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 კლასი უზრუნველყოფს "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) სად გამოიყენება ბინარული ძიება?
პასუხი: ორობითი ძიება ძირითადად გამოიყენება საძიებლად დალაგებულია მონაცემები პროგრამულ პროგრამებში, განსაკუთრებით მაშინ, როდესაც მეხსიერების სივრცე კომპაქტური და შეზღუდულია.
Q #3) რა არის ორობითი ძიების დიდი O?
პასუხი : ორობითი ძიების დროის სირთულე არის O (logn), სადაც n არის მასივის ელემენტების რაოდენობა. ორობითი ძიების სივრცის სირთულე არის O (1).
Q #4) ბინარული ძიება რეკურსიულია?
პასუხი: დიახ. ვინაიდან ორობითი ძიება არის გაყოფა და იბატონე სტრატეგიის მაგალითი და ის შეიძლება განხორციელდეს რეკურსიის გამოყენებით. შეგვიძლია მასივი გავყოთ ნახევრად და გამოვიძახოთ იგივე მეთოდი ორობითი ძიების განმეორებით შესასრულებლად.
Q #5) რატომ ჰქვია ორობითი ძიება?
პასუხი: ბინარული ძიების ალგორითმი იყენებს გაყოფა და იბატონე სტრატეგიას, რომელიც განმეორებით ჭრის მასივს ნახევრად ან ორ ნაწილად. ამიტომ მას უწოდებენ ორობით ძიებას.
დასკვნა
ორობითი ძებნა არის ხშირად გამოყენებული საძიებო ტექნიკა Java-ში. ორობითი ძიების განხორციელების მოთხოვნაა ის, რომ მონაცემები უნდა იყოს დალაგებული ზრდადი თანმიმდევრობით.
ორობითი ძიება შეიძლება იყოსგანხორციელებული ან განმეორებითი ან რეკურსიული მიდგომის გამოყენებით. მასივების კლასი Java-ში ასევე უზრუნველყოფს "ბინარული ძიების" მეთოდს, რომელიც ახორციელებს ორობით ძიებას მასივზე.
ჩვენს შემდგომ გაკვეთილებში ჩვენ განვიხილავთ ჯავაში დალაგების სხვადასხვა ტექნიკას. . 23>