SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Лекция 3

Бинарный поиск
Связные списки
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики

http://www.mkurnosov.net/teaching
Контроль
 Свойства O, Θ, Ω
1.
2.
3.
4.
5.

O(3n3 + 1000n2) = …. ?
Θ(n2 + logn) = ….
O(nlogn + n2 ) = …. ?
O(2n + n6 – 1000n3) = …. ?
Ω(n6 + n!) = …. ?

 Алгоритмы сортировки
1. Алгоритмы сортировки со сложностью O(nlogn)
в худшем случае?
2. Сортировка за линейное время в худшем случае?

3. Что такое сортировка “на месте” (in place)?
4. QuickSort vs. MergeSort

2
Задача поиска элемента по ключу
 Имеется последовательность ключей
𝑎1 , 𝑎2 , … , 𝑎 𝑖 , … , 𝑎 𝑛
 Требуется найти индекс (номер) ключа, который совпадает
с заданным ключом key
Пример
Дана последовательность из 10 ключей
Требуется найти элемент с ключом key = 181
Index

1

2

3

4

5

6

7

8

9

10

Key

178

150

190

177

155

181

179

167

204

175

Data

Решение – искомый элемент с индексом 6

3
Линейный поиск (Linear search)
function Search(v[1:n], n, value)
for i = 1 to n do
if v[i] = value then
return i
end if
end for
return -1
end function

TLinearSearch = O(n)

 Просматриваем элементы с начиная с первого
и сравниваем ключи
 В худшем случае искомый элемент находится в конце
массива или отсутствует
 Количество операций в худшем случае (worst case)
T(n) = 2n = O(n)

4
Бинарный поиск (Binary Search)
 Имеется упорядоченная последовательность ключей

𝑎1 ≤ 𝑎2 ≤ ⋯ ≤ 𝑎 𝑖 ≤ ⋯ ≤ 𝑎 𝑛
 Требуется найти позицию элемента, ключ которого
совпадает с заданным ключом key

 Бинарный поиск (Binary search)
1. Если центральный элемент равен искомому, конец
2. Если центральный меньше, делаем текущей правую половину массива
3. Если центральный больше, делаем текущей левую половину массива
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

2

3

3

5

7

9

13

23

25

29

31

33

37

41

42

46

49

50

52

67

73

81

94

Поиск key = 42

5
Бинарный поиск (Binary Search)
function BinarySearch(v[1:n], n, key)
l = 1
// Левая граница массива (low)
h = n
// Правая граница массива (high)
while l <= h do
mid = (l + h) / 2
// Возможно переполнение mid,
// Решение: mid = l + ((h - l) / 2)
if v[mid] = key then
return mid
else if key > v[mid] then
l = mid + 1
else
h = mid - 1
end if
end while
return -1
end function
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

2

3

3

5

7

9

13

23

25

29

31

33

37

41

42

46

49

50

52

67

73

81

94

key = 100 (worst case)

6
Эффективность бинарного поиска
function BinarySearch(v[1:n], n, key)
l = 1
// Левая граница массива (low)
h = n
// Правая граница массива (high)
while l <= h do
mid = (l + h) / 2
// 2 операции
if v[mid] = key then // 2 оп.
return mid
else if key > v[mid] then // 2 оп.
l = mid + 1
// 1 оп.
else
h = mid - 1
end if
end while
Количество операций в худшем случае
return -1
end function

T(n) = 2 + kTwhile + 1 = 7k + 3

 k – количество итераций цикла while
 Twhile – количество операций в теле цикла while
 Twhile = 2 + 2 + 2 + 1 = 7

7
Эффективность бинарного поиска
function BinarySearch(v[1:n], n, Количество k разбиений массива
key)
l = 1
// Левая граница массива (low)
h = n
// Правая граница массива длины n
 Массив (high)
while l <= h do
 Массив длины n / 2
mid = (l + h) / 2
// 2 операции
 Массив длины n / 4
if v[mid] = key then // 2 оп.
 ...
return mid
k

