Hướng dẫn này sẽ giải thích tìm kiếm nhị phân & Tìm kiếm nhị phân đệ quy trong Java cùng với Thuật toán, Triển khai và Mã tìm kiếm nhị phân Java của nó Ví dụ:
Tìm kiếm nhị phân trong Java là một kỹ thuật được sử dụng để tìm kiếm một giá trị hoặc khóa được nhắm mục tiêu trong một bộ sưu tập. Đây là một kỹ thuật sử dụng kỹ thuật “chia để trị” để tìm khóa.
Tập hợp mà tìm kiếm nhị phân sẽ được áp dụng để tìm kiếm khóa cần được sắp xếp theo thứ tự tăng dần.
Thông thường, hầu hết các ngôn ngữ lập trình đều hỗ trợ các kỹ thuật Tìm kiếm tuyến tính, Tìm kiếm nhị phân và Băm được sử dụng để tìm kiếm dữ liệu trong bộ sưu tập. Chúng ta sẽ học hàm băm trong các hướng dẫn tiếp theo.
Tìm kiếm nhị phân trong Java
Tìm kiếm tuyến tính là một kỹ thuật cơ bản. Trong kỹ thuật này, mảng được duyệt theo trình tự và mỗi phần tử được so sánh với khóa cho đến khi tìm thấy khóa hoặc đến cuối mảng.
Tìm kiếm tuyến tính hiếm khi được sử dụng trong các ứng dụng thực tế. Tìm kiếm nhị phân là kỹ thuật được sử dụng thường xuyên nhất vì nó nhanh hơn nhiều so với tìm kiếm tuyến tính.
Java cung cấp ba cách để thực hiện tìm kiếm nhị phân:
- Sử dụng phương pháp lặp
- Sử dụng phương pháp đệ quy
- Sử dụng phương thức Arrays.binarySearch().
Trong hướng dẫn này, chúng ta sẽ thực hiện và thảo luận về tất cả những điều này 3 phương thức.
Thuật toán tìm kiếm nhị phân trong Java
Trong nhị phânphương pháp tìm kiếm, bộ sưu tập được chia thành một nửa nhiều lần và phần tử khóa được tìm kiếm ở nửa bên trái hoặc bên phải của bộ sưu tập tùy thuộc vào việc khóa nhỏ hơn hay lớn hơn phần tử ở giữa của bộ sưu tập.
Một thuật toán tìm kiếm nhị phân đơn giản như sau:
- Tính toán phần tử giữa của bộ sưu tập.
- So sánh các mục chính với phần tử giữa.
- Nếu khóa = phần tử ở giữa, thì chúng tôi trả về vị trí chỉ mục ở giữa cho khóa được tìm thấy.
- Khác Nếu khóa > giữa, thì khóa nằm ở nửa bên phải của tập hợp. Do đó, hãy lặp lại các bước từ 1 đến 3 ở nửa dưới (bên phải) của bộ sưu tập.
- Phím khác giữa, thì khóa nằm ở nửa trên của bộ sưu tập. Do đó, bạn cần lặp lại tìm kiếm nhị phân ở nửa trên.
Như bạn có thể thấy từ các bước trên, trong tìm kiếm nhị phân, một nửa phần tử trong tập hợp bị bỏ qua ngay sau lần so sánh đầu tiên.
Lưu ý rằng trình tự các bước giống nhau áp dụng cho tìm kiếm nhị phân lặp lại cũng như đệ quy.
Hãy minh họa thuật toán tìm kiếm nhị phân bằng một ví dụ.
Ví dụ , lấy mảng 10 phần tử đã sắp xếp sau đây.
Hãy tính vị trí chính giữa của mảng.
Mid = 0+9/2 = 4
#1) Key = 21
Đầu tiên, chúng ta sẽ so sánh giá trị của key với phần tử [mid] và chúng tôi thấy rằng giá trị phần tử tạimid = 21.
Do đó, chúng tôi tìm thấy khóa đó = [mid]. Do đó, khóa được tìm thấy ở vị trí 4 trong mảng.
#2) Khóa = 25
Trước tiên, chúng tôi so sánh khóa giá trị đến trung bình. Vì (21 25), chúng ta sẽ trực tiếp tìm khóa ở nửa trên của mảng.
Bây giờ, một lần nữa chúng ta sẽ tìm phần giữa của nửa trên của mảng mảng.
Mid = 4+9/2 = 6
Giá trị tại vị trí [mid] = 25
Bây giờ chúng ta so sánh phần tử chính với phần tử giữa. Vì vậy (25 == 25), do đó chúng tôi đã tìm thấy khóa tại vị trí [giữa] = 6.
Vì vậy, chúng tôi liên tục chia mảng và bằng cách so sánh phần tử chính với phần giữa, chúng tôi quyết định nửa nào sẽ tìm kiếm chìa khóa. Tìm kiếm nhị phân hiệu quả hơn về mặt thời gian và độ chính xác, đồng thời cũng nhanh hơn rất nhiều.
Triển khai tìm kiếm nhị phân Java
Sử dụng thuật toán trên, chúng ta hãy triển khai chương trình tìm kiếm nhị phân trong Java bằng cách sử dụng cách tiếp cận lặp đi lặp lại. Trong chương trình này, chúng tôi lấy một mảng ví dụ và thực hiện tìm kiếm nhị phân trên mảng này.
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!"); } } }
Đầu ra:
Mảng đầu vào: [5, 10, 15, 20 , 25, 30, 35]
Khóa cần tìm=20
Phần tử được tìm thấy tại chỉ mục: 3
Chương trình trên cho thấy một cách tiếp cận lặp đi lặp lại của tìm kiếm nhị phân. Đầu tiên khai báo mảng, sau đó xác định khóa cần tìm.
Sau khi tính phần giữa của mảng, khóa được so sánh với phần tử ở giữa. Sau đó tùy theokhóa nhỏ hơn hoặc lớn hơn khóa, khóa được tìm kiếm tương ứng ở nửa dưới hoặc nửa trên của mảng.
Tìm kiếm nhị phân đệ quy trong Java
Bạn cũng có thể thực hiện tìm kiếm nhị phân sử dụng kỹ thuật đệ quy. Ở đây, phương pháp tìm kiếm nhị phân được gọi đệ quy cho đến khi tìm thấy khóa hoặc toàn bộ danh sách đã hết.
Chương trình thực hiện tìm kiếm nhị phân đệ quy được cung cấp bên dưới:
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"); } }
Đầu ra:
Danh sách đầu vào: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
Khóa cần tìm :
Khóa được tìm thấy tại vị trí: 3 trong danh sách
Sử dụng phương thức Arrays.binarySearch().
Lớp Arrays trong Java cung cấp phương thức 'binarySearch()' để thực hiện tìm kiếm nhị phân trên Mảng đã cho. Phương thức này lấy mảng và khóa cần tìm làm đối số và trả về vị trí của khóa trong mảng. Nếu không tìm thấy khóa, thì phương thức trả về -1.
Ví dụ bên dưới triển khai phương thức 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."); } }
Đầu ra:
Mảng đầu vào : [10, 20, 30, 40, 50, 60, 70, 80, 90]
Khóa cần tìm:50
Khóa được tìm thấy tại chỉ mục: 4 trong mảng.
Câu hỏi thường gặp
Hỏi #1) Bạn viết tìm kiếm nhị phân như thế nào ?
Trả lời: Tìm kiếm nhị phân thường được thực hiện bằng cách chia mảng thành hai nửa. Nếu khóa cần tìm lớn hơn phần tử ở giữa,sau đó nửa trên của mảng được tìm kiếm bằng cách chia tiếp và tìm kiếm mảng con cho đến khi tìm thấy khóa.
Tương tự, nếu khóa nhỏ hơn phần tử ở giữa thì khóa được tìm kiếm ở phần dưới một nửa mảng.
Q #2) Tìm kiếm nhị phân được sử dụng ở đâu?
Trả lời: Tìm kiếm nhị phân chủ yếu được sử dụng để tìm kiếm một dữ liệu được sắp xếp trong các ứng dụng phần mềm, đặc biệt khi không gian bộ nhớ nhỏ gọn và hạn chế.
Hỏi #3) O lớn của tìm kiếm nhị phân là gì?
Trả lời : Độ phức tạp về thời gian của tìm kiếm nhị phân là O (logn) trong đó n là số phần tử trong mảng. Độ phức tạp không gian của tìm kiếm nhị phân là O (1).
Q #4) Tìm kiếm nhị phân có phải là đệ quy không?
Trả lời: Có. Vì tìm kiếm nhị phân là một ví dụ về chiến lược chia để trị và nó có thể được thực hiện bằng cách sử dụng đệ quy. Chúng ta có thể chia mảng thành hai nửa và gọi cùng một phương thức để thực hiện tìm kiếm nhị phân nhiều lần.
Hỏi #5) Tại sao nó được gọi là tìm kiếm nhị phân?
Trả lời: Thuật toán tìm kiếm nhị phân sử dụng chiến lược chia để trị liên tục cắt mảng thành hai hoặc hai phần. Do đó, nó được đặt tên là tìm kiếm nhị phân.
Kết luận
Tìm kiếm nhị phân là kỹ thuật tìm kiếm thường được sử dụng trong Java. Yêu cầu để thực hiện tìm kiếm nhị phân là dữ liệu phải được sắp xếp theo thứ tự tăng dần.
Tìm kiếm nhị phân có thể đượcđược thực hiện bằng cách sử dụng phương pháp lặp hoặc đệ quy. Lớp Mảng trong Java cũng cung cấp phương thức 'binarySearch' để thực hiện tìm kiếm nhị phân trên Mảng.
Trong các hướng dẫn tiếp theo, chúng ta sẽ khám phá các Kỹ thuật sắp xếp khác nhau trong Java.