Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MEGAPACK_version_final.doc
Скачиваний:
6
Добавлен:
15.09.2019
Размер:
2.34 Mб
Скачать

50. Двійковий пошук на впорядкованій множині.

Если данные, в которых производится поиск, отсортированы, для нахождения элемента можно применять двоичный поиск. В нем применяется метод половинного деления. Сначала проверим средний элемент. Если он больше, чем искомый ключ, проверим средний элемент первой половины, в противном случае — средний элемент второй половины. Будем повторять эту процедуру до тех пор, пока искомый элемент не будет найден либо пока не останется очередного элемента.

Например, чтобы найти число 4 в массиве

1 2 3 4 5 6 7 8 9

при двоичном поиске сначала проверяется средний элемент — число 5. Поскольку оно больше, чем 4, поиск продолжается в первой половине:

1 2 3 4 5

Средний элемент теперь равен 3. Это меньше, чем 4, поэтому первая половина отбрасывается. Поиск продолжается в части

4 5

На этот раз искомый элемент найден.

В двоичном поиске количество сравнений в худшем случае равно log2n

В среднем случае количество немного ниже, а в лучшем — количество сравнений равно 1.

Ниже приведена функция двоичного поиска для массивов символов. Этот поиск можно адаптировать для произвольных структур данных, изменив фрагмент сравнения.

/* Двоичный поиск */

int binary_search(char *items, int count, char key)

{

int low, high, mid;

low = 0; high = count-1;

while(low <= high) {

mid = (low+high)/2;

if(key < items[mid]) high = mid-1;

else if(key > items[mid]) low = mid+1;

else return mid; /* ключ найден */

}

return -1;

}

Практическое применение метода двоичного поиска очень широко. Перечислим основные способы:

  • Самое широкое распространение метод получил в информатике для навигации (поиска) в структурах данных.

  • Также его применяют в качестве численного метода для нахождения приближённого решения уравнений.

  • Метод служит для нахождения экстремума целевой функции и в этом случае является методом условной одномерной оптимизации.

51. Динамічні структури даних. Стеки. Черги.

Незважаючи на те, що терміни тип даних та структура даних звучать дещо схоже, проте вони мають різний підтекст.

Як говорилося раніше, тип даних - це множина значень, які може приймати змінна деякого типу. А структури даних представляють собою набір даних, можливо різних типів, що об'єднані певним чином.

Базовим елементом структури даних є елемент (вузол), який призначений для зберігання певного типу даних. Якщо елементи зв'язані між собою за допомогою покажчиків, то такий спосіб організації даних називається динамічними структурами даних, так як їх розмір динамічно змінюється під час виконання програми.

Стек - динамічна структура даних, яка представляє собою впорядкований набір елементів, в якому додавання нових елементів і видалення існуючих проходить з одного кінця, який називається вершиною стека. Стек реалізує принцип LIFO (last in - first out, останнім прийшов - першим пішов). Найбільш наглядним прикладом організації стеку може бути дитяча пірамідка, де додавання і знімання кілець здійснюється як раз відповідно до цього принципу.      Основні операції, які можна виконувати над стеками :       • додавання елемента в стек;       • вилучення елемента із стека;       • перевірка, чи порожній стек;       • перегляд елемента у вершині стека без видалення;       • очистка стека. Стек створюється так само, як і лінійний список, так як стек є частковим випадком односпрямованого списку.  Реалізація стека : 1. Початкове формування стеку 2. Занесення значення в стек 3. Вилучення елемента зі стека Черга - це лінійний список, де елементи вилучаються з початку списку, а додаються в кінець (як звичайна черга в магазині).  Двостороння черга - це лінійний список, у якого операції додавання, вилучення і доступу до елементів можливі як спочатку так і в кінці списку. Таку чергу можна уявити як послідовність книг, що стоять на полиці так, що доступ до них можливий з обох кінців.  Черга є частковим випадком односпрямованого списку. Вона реалізує принцип FIFO (first in - first out, першим прийшов - першим пішов).  Черги створюються аналогічно до лінійних списків та стеків. 1. Початкове формування черги 2. Додавання елемента в кінець 3. Вилучення елемента з кінця

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]