SlideShare a Scribd company logo
CV_RTF: algo posidelky
«Основные структуры данных»
Книга

Фундаментальные алгоритмы на С++
О чём речь?
Как расставлять стаканчики?
Как устроена память?
Как оценить скорость?
Стандартный размер наименьшей
ячейки памяти равен восьми битам, то есть
восьми двоичным разрядам.
Совокупность из 8 битов является
основной единицей представления данных
– байт.
Указатели
Указатель (англ. pointer) — переменная,
диапазон значений которой состоит из
адресов ячеек памяти или специального
значения — нулевого адреса. Последнее
используется для указания того, что в
данный момент там ничего не записано.
Указатели
Указатель (англ. pointer) — переменная,
диапазон значений которой состоит из
адресов ячеек памяти или специального
значения — нулевого адреса. Последнее
используется для указания того, что в
данный момент там ничего не записано.
Указатели
#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
Указатели
#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;
}
Указатели
#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
Указатели
#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;
}
Указатели
#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
Указатели
#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
Указатели
#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;
}
Указатели
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
Указатели
#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;
}
Указатели
p[i][j] == *(*(p+i)+j)
Структуры
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int N = 3;
struct example {
float x; float y;
} point, point_array[N];
Структуры
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;
}
Структуры
0
1
2
x

:
:
:
=

x =
x =
x =
5.7

8.3
7.7
9.3
y =

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

struct node {
Item item;
node *next;
node (Item x, node* t) {
item x; next = t;
};
};
typedef node *link;
link x = new node;
Связные списки
Удаление элемента
t = x->next;
x->next = t->next;

Какие проблемы?
Связные списки
Удаление элемента
t = x->next;
x->next = t->next;
delete t;
Связные списки
Вставка элемента

t->next = x->next;
x->next = t;
Связные списки
Задача: Алгоритм Иосифа
Связные списки
Задача: Повернуть список
Связные списки
Связные списки
Двухсвязный список
Связные списки
Соглашения
Связные списки
Соглашения
Связные списки
Соглашения
Связные списки
С++ это Вам не 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();
Составные структуры
Представление строчки
Составные структуры
Представление графа
Составные структуры
Представление графа
Стек
Стек (англ. stack — стопка) — структура данных,
представляющая из себя список элементов,
организованных по принципу LIFO (англ. last in —
first out, «последним пришёл — первым вышел»).
Стек
Стек

Задача: написать стек используя
связный лист
Стек и STL
У стека есть немного функций:
•push() - добавить элемент
•pop() - удалить верхний элемент
•top() - получить верхний элемент
•size() - размер стека
•empty() - true, если стек пуст
Стек и STL
#include <stack>
// ---stack<char> s;
const int n = x.length();
for(int i = 0; i < n; ++i)
s.push(x[i]);
Очереди
Очереди, как следует из название, используют
принцип first in first out (FIFO). То есть, тот, кого мы
первым запихнули в очередь, первым из нее и
выйдет (хотя в реальной жизни не всегда так....)
Очереди
Очереди и STL
Перечень функций почти тот-же:
•push() - добавить элемент
•pop() - удалить первый элемент
•size() - размер очереди
•empty() - true, если очередь пуста
•front() - получить первый элемент
•back() - получить последний элемент
Очереди и STL
#include <queue>
// …
queue<int> events;
int n;
while (cin>>n)
events.push(n);
while (!events.empty) {
make(events.front());
events.pop();
}

More Related Content

PDF
2.4 Использование указателей
PDF
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
PDF
CPU Performance in Java.
PPTX
Мастер класс по алгоритмам. Часть 1
PDF
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
PDF
Pyton – пробуем функциональный стиль
PDF
Красота и изящность стандартной библиотеки Python
PPTX
Михаил Матросов, “С++ без new и delete”
2.4 Использование указателей
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
CPU Performance in Java.
Мастер класс по алгоритмам. Часть 1
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Pyton – пробуем функциональный стиль
Красота и изящность стандартной библиотеки Python
Михаил Матросов, “С++ без new и delete”

What's hot (20)

PDF
Лекция 3: Бинарный поиск. Связные списки
PPT
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
PDF
Лекция 4. Префиксные деревья (Tries, prefix trees)
PDF
msumobi2. Лекция 2
PDF
Лекция 4. Стеки и очереди
PDF
Мир Python функционалим с помощью библиотек
PDF
Олег Алистратов — Сортировка списков в Perl и Python
PDF
Лекция 4: Префиксные деревья (Tries, prefix trees)
PPTX
Java 8. Lambdas
PPTX
Java8. Innovations
PDF
Python. Объектно-ориентированное программирование
PPTX
C++ осень 2012 лекция 11
PPTX
Highload. Создание специализированных высокопроизводительных индексов
PDF
PPTX
Урок 8. Введение в редукцию графов
PDF
Функционально декларативный дизайн на C++
PDF
Лекция о языке программирования Haskell
PPTX
основы Java переменные, циклы
PDF
Ecma script 6 in action
PDF
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 3: Бинарный поиск. Связные списки
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Лекция 4. Префиксные деревья (Tries, prefix trees)
msumobi2. Лекция 2
Лекция 4. Стеки и очереди
Мир Python функционалим с помощью библиотек
Олег Алистратов — Сортировка списков в Perl и Python
Лекция 4: Префиксные деревья (Tries, prefix trees)
Java 8. Lambdas
Java8. Innovations
Python. Объектно-ориентированное программирование
C++ осень 2012 лекция 11
Highload. Создание специализированных высокопроизводительных индексов
Урок 8. Введение в редукцию графов
Функционально декларативный дизайн на C++
Лекция о языке программирования Haskell
основы Java переменные, циклы
Ecma script 6 in action
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Ad

Similar to Algo 00 (20)

PPT
PDF
ОПК № 5 – Составные типы данных, списки
PDF
Алгоритмы и структуры данных осень 2013 лекция 2
PDF
Абстрактные типы данных, контейнеры и списки
PDF
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
PPT
C++ tema 1
PPTX
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
PPT
Лекция 3 Элементарные структуры данных Часть 1
PDF
Алгоритмы и структуры данных весна 2014 лекция 2
PDF
C++ Базовый. Занятие 06.
PDF
C++ осень 2013 лекция 2
PPT
лабораторная работа №4
PPTX
01_ДинамическиеСтccруктурыДанных(+).pptx
PDF
Абстрактные типы данных, последовательности, списки
PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
PDF
Основы С++ (массивы, указатели). Задачи с массивами
PPT
01 линейные структуры данных
PPTX
2-СТАТИЧЕСКИЕ СТРУКТУРЫ.pptx
PDF
C++ Базовый. Занятие 07.
ОПК № 5 – Составные типы данных, списки
Алгоритмы и структуры данных осень 2013 лекция 2
Абстрактные типы данных, контейнеры и списки
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
C++ tema 1
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Лекция 3 Элементарные структуры данных Часть 1
Алгоритмы и структуры данных весна 2014 лекция 2
C++ Базовый. Занятие 06.
C++ осень 2013 лекция 2
лабораторная работа №4
01_ДинамическиеСтccруктурыДанных(+).pptx
Абстрактные типы данных, последовательности, списки
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Основы С++ (массивы, указатели). Задачи с массивами
01 линейные структуры данных
2-СТАТИЧЕСКИЕ СТРУКТУРЫ.pptx
C++ Базовый. Занятие 07.
Ad

Algo 00