Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції 1.docx
Скачиваний:
3
Добавлен:
14.07.2019
Размер:
44.36 Кб
Скачать

Хеш таблиці – деяка структура даних що забезпечує збереження набору що ідентифікується ключем і основується на масивах.

Хешування - це процес кодування об’єкта , індексуванням по ключу.

  • Таблиці з прямою адресацією

  • Хеш таблиці

  • Хеш таблиці з відкритою адресацією

Таблиці з прямою адресацією

Для представлення множини об’єктів , що ідентифікуються ключем, використовується масив , в якому індекс відповідає значенню ключа.

Хеш таблиці

Для обрахування індексу елемента в масиві використовується хеш-функція.

Колізія - це ситуація коли 2 ключа можуть бути хешовані в елементи масиву з одиночним індексом.

Методи хешування

  1. Метод ділення

Хеш код вираховується діленням ключа по модуль ділення значення ключа на розмірність Самої таблиці.

Приклад 100/3=33->25-26->(37)

  1. Метод добутку

Ключ множиться на деяку константу із діапазона від 0 до 1 потім виділяються дробова частини, яка множиться на розмірність хеш – таблиці)

  1. Метод універсального хеширування

(для виявлення ключа використовується хеш – функція, випадково вибрання з деякого відібраного класа функцій)

Хеш – таблиці з відкритою адресацією

Всі об'єкти зберігаються безпосередньо в хеш – таблиці

Послідовність перевіряючих елементів обрахування :

  1. Лінійне зондування (хеширування)

  2. Двійне зондування (хеширування)

  3. Ідеальне хеширування

Алгоритм – це набір дій, що оприділяють порядок виконання кроків при вирішенні поставлених завдань.

Алгоритми характеризуються рядом властивостей

  1. Кінцевість

  2. Оприділеність

  3. Ввід

  4. Вивід

  5. Ефективність

1.Кінцевість

Алгоритм завжди повинен закінчуватися після кінцевого числа кроків.

Алгоритми Евкліда

  1. О=А%Б;

  2. О=0;

  3. А=Б; Б=О.

2. Оприділеність

Кожний крок алгоритму повинен бути строго оприділеним, кожний крок повинен бути строгими і недвозначними.

3.Ввід

Кожний алгоритм повинен мати певну кількість входящих даних.

  1. Вивід

Кожен алгоритм повинен мати певне число вихідних даних, як оприділення процесу обробки алгоритму.

  1. Ефективність

Ефективність оприділяється можливість реалізації певного процесу і виводити результат, при цьому якщо за допомогою ручки і листка можна обчислити алгоритм, значить він ефективний.

Лекція 3

Рекурсія

Рекурсивний алгоритм – це алгоритм який для проведення обчислення використовує розподіл обчислення на більш прості обчислення

Рекурсивна функція - це функція яка викликає сама себе, вона може замінюватися простим циклом , при її використанні певне обчислення визивається до певного моменту (обмеження)

Особливості

  • Повинна не мати бескінченного кількості викликів, потрібно наперед визначати кількість викликів,

  • Повинна мати граничне значення, для кількості викликання

  • Зменшуюча численість кількості значень.

Алгоритми «розділяй і владарюй»

Розділення великої структури і почергово її виконувати при цьому обчислюючи малі частини ми обійдемо всю велику структуру

Динамічне програмування

Динамічне програмування – це методика розробки алгоритмів , використовуючи метод «розділяй і владарюй» для завдань з незакінчуванимися підзадачами задачами .

Існує два види динамічного програмування:

  1. Висхідне (для отримання деякого значення на кожному кроці потрібно попереднє обчислення необхідних значень на попередніх кроках)

  2. Низхідне (значення, обчислення на попередніх шляхах і необхідні для отримання

значення на і-тому кроці, сохраняються і провіряються)

  1. Висхідні (Послідовність чисел Фібоначі)

public class Fibon_1 {

static int N = (int)(Math.random()*100) % 10;

public static int calc_f(int n) {

if (n < 1)

return 0;

if (n == 1)

return 1;

return calc_f(n-1) + calc_f(n-2);

}

public static void main(String [] args) {

for(int i=0; i<N; i++)

System.out.print(calc_f(i) + "\t");

}

}

  1. Низхідні

Public static Fibon_2{

Static int=N

Static int fib[]=new int[N];

Public static int calc_f(int k){

If (fib[K]!=0) return fib[k];

Int temp=k;

If(k==0)return 0;

If(k>1) temp=calc_f(k-1)+calc(k-2);

Return fib[k]=temp;

}

Public static void main(stri){

For (int i=0;i<n; i++)

System.out.print(calc_f(int))

}

}