else if key > v[mid] then Массивоп.
// 2 длины n / 2 = 1
𝒏
l = mid + 1
// 1 оп.
= 𝟏, 𝒏 = 𝟐 𝒌 ,
𝟐𝒌
else
h = mid - 1
𝐥𝐨𝐠 𝟐 𝒏 = 𝐥𝐨𝐠 𝟐 𝟐 𝒌
end if
end while
𝒌 = 𝐥𝐨𝐠 𝟐 𝒏
return -1
𝑻 𝒏 = 𝟕𝐥𝐨𝐠 𝟐 𝒏 + 𝟑 = 𝑶(𝐥𝐨𝐠 𝒏)
end function
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

2

3

3

5

7

9

13

23

25

29

31

33

37

41

42

46

49

50

52

67

73

81

94

key = 100
(worst case)

8
Эффективность бинарного поиска
function BinarySearch(v[1:n], n, Количество k разбиений массива
key)
l = 1
// Левая граница массива (low)
h = n
// Правая граница массива длины n
 Массив (high)
while l <= h do
 Массив длины n / 2
mid = (l + h) / 2 неэффективно использует
операции
Бинарный поиск // 2Массив длины n / 4

if v[mid] = key then // 2 оп.
 ...
return кеш-память процессора –
mid
k

else if key > v[mid] then Массивоп.
// 2 длины n / 2 = 1
𝒏
l = mid + 1 к элементам 1 оп.
// массива
доступ
= 𝟏, 𝒏 = 𝟐 𝒌 ,
𝟐𝒌
else
h = mid - 1
непоследовательный (прыжки по массиву)
𝐥𝐨𝐠 𝟐 𝒏 = 𝐥𝐨𝐠 𝟐 𝟐 𝒌
end if
end while
𝒌 = 𝐥𝐨𝐠 𝟐 𝒏
return -1
𝑻 𝒏 = 𝟕𝐥𝐨𝐠 𝟐 𝒏 + 𝟑 = 𝑶(𝐥𝐨𝐠 𝒏)
end function
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

2

3

3

5

7

9

13

23

25

29

31

33

37

41

42

46

49

50

52

67

73

81

94

key = 100
(worst case)

9
Galloping search (“Поиск от края”)
 Задан отсортированный массив A[n]
 Алгоритм Galloping проверяет ключи с индексами
1, 3, 7, 15, … , 2 𝑖 − 1, …
 Проверка идет то тех пор, пока не будет найден элемент
𝐴 2 𝑖 − 1 > 𝑘𝑒𝑦
 Далее выполняется бинарный поиск в интервале
2 𝑖−1 − 1, … , 2 𝑖 − 1

 TGalloping(n) = O(logn)

Поиск key = 31

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

2

3

3

5

7

9

13

23

25

29

31

33

37

41

42

46

49

50

52

67

73

81

94

 Galloping search = One sided binary search, exponential search, doubling search
 J. L. Bentley and A. C.-C. Yao. An almost optimal algorithm for unbounded searching //
Information processing letters, 5(3):82–87, 1976

10
Поиск в массиве
 Задан неупорядоченный массив ключей
(новые элементы добавляться крайне редко)
 Требуется периодически осуществлять поиск в массиве
 Решение 1 – “в лоб” за O(n)
Каждый раз при поиске использовать линейный поиск за O(n)
 Решение 2 – в среднем за O(logn)
1. Один раз отсортировать массив за O(nlogn) или за O(n + k)
2. Использовать экспоненциальный поиск (Galloping) – O(logn)
function Search(v[1:n], n, key)
if issorted = false then
Sort(v, n) // Устойчивая сортировка, вызывается редко
issorted = true
end if
return GallopSearch(v, n, key) // Эксп. поиск O(logn)
11
end function
Связные списки (Linked lists)
 Связный список (Linked list) – динамическая структура
данных для хранения информации, в которой каждый
элемент хранит указатели на один или несколько других
элементов
Операция

Описание

Вычислительная
сложность

Сложность
по памяти

AddFront(L, x)

Добавляет элемент x
в начало списка L

O(1)

O(1)

AddEnd(L, x)

Добавляет элемент x
в конец списка L

O(n)

