Днес ще обсъдим какво е двоично търсене, как да го приложим итеративно и ползите от използването на двоично търсене за търсене на елемент в даден набор от данни.

Двоичното търсене е алгоритъм за търсене, при който разделяме даден набор от елементи от средата и сравняваме елемента, който трябва да се търси, с елемента в средата. Ако елементът е по-малък от средата, повтаряме процеса в първата половина на набора от данни, в противен случай във втората половина, докато елементът, който ще се търси, стане равен на средния елемент.

Алгоритъм

Нека разгледаме алгоритъма и да разберем как да приложим двоичното търсене.

int low = 0;
int high = arr.length - 1;

while (low <= high) {
    int mid = low + (high - low) / 2;

    if (key == arr[mid]) {
        return mid;
    } else if (key > arr[mid]) {
        low = mid + 1;
    } else {
        high = mid - 1;
    }
}

return -1;

В горния кодов фрагмент вземаме два индекса, low, зададен в началото на масива, и high, зададен в последния елемент в масива.
Работен цикъл върху масива, докато low стане по-малък или равен на индекса high, ние изчисляваме индекса mid във всяка итерация.
Имайки предвид елементът, в който ще се търси, се обозначава с променлива ключ,
Ако ключ е равен на елемента в средния индекс на масива, връщаме среден.
Ако ключът е по-голям от елемента в средния индекс на масива, задаваме ниския индекс на среден+1 елемент.
Ако ключът е по-малък от елемента в средния индекс на масива, задаваме висок индекс на среден 1 елемент.
Ако ключът не е намерен в масива, връщаме -1;

Времева и пространствена сложност

Двоичното търсене следва техниката "разделяй и владей".

Времева сложност: O(logn)
Всеки път, когато попаднем на алгоритъм, който следва техника "разделяй и владей", т.е. разделя масива наполовина с всяка итерация, времевата сложност ще бъде логаритмичен.

Пространствена сложност:O(1)
Двоичното търсене, когато се изпълнява итеративно, не използва допълнително пространство и следователно консумира постоянно място по време на изпълнението си.

Използване и ползи

Той стеснява набора от данни за търсене.
Може да се използва за ефективно търсене на елемент/обект в огромен набор от данни.
Може да се използва в други алгоритми за опростяване на крайната цел на алгоритъма.

Стигнахте до края на статията и сте готови да внедрите или използвате двоично търсене в реални решения.

Ще се видим в следващата статия, а дотогава hasta luego.