В какой-то момент есть учебник с рабочим названием Структуры данных, Алгоритмы и Компромиссы . Почти каждый алгоритм или структура данных, которые вы, вероятно, изучите на уровне бакалавриата, имеет некоторые особенности, которые делают его лучше для некоторых приложений, чем для других.
Давайте рассмотрим сортировку в качестве примера, поскольку все знакомы со стандартными алгоритмами сортировки.
Во-первых, сложность не единственная проблема. На практике постоянные факторы имеют значение, поэтому, скажем, быстрая сортировка имеет тенденцию использоваться больше, чем сортировка в куче, даже если быстрая сортировка имела ужасную сложность в худшем случае.
Во-вторых, всегда есть вероятность, что вы окажетесь в ситуации, когда вы программируете в странных условиях. Мне когда-то приходилось делать квантильное извлечение из выборки небольшого размера (1000 или около того) как можно быстрее, но это было на небольшом микроконтроллере, у которого было очень мало свободной памяти для чтения и записи, так что исключалось большинство сортировать алгоритмы. Сортировка оболочки была лучшим компромиссом, поскольку она была субквадратичной и не требовала дополнительной памяти.O ( n logн )
В других случаях идеи из алгоритма или структуры данных могут быть применимы к задаче специального назначения. Bubble sort, кажется, всегда медленнее, чем сортировка с вставкой на реальном оборудовании, но идея выполнения Bubble Pass иногда именно то, что вам нужно.
Рассмотрим, например, какую-то 3D-визуализацию или видеоигру на современной видеокарте, где вы хотите рисовать объекты в порядке от ближайшего к камере до самого дальнего от камеры по соображениям производительности, но если вы не получите точный заказ, оборудование позаботится об этом. Если вы перемещаетесь по трехмерной среде, относительный порядок объектов не сильно меняется между кадрами, поэтому выполнение одного прохода пузыря на каждый кадр может быть разумным компромиссом. (Механизм Source от Valve делает это для эффектов частиц.)
Существует постоянство, параллелизм, локальность кэша, масштабируемость в кластере / облаке и множество других возможных причин, почему одна структура данных или алгоритм могут быть более подходящими, чем другая, даже с учетом той же вычислительной сложности для операций, которые вас интересуют.
Сказав это, это не значит, что вы должны запомнить кучу алгоритмов и структур данных на всякий случай. Большая часть битвы заключается в понимании того, что в первую очередь необходимо использовать компромисс, и в знании того, где искать, если вы думаете, что может быть что-то подходящее.