algo 00
TRANSCRIPT
![Page 1: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/1.jpg)
CV_RTF: algo posidelky
«Основные структуры данных»
![Page 2: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/2.jpg)
Книга
Фундаментальные алгоритмы на С++
![Page 3: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/3.jpg)
О чём речь?
![Page 4: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/4.jpg)
Как расставлять стаканчики?
![Page 5: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/5.jpg)
Как устроена память?
![Page 6: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/6.jpg)
Как оценить скорость?
Стандартный размер наименьшей ячейки памяти равен восьми битам, то есть восьми двоичным разрядам.
Совокупность из 8 битов является основной единицей представления данных – байт.
![Page 7: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/7.jpg)
Указатели
Указатель (англ. pointer) — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент там ничего не записано.
![Page 8: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/8.jpg)
Указатели
Указатель (англ. pointer) — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент там ничего не записано.
![Page 9: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/9.jpg)
Указатели
#include <iostream>
using namespace std;
int main() {
double a = 7.5;
cout << "a contain: " << a << endl <<
"a address is " << &a << endl;
return 0;
} a contain: 7.5
a address is 0xbfea6ef8
![Page 10: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/10.jpg)
Указатели
#include <iostream>
using namespace std;
int main() {
int N = 5;
int* a = new int[N];
for (int i = 0; i < N; i++)
cout << "a[" << i << "] = " <<
&a[i] << endl;
cout << "sizeof(int value) = “
<< sizeof(N) << endl;
return 0;
}
![Page 11: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/11.jpg)
Указатели
#include <iostream>
using namespace std;
int main() {
int N = 5;
int* a = new int[N];
for (int i = 0; i < N; i++)
cout << "a[" << i << "] = " << &a[i]
<< endl; cout << "sizeof(int value) =
" << sizeof(N) << endl; return 0;
} a[0] = 0x84a6008
a[1] = 0x84a600c
a[2] = 0x84a6010
a[3] = 0x84a6014
a[4] = 0x84a6018
sizeof(int value) = 4
![Page 12: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/12.jpg)
Указатели
#include <iostream>
using namespace std;
int main() {
int N = 2;
int a[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cout << "a[" << i << "][" << j << "]
= “
<< &a[i][j] << endl;
return 0;
}
![Page 13: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/13.jpg)
Указатели
#include <iostream>
using namespace std;
int main() {
int N = 2;
int a[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cout << "a[" << i << "][" << j << "]
= “
<< &a[i][j] << endl;
return 0;
} a[0][0] = 0xbfe4d258
a[0][1] = 0xbfe4d25c
a[1][0] = 0xbfe4d260
a[1][1] = 0xbfe4d264
![Page 14: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/14.jpg)
Указатели#include <iostream>
using namespace std;
int main() {
int d = 25;
int* a = &d;
cout << "d = " << d << " " << "&d = “
<< &d << endl << "a = " << a << " *a = “
<< *a << endl << "&(*a) = " << &(*a)
<< endl;
*a = 123;
cout << "d = " << d << endl << "*a = “
<< *a << endl;
return 0;
} d = 25 &d = 0xbfeff258a = 0xbfeff258 *a
= 25&(*a) = 0xbfeff258d = 123*a = 123
![Page 15: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/15.jpg)
Указатели#include <iostream>
using namespace std;
int main() {
int N = 5;
int p[N];
for (int i = 0; i < N; i++) {
p[i] = i;
cout << "p[" << i << "] = “ << p[i] << " ";
} cout << endl;
for (int i = 0; i < N; i++) {
*(p+i) = (N-1) – i;
cout << "p[" << i << "] = “ <<
p[i] << " “;
} cout << endl;
return 0;
}
![Page 16: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/16.jpg)
Указатели
p[0] = 0 p[1] = 1 p[2] = 2 p[3] = 3 p[4] = 4
p[0] = 4 p[1] = 3 p[2] = 2 p[3] = 1 p[4] = 0
![Page 17: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/17.jpg)
Указатели#include <iostream>
using namespace std;
int main() {
int N = 5;
int p[N];
for (int i = 0; i < N; i++) {
p[i] = i;
cout << "p[" << i << "] = “ << p[i] << " ";
} cout << endl;
for (int i = 0; i < N; i++) {
*(p+i) = (N-1) – i;
cout << "p[" << i << "] = “ <<
p[i] << " “;
} cout << endl;
return 0;
}
![Page 18: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/18.jpg)
Указатели
p[i][j] == *(*(p+i)+j)
![Page 19: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/19.jpg)
Структуры #include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int N = 3;
struct example {
float x; float y;
} point, point_array[N];
![Page 20: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/20.jpg)
Структуры float get_rand();
int main () {
point.x = 5.7f;
point.y = 7.5f;
for (int i = 0; i < N; i++) {
point_array[i].x = get_rand();
point_array[i].y = get_rand(); cout
<< i << " : x = “
<< point_array[i].x <<
" | y = " << point_array[i].y <<
endl;
} cout << "x = " << point.x
<< " y = " << point.y << endl;
return 0;
}
![Page 21: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/21.jpg)
Структуры
0 : x = 8.3 | y = 8.6
1 : x = 7.7 | y = 1.5
2 : x = 9.3 | y = 3.5
x = 5.7 y = 7.5
![Page 22: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/22.jpg)
Связные списки
— базовая динамическая структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка.
![Page 23: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/23.jpg)
Связные списки
struct node {
Item item;
node *next;
node (Item x, node* t) {
item x; next = t;
};
}; typedef node *link;
link x = new node;
![Page 24: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/24.jpg)
Связные списки
Удаление элемента
t = x->next;
x->next = t->next;
Какие проблемы?
![Page 25: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/25.jpg)
Связные списки
Удаление элементаt = x->next;
x->next = t->next;
delete t;
![Page 26: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/26.jpg)
Связные списки
Вставка элемента
t->next = x->next;
x->next = t;
![Page 27: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/27.jpg)
Связные списки
Задача: Алгоритм Иосифа
![Page 28: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/28.jpg)
Связные списки
Задача: Повернуть список
![Page 29: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/29.jpg)
Связные списки
![Page 30: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/30.jpg)
Связные списки
Двухсвязный список
![Page 31: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/31.jpg)
Связные списки
Соглашения
![Page 32: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/32.jpg)
Связные списки
Соглашения
![Page 33: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/33.jpg)
Связные списки
Соглашения
![Page 34: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/34.jpg)
Связные списки
С++ это Вам не Java
LinkedList ll = new LinkedList();
ll.add("F");
ll.add("B");
ll.addFirst("A");
ll.add(1, "A2");
ll.remove("F");
ll.remove(2);
ll.removeFirst();
![Page 35: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/35.jpg)
Составные структуры
Представление строчки
![Page 36: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/36.jpg)
Составные структуры
Представление графа
![Page 37: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/37.jpg)
Составные структуры
Представление графа
![Page 38: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/38.jpg)
Стек
Стек (англ. stack — стопка) — структура данных, представляющая из себя список элементов, организованных по принципу LIFO (англ. last in —first out, «последним пришёл — первым вышел»).
![Page 39: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/39.jpg)
Стек
![Page 40: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/40.jpg)
Стек
Задача: написать стек используя связный лист
![Page 41: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/41.jpg)
Стек и STL
У стека есть немного функций: •push() - добавить элемент •pop() - удалить верхний элемент •top() - получить верхний элемент •size() - размер стека •empty() - true, если стек пуст
![Page 42: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/42.jpg)
Стек и STL
#include <stack>
// ----stack<char> s;
const int n = x.length();
for(int i = 0; i < n; ++i)
s.push(x[i]);
![Page 43: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/43.jpg)
Очереди
Очереди, как следует из название, используют принцип first in first out (FIFO). То есть, тот, кого мы первым запихнули в очередь, первым из нее и выйдет (хотя в реальной жизни не всегда так....)
![Page 44: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/44.jpg)
Очереди
![Page 45: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/45.jpg)
Очереди и STL
Перечень функций почти тот-же: •push() - добавить элемент •pop() - удалить первый элемент •size() - размер очереди •empty() - true, если очередь пуста •front() - получить первый элемент •back() - получить последний элемент
![Page 46: Algo 00](https://reader033.vdocuments.site/reader033/viewer/2022060201/559b0c041a28abbd638b466f/html5/thumbnails/46.jpg)
Очереди и STL
#include <queue>
// …
queue<int> events;
int n;
while (cin>>n)
events.push(n);
while (!events.empty) {
make(events.front());
events.pop();
}