1. Что такое структура данных? Что такое алгоритм?
-
Проще говоря, структура данных — это то, как данные хранятся.Например, массив хранит данные в непрерывном сегменте памяти, а связанный список хранит данные в любой доступной памяти посредством ассоциации указателей. последний обслужен, и очереди продвигаются вперед.
-
Алгоритм — это метод работы с этими данными, например вставка данных, поиск, удаление, сортировка и т. д.
-
Они дополняют друг друга и интегрируются друг с другом.Структура данных обслуживает алгоритм, и алгоритм должен работать с указанной структурой данных.
2. Анализ сложности?
-
Целью изучения структур данных и алгоритмов является более оптимальное использование памяти в практических приложениях и повышение эффективности работы программы, а анализ сложности дает нам стандарт для измерения качества кода.
-
Если мы сможем качественно узнать объем памяти и потребление кода без запуска программы, это даст нам общую оценку текущей программы и направления будущих улучшений.
-
Время выполнения и объем памяти алгоритма можно узнать, непосредственно запустив программу, но на этот процесс часто влияет операционная среда и масштаб данных, поэтому нам нужен метод, который может грубо оценить эффективность выполнения алгоритма без конкретных данных. тесты Это комплексный градусный анализ.
3. Временная сложность
3.1 Обозначение сложности Big O
int cal(int n)
{
int sum = 0;
int i = 1;
for (; i <= n; ++i)
{
sum = sum + i;
}
return sum;
}
- Предположим, что время выполнения каждой строки кода равно t, время, необходимое для первой и второй строк кода, равно 2 * t, время, необходимое для третьей и четвертой строк кода, равно 2n * t, а общее время равно (2n+2) * t, общее время выполнения кода Time пропорционально n.
- Его можно выразить как O(2n+2) с использованием метода big O, который не представляет фактическое время выполнения кода, а только представляетТенденция изменения времени выполнения кода в зависимости от размера данных.
- Когда n достаточно велико, низшие порядки, константы и коэффициенты пренебрежимо малы и напрямую выражаются как O (n).
3.2 Общие методы анализа
- Зациклить большую часть кода, сосредоточиться на
- Серийный код, добавление сложности
- Вложенный код, сложность умножается
3.3 Несколько общих сложностей
Полиномиальная величина
-
постоянный порядок
-
логарифмический
-
Линейный порядок
-
Линейный логарифмический порядок
-
силовой порядок
Недетерминированный полином
-
Экспоненциальный порядок
-
факторный порядок
-
Время выполнения неполиномиального алгоритма будет резко возрастать с увеличением размера данных, и это очень неэффективный алгоритм.
3.4 Продвинутая ситуация
- Временная сложность в лучшем случае
- Временная сложность наихудшего случая
- Средняя сложность рассмотрения дела
Возьмите поиск в качестве примера, см. следующий код
// n 表示数组 array 的长度
int find(int[] array, int n, int x)
{
int i = 0;
int pos = -1;
for (; i < n; ++i)
{
if (array[i] == x)
{
pos = i;
break;
}
}
return pos;
}
В лучшем случае временная сложность состоит в том, что в самом идеальном состоянии программы первый элемент массива — это элемент, который мы хотим найти, и нам нужно найти его только один раз; а в наихудшем случае временная сложность заключается в том, что в наихудшее состояние программы, последний элемент массива — Элемент — это тот элемент, который мы хотим найти, и нам нужно найти весь массив;
На самом деле искомый элемент может существовать в любом месте массива, а может и не существовать в массиве, поэтому, учитывая вероятности всех случаев, найти среднюю временную сложность каждого случая, то есть среднюю Временная сложность дела.
- Амортизированная сложность времени рассмотрения дела
// array 表示一个长度为 n 的数组
// 代码中的 array.length 就等于 n
int[] array = new int[n];
int count = 0;
void insert(int val)
{
if (count == array.length)
{
int sum = 0;
for (int i = 0; i < array.length; ++i)
{
sum = sum + array[i];
}
array[0] = sum;
count = 1;
}
array[count] = val;
++count;
}
Функция этого кода состоит в том, чтобы вставить элемент в массив.Когда массив не заполнен, он вставляется напрямую, а временная сложность O (1).Когда массив заполнен, сумма всех элементов массива Сначала вычисляется, а затем вставляется элемент.Временная сложность: Степень: O(n).
Более того, две операции разной сложности имеют определенные правила: серия вставок O(1) приводит к заполнению массива, затем вставка O(n), и цикл продолжается.
На данный момент мы можем взять эту операцию сложности O(n)равномерно распределенныйПереходя к предыдущей операции сложности O (1), общая временная сложность становится O (1), что является амортизированной временной сложностью случая.
Если большинство случаев имеют низкую временную сложность, только несколько случаев имеют высокую временную сложность, и эти операции имеют последовательную связь до и после, то мы можем применить амортизированную временную сложность случая для анализа. как правило,Амортизированная временная сложность случая равна лучшей временной сложности случая.
4. Расчет временной сложности
- Набор функций одного порядка
称为与f(n)同阶的函数集合。
- Набор функций низшего порядка
称为比 f(n)低阶的函数集合。
- Коллекция функций высшего порядка
称为比f(n)高阶的函数集合。
- Коллекция функций строго низкого порядка
称为f(n)的严格低阶函数集合。
- Коллекция функций строго высшего порядка
称为比f(n)高阶的函数集合。
- Итерационный метод решения рекуррентных уравнений
- Теорема Мастера для решения рекурсивных уравнений
5. Пространственная сложность
- Объемная сложность характеризует тенденцию изменения занимаемой программой памяти в зависимости от размера данных.Достаточно проанализировать распределение места данных в программе.В общем случае общая сложность O(1), O(n ) и O(n*n).
Ссылки - Колонка Geek Time "Красота структур данных и алгоритмов"