При использовании вектора наилучшее время поиска, которое вы получите, - сложность O (log N) с использованием алгоритма двоичного поиска, и это будет работать только для отсортированного списка.Если вы включите время, необходимое для создания отсортированных вставок в список, окончательную амортизированную сложность для отсортированного линейного контейнера (массивы, списки), а также нелинейных контейнеров, таких как деревья двоичного поиска, O (N log N).Таким образом, это в основном означает, что если вы добавите больше элементов в список, то время, необходимое для добавления этих элементов в список, а также для их поиска в дальнейшем, будет увеличиваться со скоростью, немного превышающей линейную скорость роста.список (т. е. если вы удвоите размер списка, то для сортировки списка потребуется чуть более чем вдвое больше времени, а затем любые поиски в списке будут довольно быстрыми ... чтобы удвоить время поиска,список должен увеличиваться на квадрат существующего количества элементов).
С другой стороны, хорошая реализация хеш-таблицы (например, std::unordered_map
) вместе с хорошим хеш-алгоритмом, который позволяет избежатьслишком много коллизий, амортизируемая сложность O (1) ... это означает, что в целом существует постоянное время поиска для любого данного элемента, независимо от количества элементов, что делает поиск очень быстрым.Основным штрафом по линейному списку или дереву двоичного поиска для хеш-таблицы является фактический объем памяти хеш-таблицы.Хорошая хеш-таблица, во избежание слишком большого количества коллизий, должна иметь размер, равный некоторому большому простому числу, которое по крайней мере больше 2 * N, где N - общее количество элементов, которые вы планируете хранить вмассив.Но «потраченное впустую пространство» - это компромисс для эффективного и чрезвычайно быстрого поиска.