O(1)

Lookup(L, x)

Отыскивает элемент x
в списке L

O(n)

O(1)

Size(L)

Возвращает
количество элементов
в списке L

O(1) или O(n)

O(1)
12
Односвязный список (Singly linked list)
 Размер списка заранее не известен –
элементы добавляются во время работы программы
(динамически)
 Память под элементы выделяется динамически
(функции: malloc, calloc, free)

Head
Данные

Next

Данные

Next

Данные

Next

NULL

13
Односвязный список (Singly linked list)
#include <stdio.h>
#include <stdlib.h>
struct listnode {
char *data;
int value;
struct listnode *next;
};

/* Data */
/* Data */
/* Next node */

14
Создание элемента (выделение памяти)
struct listnode *list_createnode(char *data,
int value)
{
struct listnode *p;
p = malloc(sizeof(*p));
// Выделяем память
if (p != NULL) {
p->data = data;
p->value = value;
p->next = NULL;
}
Сложность создания элемента
return p;

}

TCreateNode = O(1)

15
Создание элемента (выделение памяти)
int main()
{
struct listnode *node;
/* Список из одного элемента */
node = list_createnode(“Ivanov Ivan”, 178);
return 0;
}
0x22340AFF

node =
0x22340AFF

data: “Ivanov Ivan”
value: 178
next: NULL

16
Добавление элемента в начало списка
head = 0xAF22
0xAF22

Data
Value

Next

Data
Value

NULL

Next

1. Создаем новый узел newnode в памяти
newnode = 0x12A2

head = 0xAF22

0x12A2

Data
Value

Next

NULL

0xAF22

Data
Value

Next

Data
Value

Next

NULL

17
Добавление элемента в начало списка
head = 0xAF22
0xAF22

Data
Value

Next

Data
Value

NULL

Next

2. Устанавливаем указатель next узла newnode на head
newnode = 0x12A2

head = 0xAF22

0x12A2

Data
Value

Next
0xAF22

0xAF22

Data
Value

Next

Data
Value

Next

NULL

18
Добавление элемента в начало списка
head = 0xAF22
Data
Value

Next

Data
Value

NULL

Next

3. Делаем головой списка узел newnode
newnode = 0x12A2

head = 0x12A2

0x12A2

Data
Value

Next
0xAF22

0xAF22

Data
Value

Next

Data
Value

Next

NULL

19
Добавление элемента в начало списка
struct listnode *list_addfront(
struct listnode *list,
char *data, int value)
{
struct listnode *newnode;
newnode = list_createnode(data, value);
if (newnode != NULL) {
newnode->next = list;
return newnode;
}
return list;
}

TAddFront = O(1)
20
Добавление элемента в начало списка
int main()
{
struct listnode *head;
head = list_addfront(NULL, "Ivanov Ivan", 178);
head = list_addfront(head, "Petrov Petr", 182);
return 0;
}
head =
0x6600AA

0x6600AA

0x2233FF

data: “Petrov Petr”
value: 182

data: “Ivanov Ivan”
value: 178

next: 0x2233FF

next: NULL

21
Поиск элемента в списке (Lookup)
 Начиная с головы списка просматриваем все узлы
и сравниваем ключи
 В худшем случае требуется просмотреть все узлы,
это требует O(n) операций
head
data: “Mars”
value: 182

data: “Pluton”
value: 178

data: “Saturn”
value: 169

next: 0xdeadbeaf

next: 0x3434ff99

next: NULL

22
Поиск элемента в списке (Lookup)
struct listnode *list_lookup(
struct listnode *list,
char *data, int value)
{
for ( ; list != NULL; list = list->next) {
if (strcmp(list->data, data) == 0 &&
list->value == value)
{
return list;
}
}
return NULL; // Не нашли
TLookup = O(n)
}

