Любое ранжирование различных структур данных будет хотя бы частично привязано к контексту проблемы. Это помогло бы научиться анализировать производительность алгоритмов во времени и пространстве. Как правило, используется «большая нотация O», например, двоичный поиск выполняется за время O (log n), что означает, что время для поиска элемента - это журнал (в базе 2, неявно) количества элементов. Интуитивно понятно, поскольку каждый шаг отбрасывает половину оставшихся данных как несущественные, удвоение количества элементов увеличивает время на 1 шаг. (Двоичный поиск довольно хорошо масштабируется.) Производительность по пространству связана с увеличением объема памяти для больших наборов данных. Также обратите внимание, что нотация big-O игнорирует постоянные коэффициенты - для меньших наборов данных алгоритм O (n ^ 2) может быть быстрее, чем алгоритм O (n * log n), который имеет более высокий постоянный коэффициент.
Помимо времени и пространства, к другим характеристикам относятся: отсортирована ли структура данных (деревья и скиплисты отсортированы, хэш-таблицы - нет), постоянство (двоичные деревья могут повторно использовать указатели из более старых версий, в то время как хеш-таблицы изменяются на месте) и т. Д.
Хотя вам нужно изучить поведение нескольких структур данных, чтобы иметь возможность сравнивать их, один из способов понять, почему они различаются по производительности, - это внимательно изучить несколько. Я предлагаю сравнить односвязные списки, бинарные деревья поиска и списки пропуска , которые относительно просты, но имеют очень разные характеристики. Подумайте, сколько работы требуется, чтобы найти значение, добавить новое значение, найти все значения по порядку и т. Д.
Существуют различные тексты по анализу производительности алгоритмов / структур данных, которые люди рекомендуют, но что действительно имело смысл для меня, так это изучение OCaml. Работа со сложными структурами данных - сильная сторона ML, и их поведение становится намного яснее, когда вы можете избежать указателей и управления памятью, как в C. (Однако изучение OCaml только для понимания структур данных почти наверняка является долгим путем. :))