Algorithms and Data Structures Flashcards

1
Q

Что показывает нотация О-большое?

A

Такую нотацию используют для указания на сложность алгоритма. О-большое показывает наихудший случай. Например, сложность О(n) говорит о том, что c ростом n - числа элементов для обработки, - число операций в худшем случае вырастет линейно.

Математическое определение:
f(x) = O( g(x) ) если lim( g(x)/f(x) ) = 0 при x -> inf

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Используются ли такие формы записи сложности?

О( n*log(n) + 1 )
O( (1/2) * n^2 )

A

Эти записи математически корректны, но для алгоритмов используются редко.

Алгоритмы обычно принципиально отличаются по сложности. Например О(n^2) для большого n требует на много порядков меньше операций чем O(n!). Таких случаев большинство, константы в них не играют роли, поэтому их обычно опускают.

Констаны важны только для алгоритмов с одинаковой сложностью. Источником констант может быть как сам алгоритм, так и время одной операции (обычно различается между алгоритмами).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие структуры данных вам известны?

A
Массив
Ассоциативный массив
Хеш таблица
Граф
Множество

Абстрактные:
Очередь, Стек,

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое массив. Какие операции в нём быстрее, какие медленнее? Почему?

A

Массив - данные, последовательно хранящиеся в памяти.

Позволяет быстро читать данные с любой позиции (засчёт последовательного хранения).

Медленно вставляет элементы, потому что приходится переносить все последующие элементы, а иногда и весь массив целиком, если он больше не помещается на данном участке памяти.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое ассоциативный массив? Какие операции в нём быстрее, какие медленнее? Почему?

A

Ассоциативный массив - набор пар (значение, ссылка на след. значение).

Позволяет быстро добавлять новые элементы на произвольные позиции (заменяет переписывает ссылки).

Медленнее, чем массив, читает элементы с произвольных позиций, потому что вынужден последовательно идти по ссылкам от одного элемента к другому.

Заметка: АМ бывают однонаправленными, двунаправленными, круговыми.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Выбирая между массивом и ассоциативным массивом, что ты выберешь для реализации стека? Для очереди? Выбор обоснуй.

A

Для реализации стека может хорошо подойти массив. Он быстро добавляет/извлекает последний элемент. Размер стека обычно ограничен, а потому известен заранее, что хорошо подходит для массивов.

Для очередей скорее подойдет ассоциативный массив, так как он позволяет быстро удалять первый элемент.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое хеш-таблица? Какие операции в ней быстрее, какие медленнее? Почему?

A

Неупорядоченный набор пар [ключ, значение].

Поиск значения по ключу происходит за константное время О(1).

Для этого используется хеш-функция, которая по ключу восстанавливает адрес в памяти, где лежит значение.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое граф? Какие виды графов тебе известны?

A

Граф - это абстрактное представление системы связанных объектов.

Виды графов

  • направленный/ненаправленный
  • циклический/ациклический
  • взвешенный
  • дерево (бинарное, тернарное, …, куча )
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Как работает бинарный поиск? Какие у него предварительные требования к данным? Какая у него сложность?

A

Бинарный поиск производится отсортированном массиве.

  1. Берём элемент из середины массива
  2. Сравниваем с целевым
  3. Если совпали - успех. Если целевой больше, то начинаем с 1. для массива справа от середины массива, если меньше - слева.

Сложность O( log(n) )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Какие алгоритмы сортировок вам известны? Какие у них сложности по операциям и вспомогательным данным?

A

Быстрая сортировка: О( nlog(n) ) и О(n)
Сортировка слиянием: О( n
log(n) ) и О(n)
Сортировка вставками: О( n^2 ) и О(1)
Сортировка выбором: О( n^2 ) и О(1)
Сортировка пузырьком: О( n^2 ) и О(1)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как и работает сортировка пузырьком? Какая у неё средняя сложность?

A

Раз за разом проходим по массиву, меняя порядок соседних элементов, если он не верный.

Средняя сложность - O(n^2).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Как работает сортировка вставками? Какая у неё средняя сложность?

A

Берём элементы по одному и вставляем в нужное место среди уже отсортированных элементов в начале массива.

Средняя сложность - O(n^2).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Как работает сортировка выбором? Какая у неё средняя сложность?

A
  1. Находим номер минимального значения в списке.
  2. Производим обмен этого значения со значением первой неотсортированной позиции.
  3. Теперь сортируем неотсортированный хвост.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Как работает сортировка слиянием? Какая у неё средняя сложность?

A

Принцип - “разделяй и властвуй”

  1. Рекурсивно разбиваем массивы на подмассивы пока они не будут состоять из одного элемента
  2. Рекурсивно соединяем отсортированные массивы:
    - – Берём меньший из двух первых элементов подмассивов и записываем его в результирующий массив
    - – Счётчики номеров элементов результирующего массива и подмассива, из которого был взят элемент, увеличиваем на 1

Средняя сложность - О( n*log(n) ), но требует O(n) доп. памяти и по сравнению с быстрой сортировкой имеет большую константу времени одной операции.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Как работает быстрая сортировка? Какая у неё средняя сложность?

A

Принцип - “разделяй и властвуй”

  1. Случайным образом выбираем опорный элемент
  2. Справа от опорного помещаем элементы, которые больше него, слева - меньше. Сложность - О(n)
  3. Рекурсивно сортируем массивы справа и слева от опорного - О( log(n) )

Средняя сложность - О( n*log(n) ). Худшая - О(n^2), но встречается очень редко. Требует O(n) памяти. Одна операция выполняется быстрее, чем в сортировке слиянием.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Как работает поиск в ширину? Что он позволяет определить? Какая у него сложность?

A

Это алгоритм на графах, позволяет определить, достижима ли целевая вершина и сколько рёбер до неё нужно пройти.

Шаг алгоритма

  1. Проверяем вершины из списка для проверки;
  2. Если проверяемая вершина не является целевой, добавляем её соседей в список для проверки;

Сложность - O( |V| + |E| ). По памяти - O( |V| )

17
Q

Как работает алгоритм Дейкстры?
Что он позволяет определить?
Какие ограничения на входные данные?
Какая сложность?

A

Алгоритм Дейкстры позволяет определить, достижима ли определённая вершина и даёт наиболее дешевый путь до неё.

Применим для взвешенных направленных ациклических графов с неотрицательными весами.

Данные используемые в алгоритме
(Далее КР - это кратчайшее расстояние из самой первой вершины)
1. Таблица [узел, КР]
2. Таблица [узел, родитель с КР]

Шаг алгоритма

  1. Считаем расстояния из текущей вершины до соседей. Для этого складываем КР до текущей вершины с расстоянием до соседа.
  2. Если расстояние до соседа из текущей вершины ближе, чем его текущее КР, обновляем ему КР и родителем ставим текущую вершину.
  3. Проверяем все записанные вершины и переходим в следующую вершину с кратчайшим расстоянием до неё.
  • для первой вершины КР = 0, нет родителя
  • *для любой ещё не проверенной вершины, КР = inf
18
Q

Как ты понимаешь определение NP-полной задачи?

A

Задача, для решения которой потребуется в худшем случае перебор всех возможных решений.

19
Q

Что такое жадные алгоритмы?

A

Это алгоритмы, которые локально оптимальны - в каждой итерации выбирается наилучшее решение в рамках текущей итерации.