23
Поиск элемента в списке (Lookup)
int main()
{
struct listnode *node, *p;
node = list_addfront(NULL, “Mars", 178);
node = list_addfront(node, “Pluton", 182);
node = list_addfront(node, “Saturn", 169);

p = list_lookup(node, “Pluton", 182);
if (p != NULL) {
printf("Data: %sn", p->data);
}
return 0;
}

24
Удаление элемента (Delete)
1. Находим элемент в списке (за время O(n))
2. Корректируем указатели (за O(1))

3. Удаляем элемент из памяти (за O(1))
head
Удаляемый элемент
data: “Mars”
value: 182

data: “Pluton”
value: 178

data: “Saturn”
value: 169

next: 0xdeadbeaf

next: 0x3434ff99

next: NULL

Три возможных ситуации:
 удаляемый узел – в начале списка
 удаляемый узел – внутренний узел (есть элементы слава и справа)
 удаляемый узел – в конце списка

25
Удаление элемента (Delete)
struct listnode *list_delete(struct listnode *list,
char *data, int value)
{
struct listnode *p, *prev = NULL;

}

for (p = list; p != NULL; p = p->next) {
if (strcmp(p->data, data) == 0 && p->value == value) {
if (prev == NULL)
list = p->next;
// Удаляем голову
else
prev->next = p->next; // Есть элемент слева
free(p);
// Освобождаем память
return list;
// Указатель на новую голову
}
prev = p; // Запоминаем предыдущий элемент (левый)
}
return NULL;
// Не нашли
TDelete = O(n)

26
Удаление элемента
int main()
{
struct listnode *node, *p;
node = list_addfront(NULL, “Mars", 178);
node = list_addfront(node, “Pluton", 182);
node = list_addfront(node, “Saturn", 169);
p = list_delete(node, “Pluton", 182);
if (p != NULL) {
node = p; // Указатель на новую голову
printf(“Item deletedn");
}
return 0;
}
27
Домашнее чтение
 Прочитать о реализации связных списков
в “практике программирования” [Kernighan2011, С. 61-66]

28

Contenu connexe

Tendances

Domain Modeling with FP (DDD Europe 2020)
Domain Modeling with FP (DDD Europe 2020)Domain Modeling with FP (DDD Europe 2020)
Domain Modeling with FP (DDD Europe 2020)Scott Wlaschin
 
Ppt on Linked list,stack,queue
Ppt on Linked list,stack,queuePpt on Linked list,stack,queue
Ppt on Linked list,stack,queueSrajan Shukla
 
JavaScript - Chapter 10 - Strings and Arrays
 JavaScript - Chapter 10 - Strings and Arrays JavaScript - Chapter 10 - Strings and Arrays
JavaScript - Chapter 10 - Strings and ArraysWebStackAcademy
 
Лекция 5: B-деревья (B-trees, k-way merge sort)
Лекция 5: B-деревья (B-trees, k-way merge sort)Лекция 5: B-деревья (B-trees, k-way merge sort)
Лекция 5: B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)CriatividadeZeroDocs
 
A real-world example of Functional Programming with fp-ts - no experience req...
A real-world example of Functional Programming with fp-ts - no experience req...A real-world example of Functional Programming with fp-ts - no experience req...
A real-world example of Functional Programming with fp-ts - no experience req...Frederick Fogerty
 
Selection sort
Selection sortSelection sort
Selection sortJay Patel
 
Data structure tries
Data structure triesData structure tries
Data structure triesMd. Naim khan
 
Recursion and Sorting Algorithms
Recursion and Sorting AlgorithmsRecursion and Sorting Algorithms
Recursion and Sorting AlgorithmsAfaq Mansoor Khan
 
Binary search trees
Binary search treesBinary search trees
Binary search treesDwight Sabio
 

Tendances (20)

Domain Modeling with FP (DDD Europe 2020)
Domain Modeling with FP (DDD Europe 2020)Domain Modeling with FP (DDD Europe 2020)
Domain Modeling with FP (DDD Europe 2020)
 
Java Coleções
Java ColeçõesJava Coleções
Java Coleções
 
Ppt on Linked list,stack,queue
Ppt on Linked list,stack,queuePpt on Linked list,stack,queue
Ppt on Linked list,stack,queue
 
PythonOOP
PythonOOPPythonOOP
PythonOOP
 
Resta um java
Resta um javaResta um java
Resta um java
 
JavaScript - Chapter 10 - Strings and Arrays
 JavaScript - Chapter 10 - Strings and Arrays JavaScript - Chapter 10 - Strings and Arrays
JavaScript - Chapter 10 - Strings and Arrays
 
Sorting Methods.pptx
Sorting Methods.pptxSorting Methods.pptx
Sorting Methods.pptx
 
Recursion.pptx
Recursion.pptxRecursion.pptx
Recursion.pptx
 
Trees, Binary Search Tree, AVL Tree in Data Structures
Trees, Binary Search Tree, AVL Tree in Data Structures Trees, Binary Search Tree, AVL Tree in Data Structures
Trees, Binary Search Tree, AVL Tree in Data Structures
 
skip list
skip listskip list
skip list
 
Лекция 5: B-деревья (B-trees, k-way merge sort)
Лекция 5: B-деревья (B-trees, k-way merge sort)Лекция 5: B-деревья (B-trees, k-way merge sort)
Лекция 5: B-деревья (B-trees, k-way merge sort)
 
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
 
A real-world example of Functional Programming with fp-ts - no experience req...
A real-world example of Functional Programming with fp-ts - no experience req...A real-world example of Functional Programming with fp-ts - no experience req...
A real-world example of Functional Programming with fp-ts - no experience req...
 
07 java collection
07 java collection07 java collection
07 java collection
 
Insertion Sort
Insertion SortInsertion Sort
Insertion Sort
 
Selection sort
Selection sortSelection sort
Selection sort
 
Data structure tries
Data structure triesData structure tries
Data structure tries
 
Recursion and Sorting Algorithms
Recursion and Sorting AlgorithmsRecursion and Sorting Algorithms
Recursion and Sorting Algorithms
 
Binary search trees
Binary search treesBinary search trees
Binary search trees
 
Recursividade
RecursividadeRecursividade
Recursividade
 

En vedette

Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаMikhail Kurnosov
 
Building iOS App Project & Architecture
Building iOS App Project & ArchitectureBuilding iOS App Project & Architecture
Building iOS App Project & ArchitectureMassimo Oliviero
 

En vedette (6)

Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Оценка сложности алгоритма
Оценка сложности алгоритмаОценка сложности алгоритма
Оценка сложности алгоритма
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поиска
 
Building iOS App Project & Architecture
Building iOS App Project & ArchitectureBuilding iOS App Project & Architecture
Building iOS App Project & Architecture
 

Similaire à Лекция 3: Бинарный поиск. Связные списки

Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поискFedor Tsarev
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Nikolay Grebenshikov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Technopark
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Mikhail Kurnosov
 
03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетамиFedor Tsarev
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применениеDEVTYPE
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1simple_people
 

Similaire à Лекция 3: Бинарный поиск. Связные списки (20)

Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поиск
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
 
03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1
 

Plus de Mikhail Kurnosov

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 

Plus de Mikhail Kurnosov (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 

Лекция 3: Бинарный поиск. Связные списки

  • 1. Лекция 3 Бинарный поиск Связные списки Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net/teaching
  • 2. Контроль  Свойства O, Θ, Ω 1. 2. 3. 4. 5. O(3n3 + 1000n2) = …. ? Θ(n2 + logn) = …. O(nlogn + n2 ) = …. ? O(2n + n6 – 1000n3) = …. ? Ω(n6 + n!) = …. ?  Алгоритмы сортировки 1. Алгоритмы сортировки со сложностью O(nlogn) в худшем случае? 2. Сортировка за линейное время в худшем случае? 3. Что такое сортировка “на месте” (in place)? 4. QuickSort vs. MergeSort 2
  • 3. Задача поиска элемента по ключу  Имеется последовательность ключей 𝑎1 , 𝑎2 , … , 𝑎 𝑖 , … , 𝑎 𝑛  Требуется найти индекс (номер) ключа, который совпадает с заданным ключом key Пример Дана последовательность из 10 ключей Требуется найти элемент с ключом key = 181 Index 1 2 3 4 5 6 7 8 9 10 Key 178 150 190 177 155 181 179 167 204 175 Data Решение – искомый элемент с индексом 6 3
  • 4. Линейный поиск (Linear search) function Search(v[1:n], n, value) for i = 1 to n do if v[i] = value then return i end if end for return -1 end function TLinearSearch = O(n)  Просматриваем элементы с начиная с первого и сравниваем ключи  В худшем случае искомый элемент находится в конце массива или отсутствует  Количество операций в худшем случае (worst case) T(n) = 2n = O(n) 4
  • 5. Бинарный поиск (Binary Search)  Имеется упорядоченная последовательность ключей 𝑎1 ≤ 𝑎2 ≤ ⋯ ≤ 𝑎 𝑖 ≤ ⋯ ≤ 𝑎 𝑛  Требуется найти позицию элемента, ключ которого совпадает с заданным ключом key  Бинарный поиск (Binary search) 1. Если центральный элемент равен искомому, конец 2. Если центральный меньше, делаем текущей правую половину массива 3. Если центральный больше, делаем текущей левую половину массива 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 3 3 5 7 9 13 23 25 29 31 33 37 41 42 46 49 50 52 67 73 81 94 Поиск key = 42 5
  • 6. Бинарный поиск (Binary Search) function BinarySearch(v[1:n], n, key) l = 1 // Левая граница массива (low) h = n // Правая граница массива (high) while l <= h do mid = (l + h) / 2 // Возможно переполнение mid, // Решение: mid = l + ((h - l) / 2) if v[mid] = key then return mid else if key > v[mid] then l = mid + 1 else h = mid - 1 end if end while return -1 end function 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 3 3 5 7 9 13 23 25 29 31 33 37 41 42 46 49 50 52 67 73 81 94 key = 100 (worst case) 6
  • 7. Эффективность бинарного поиска function BinarySearch(v[1:n], n, key) l = 1 // Левая граница массива (low) h = n // Правая граница массива (high) while l <= h do mid = (l + h) / 2 // 2 операции if v[mid] = key then // 2 оп. return mid else if key > v[mid] then // 2 оп. l = mid + 1 // 1 оп. else h = mid - 1 end if end while Количество операций в худшем случае return -1 end function T(n) = 2 + kTwhile + 1 = 7k + 3  k – количество итераций цикла while  Twhile – количество операций в теле цикла while  Twhile = 2 + 2 + 2 + 1 = 7 7
  • 8. Эффективность бинарного поиска function BinarySearch(v[1:n], n, Количество k разбиений массива key) l = 1 // Левая граница массива (low) h = n // Правая граница массива длины n  Массив (high) while l <= h do  Массив длины n / 2 mid = (l + h) / 2 // 2 операции  Массив длины n / 4 if v[mid] = key then // 2 оп.  ... return mid k  else if key > v[mid] then Массивоп. // 2 длины n / 2 = 1 𝒏 l = mid + 1 // 1 оп. = 𝟏, 𝒏 = 𝟐 𝒌 , 𝟐𝒌 else h = mid - 1 𝐥𝐨𝐠 𝟐 𝒏 = 𝐥𝐨𝐠 𝟐 𝟐 𝒌 end if end while 𝒌 = 𝐥𝐨𝐠 𝟐 𝒏 return -1 𝑻 𝒏 = 𝟕𝐥𝐨𝐠 𝟐 𝒏 + 𝟑 = 𝑶(𝐥𝐨𝐠 𝒏) end function 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 3 3 5 7 9 13 23 25 29 31 33 37 41 42 46 49 50 52 67 73 81 94 key = 100 (worst case) 8
  • 9. Эффективность бинарного поиска function BinarySearch(v[1:n], n, Количество k разбиений массива key) l = 1 // Левая граница массива (low) h = n // Правая граница массива длины n  Массив (high) while l <= h do  Массив длины n / 2 mid = (l + h) / 2 неэффективно использует операции Бинарный поиск // 2Массив длины n / 4  if v[mid] = key then // 2 оп.  ... return кеш-память процессора – mid k  else if key > v[mid] then Массивоп. // 2 длины n / 2 = 1 𝒏 l = mid + 1 к элементам 1 оп. // массива доступ = 𝟏, 𝒏 = 𝟐 𝒌 , 𝟐𝒌 else h = mid - 1 непоследовательный (прыжки по массиву) 𝐥𝐨𝐠 𝟐 𝒏 = 𝐥𝐨𝐠 𝟐 𝟐 𝒌 end if end while 𝒌 = 𝐥𝐨𝐠 𝟐 𝒏 return -1 𝑻 𝒏 = 𝟕𝐥𝐨𝐠 𝟐 𝒏 + 𝟑 = 𝑶(𝐥𝐨𝐠 𝒏) end function 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 3 3 5 7 9 13 23 25 29 31 33 37 41 42 46 49 50 52 67 73 81 94 key = 100 (worst case) 9
  • 10. Galloping search (“Поиск от края”)  Задан отсортированный массив A[n]  Алгоритм Galloping проверяет ключи с индексами 1, 3, 7, 15, … , 2 𝑖 − 1, …  Проверка идет то тех пор, пока не будет найден элемент 𝐴 2 𝑖 − 1 > 𝑘𝑒𝑦  Далее выполняется бинарный поиск в интервале 2 𝑖−1 − 1, … , 2 𝑖 − 1  TGalloping(n) = O(logn) Поиск key = 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 3 3 5 7 9 13 23 25 29 31 33 37 41 42 46 49 50 52 67 73 81 94  Galloping search = One sided binary search, exponential search, doubling search  J. L. Bentley and A. C.-C. Yao. An almost optimal algorithm for unbounded searching // Information processing letters, 5(3):82–87, 1976 10
  • 11. Поиск в массиве  Задан неупорядоченный массив ключей (новые элементы добавляться крайне редко)  Требуется периодически осуществлять поиск в массиве  Решение 1 – “в лоб” за O(n) Каждый раз при поиске использовать линейный поиск за O(n)  Решение 2 – в среднем за O(logn) 1. Один раз отсортировать массив за O(nlogn) или за O(n + k) 2. Использовать экспоненциальный поиск (Galloping) – O(logn) function Search(v[1:n], n, key) if issorted = false then Sort(v, n) // Устойчивая сортировка, вызывается редко issorted = true end if return GallopSearch(v, n, key) // Эксп. поиск O(logn) 11 end function
  • 12. Связные списки (Linked lists)  Связный список (Linked list) – динамическая структура данных для хранения информации, в которой каждый элемент хранит указатели на один или несколько других элементов Операция Описание Вычислительная сложность Сложность по памяти AddFront(L, x) Добавляет элемент x в начало списка L O(1) O(1) AddEnd(L, x) Добавляет элемент x в конец списка L O(n) O(1) Lookup(L, x) Отыскивает элемент x в списке L O(n) O(1) Size(L) Возвращает количество элементов в списке L O(1) или O(n) O(1) 12
  • 13. Односвязный список (Singly linked list)  Размер списка заранее не известен – элементы добавляются во время работы программы (динамически)  Память под элементы выделяется динамически (функции: malloc, calloc, free) Head Данные Next Данные Next Данные Next NULL 13
  • 14. Односвязный список (Singly linked list) #include <stdio.h> #include <stdlib.h> struct listnode { char *data; int value; struct listnode *next; }; /* Data */ /* Data */ /* Next node */ 14
  • 15. Создание элемента (выделение памяти) struct listnode *list_createnode(char *data, int value) { struct listnode *p; p = malloc(sizeof(*p)); // Выделяем память if (p != NULL) { p->data = data; p->value = value; p->next = NULL; } Сложность создания элемента return p; } TCreateNode = O(1) 15
  • 16. Создание элемента (выделение памяти) int main() { struct listnode *node; /* Список из одного элемента */ node = list_createnode(“Ivanov Ivan”, 178); return 0; } 0x22340AFF node = 0x22340AFF data: “Ivanov Ivan” value: 178 next: NULL 16
  • 17. Добавление элемента в начало списка head = 0xAF22 0xAF22 Data Value Next Data Value NULL Next 1. Создаем новый узел newnode в памяти newnode = 0x12A2 head = 0xAF22 0x12A2 Data Value Next NULL 0xAF22 Data Value Next Data Value Next NULL 17
  • 18. Добавление элемента в начало списка head = 0xAF22 0xAF22 Data Value Next Data Value NULL Next 2. Устанавливаем указатель next узла newnode на head newnode = 0x12A2 head = 0xAF22 0x12A2 Data Value Next 0xAF22 0xAF22 Data Value Next Data Value Next NULL 18
  • 19. Добавление элемента в начало списка head = 0xAF22 Data Value Next Data Value NULL Next 3. Делаем головой списка узел newnode newnode = 0x12A2 head = 0x12A2 0x12A2 Data Value Next 0xAF22 0xAF22 Data Value Next Data Value Next NULL 19
  • 20. Добавление элемента в начало списка struct listnode *list_addfront( struct listnode *list, char *data, int value) { struct listnode *newnode; newnode = list_createnode(data, value); if (newnode != NULL) { newnode->next = list; return newnode; } return list; } TAddFront = O(1) 20
  • 21. Добавление элемента в начало списка int main() { struct listnode *head; head = list_addfront(NULL, "Ivanov Ivan", 178); head = list_addfront(head, "Petrov Petr", 182); return 0; } head = 0x6600AA 0x6600AA 0x2233FF data: “Petrov Petr” value: 182 data: “Ivanov Ivan” value: 178 next: 0x2233FF next: NULL 21
  • 22. Поиск элемента в списке (Lookup)  Начиная с головы списка просматриваем все узлы и сравниваем ключи  В худшем случае требуется просмотреть все узлы, это требует O(n) операций head data: “Mars” value: 182 data: “Pluton” value: 178 data: “Saturn” value: 169 next: 0xdeadbeaf next: 0x3434ff99 next: NULL 22
  • 23. Поиск элемента в списке (Lookup) struct listnode *list_lookup( struct listnode *list, char *data, int value) { for ( ; list != NULL; list = list->next) { if (strcmp(list->data, data) == 0 && list->value == value) { return list; } } return NULL; // Не нашли TLookup = O(n) } 23
  • 24. Поиск элемента в списке (Lookup) int main() { struct listnode *node, *p; node = list_addfront(NULL, “Mars", 178); node = list_addfront(node, “Pluton", 182); node = list_addfront(node, “Saturn", 169); p = list_lookup(node, “Pluton", 182); if (p != NULL) { printf("Data: %sn", p->data); } return 0; } 24
  • 25. Удаление элемента (Delete) 1. Находим элемент в списке (за время O(n)) 2. Корректируем указатели (за O(1)) 3. Удаляем элемент из памяти (за O(1)) head Удаляемый элемент data: “Mars” value: 182 data: “Pluton” value: 178 data: “Saturn” value: 169 next: 0xdeadbeaf next: 0x3434ff99 next: NULL Три возможных ситуации:  удаляемый узел – в начале списка  удаляемый узел – внутренний узел (есть элементы слава и справа)  удаляемый узел – в конце списка 25
  • 26. Удаление элемента (Delete) struct listnode *list_delete(struct listnode *list, char *data, int value) { struct listnode *p, *prev = NULL; } for (p = list; p != NULL; p = p->next) { if (strcmp(p->data, data) == 0 && p->value == value) { if (prev == NULL) list = p->next; // Удаляем голову else prev->next = p->next; // Есть элемент слева free(p); // Освобождаем память return list; // Указатель на новую голову } prev = p; // Запоминаем предыдущий элемент (левый) } return NULL; // Не нашли TDelete = O(n) 26
  • 27. Удаление элемента int main() { struct listnode *node, *p; node = list_addfront(NULL, “Mars", 178); node = list_addfront(node, “Pluton", 182); node = list_addfront(node, “Saturn", 169); p = list_delete(node, “Pluton", 182); if (p != NULL) { node = p; // Указатель на новую голову printf(“Item deletedn"); } return 0; } 27
  • 28. Домашнее чтение  Прочитать о реализации связных списков в “практике программирования” [Kernighan2011, С. 61-66] 28