Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООПиП - задания к lab2.doc
Скачиваний:
12
Добавлен:
01.03.2016
Размер:
249 Кб
Скачать
☆

Алгоритмическая сложность

Алгоритмическая сложность заключаются в том, насколько быстро (или медленно) работает каждая из функций по мере того, как количество элементов в контейнере увеличивается. Например, вставка элемента в середину QLinkedList - чрезвычайно быстрая операция независимо от количества элементов хранящихся в QLinkedList. С другой стороны, вставка элемента в середину QVector, потенциально очень дорога, если QVector содержит много элементов, потому что половину элементов придется передвинуть на одну позицию в памяти.

Чтобы описать алгоритмическую сложность мы используем следующую терминологию, основанную на нотации "большого O":

  • Постоянное время: O(1). Функция, как говорят, выполняется за постоянное время, если она требует одного и того же времени независимо от того, сколько элементов присутствует в контейнере. Одним из примеров является QLinkedList::insert().

  • Логарифмическое время: O(log n). Функция, которая выполняется за логарифмическое время - это функция, время выполнения которой пропорционально логарифму от количества элементов в контейнере. Одним из примеров является qBinaryFind().

  • Линейное время: O(n). Функция, выполняющаяся линейно, будет выполнятся по времени прямо пропорционально количеству элементов, хранящихся в контейнере. Одним из примеров является QVector::insert().

  • Линейно-логарифмическое время: O(n log n). Функция, выполняющаяся за линейно-логарифмическое время, является ассимптотически медленее, чем линейная функция, но быстрее, чем квадратичная функция.

  • Квадратичное время: O(n?). Квадратично-временная функция выполняется по времени пропорционально квадрату количества элементов, хранящихся в контейнере.

В следующей таблице приведён итог алгоритмической сложности последовательных контейнерных классов Qt:

Индексный перебор

Вставка

Предшествующая вставка.

Последующая вставка

QLinkedList<T>

O(n)

O(1)

O(1)

O(1)

QList<T>

O(1)

O(n)

Сред. O(1)

Сред. O(1)

QVector<T>

O(1)

O(n)

O(n)

Сред. O(1)

В этой таблице, "Сред." обозначает "усредненное поведение" (amortized behavior). Например, "Сред. O(1)" обозначает, что, если вы вызовите функцию единожды, то можете получить поведение O(n), но если вы вызовете её множество раз (например, n раз), усредненная величина будет равна O(1).

В следующей таблице приведён итог алгоритмической сложности ассоциативных контейнеров и наборов Qt:

Перебор ключей

Вставка

Среднее

Худший случай

Среднее

Худший случай

QMap<Key, T>

O(log n)

O(log n)

O(log n)

O(log n)

QMultiMap<Key, T>

O(log n)

O(log n)

O(log n)

O(log n)

QHash<Key, T>

Сред. O(1)

O(n)

Сред. O(1)

O(n)

QSet<Key>

Сред. O(1)

O(n)

Сред. O(1)

O(n)

В QVector, QHash и QSet, время выполнения усредняется до O(log n). Оно может быть сведено к O(1) с помощью вызова QVector::reserve(), QHash::reserve() или QSet::reserve(), с ожидаемым количеством элементов, до вставки элементов. В следующем разделе этот вопрос обсуждается более глубоко.