Идеята тук е, че разделяме една сложна задача на няколко по-прости, решаваме всяка една от тези по-малки задачи и накрая обединяваме решението в едно цяло.
Двоичното търсене е елементарен пример за такъв вид алгоритъм.
Трябва да кажа, че този подход е феноменален дори и извън програмирането. Аз лично го използвам почти винаги когато имам някаква тежка задача за вършене, но не искам да започна. 😃
---
ОПИСАНИЕ:
Този алгоритъм се използва за намиране на даден елемент в сортиран списък от елементи.
Двоичното търсене всъщност няма нищо общо с двоичната бройна система.
Идеята зад този алгоритъм е, че, тъй като входният ни списък е сортиран, няма нужда да сравняваме търсения елемент с всеки друг от списъка. Вместо това, можем да го сравним с елемента по средата и по този начин да разберем в коя част на масива се намира.
По този начин намаляваме значително времето за изпълнение, тъй като ограничаваме областта, в която ще търсим елемента.
Сложността му (в най-лошия случай) е O(log n), затова понякога се нарича и "логаритмично търсене".
АЛГОРИТЪМ:
1. Сравни търсения елемент с елемента по средата. *
Ако са равни, алгоритъмът приключва.
2. Ако НЕ СА равни:
- Ако търсеният елемент е по-малък от елемента по средата:
- повтори стъпка 1 за подмасива преди средния елемент.
- Ако търсеният елемент е по-голям от елемента по средата:
- повтори стъпка 1 за подмасива след средния елемент.
* Елементът с индекс (L+R) / 2 (целочислено деление), където L е първият валиден индекс от масива, а R e последният валиден индекс. Без значение е дали масивът е с четен или нечетен брой елементи.
ПРИМЕР:
Нека намерим елемента със стойност 6 в следния масив:
Индекс
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Стойност
|
-1
|
5
|
6
|
18
|
19
|
25
|
46
|
78
|
102
|
114
|
Първо трябва да определим средния елемент. Това е елементът с индекс (L+R) / 2. Тъй кaто първият валиден индекс е 0 (L = 0) и последният 9 (R = 9), индексът на средния елемент ще е (0+9) / 2 или, иначе казано, елементът с индекс 4 (не забравяйте, че взимаме цялата част от делението).
Индекс
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Стойност
|
-1
|
5
|
6
|
18
|
19
|
25
|
46
|
78
|
102
|
114
|
Виждаме, че този елемент има стойност 19 и 19 > 6 (търсения елемент), затова ще повторим процедурата за подмасива започващ от елемент 0 до 3 (очевидно няма да включим елемент 4, тъй като току що определихме, че е по-голям от търсения елемент):
Индекс
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Стойност
|
-1
|
5
|
6
|
18
|
19
|
25
|
46
|
78
|
102
|
114
|
Индекс
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Стойност
|
-1
|
5
|
6
|
18
|
19
|
25
|
46
|
78
|
102
|
114
|
Индекс
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Стойност
|
-1
|
5
|
6
|
18
|
19
|
25
|
46
|
78
|
102
|
114
|
Сега границите са L = 2 и R = 3. Средният елемент е този с индекс 2:
Индекс
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Стойност
|
-1
|
5
|
6
|
18
|
19
|
25
|
46
|
78
|
102
|
114
|
Приключваме и се самопотупваме по рамото за добре свършена работа. 😀
ИМПЛЕМЕНТАЦИЯ (Java):
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class BinarySearch { | |
// Returns index of 'searchValue' in 'arr' by using Binary Search | |
static int binarySearch(int[] arr, int searchValue) { | |
int L = 0; | |
int R = arr.length - 1; | |
while (L <= R) { | |
int middleElementIndex = (L+R) / 2; | |
if (searchValue < arr[middleElementIndex]) { | |
R = middleElementIndex - 1; | |
} | |
else if (searchValue > arr[middleElementIndex]) { | |
L = middleElementIndex + 1; | |
} | |
else { | |
int searchValueIndex = middleElementIndex; | |
return searchValueIndex; | |
} | |
} | |
return -1; // element is not present in the array | |
} | |
public static void main(String[] args) { | |
int[] arr = new int[] { -1, 5, 6, 18, 19, 25, 46, 78, 102, 114 }; | |
System.out.println( | |
binarySearch(arr, 6) | |
); | |
} | |
} |
---
Това е за днес! Ако видите някоя грешка, кажете ми и реакцията ми ще е нещо като това. 😅
Няма коментари:
Публикуване на коментар