algo 00

46
CV_RTF: algo posidelky «Основные структуры данных»

Upload: alex-tarasov

Post on 07-Jul-2015

299 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Algo 00

CV_RTF: algo posidelky

«Основные структуры данных»

Page 2: Algo 00

Книга

Фундаментальные алгоритмы на С++

Page 3: Algo 00

О чём речь?

Page 4: Algo 00

Как расставлять стаканчики?

Page 5: Algo 00

Как устроена память?

Page 6: Algo 00

Как оценить скорость?

Стандартный размер наименьшей ячейки памяти равен восьми битам, то есть восьми двоичным разрядам.

Совокупность из 8 битов является основной единицей представления данных – байт.

Page 7: Algo 00

Указатели

Указатель (англ. pointer) — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент там ничего не записано.

Page 8: Algo 00

Указатели

Указатель (англ. pointer) — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент там ничего не записано.

Page 9: Algo 00

Указатели

#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

Указатели

#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

Указатели

#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

Указатели

#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

Указатели

#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

Указатели#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

Указатели#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

Указатели

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

Указатели#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

Указатели

p[i][j] == *(*(p+i)+j)

Page 19: Algo 00

Структуры #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

Структуры 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

Структуры

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

Связные списки

— базовая динамическая структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка.

Page 23: Algo 00

Связные списки

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

Связные списки

Удаление элемента

t = x->next;

x->next = t->next;

Какие проблемы?

Page 25: Algo 00

Связные списки

Удаление элементаt = x->next;

x->next = t->next;

delete t;

Page 26: Algo 00

Связные списки

Вставка элемента

t->next = x->next;

x->next = t;

Page 27: Algo 00

Связные списки

Задача: Алгоритм Иосифа

Page 28: Algo 00

Связные списки

Задача: Повернуть список

Page 29: Algo 00

Связные списки

Page 30: Algo 00

Связные списки

Двухсвязный список

Page 31: Algo 00

Связные списки

Соглашения

Page 32: Algo 00

Связные списки

Соглашения

Page 33: Algo 00

Связные списки

Соглашения

Page 34: Algo 00

Связные списки

С++ это Вам не 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

Составные структуры

Представление строчки

Page 36: Algo 00

Составные структуры

Представление графа

Page 37: Algo 00

Составные структуры

Представление графа

Page 38: Algo 00

Стек

Стек (англ. stack — стопка) — структура данных, представляющая из себя список элементов, организованных по принципу LIFO (англ. last in —first out, «последним пришёл — первым вышел»).

Page 39: Algo 00

Стек

Page 40: Algo 00

Стек

Задача: написать стек используя связный лист

Page 41: Algo 00

Стек и STL

У стека есть немного функций: •push() - добавить элемент •pop() - удалить верхний элемент •top() - получить верхний элемент •size() - размер стека •empty() - true, если стек пуст

Page 42: Algo 00

Стек и 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

Очереди

Очереди, как следует из название, используют принцип first in first out (FIFO). То есть, тот, кого мы первым запихнули в очередь, первым из нее и выйдет (хотя в реальной жизни не всегда так....)

Page 44: Algo 00

Очереди

Page 45: Algo 00

Очереди и STL

Перечень функций почти тот-же: •push() - добавить элемент •pop() - удалить первый элемент •size() - размер очереди •empty() - true, если очередь пуста •front() - получить первый элемент •back() - получить последний элемент

Page 46: Algo 00

Очереди и STL

#include <queue>

// …

queue<int> events;

int n;

while (cin>>n)

events.push(n);

while (!events.empty) {

make(events.front());

events.pop();

}