Існує підручник, який чекає його написання в якийсь момент, з робочим заголовком Структури даних, алгоритми та компроміси . Практично кожен алгоритм або структура даних, які ви, швидше за все, вивчаєте на рівні бакалаврату, має певну особливість, яка робить його кращим для деяких програм, ніж інші.
Візьмемо сортування як приклад, оскільки всі знайомі зі стандартними алгоритмами сортування.
По-перше, складність - не єдина проблема. На практиці важливі постійні фактори, і саме тому, скажімо, швидкий сорт, як правило, використовується більше, ніж нагромадження, хоча швидкий сорт має жахливі складні випадки.
По-друге, завжди є шанс опинитися в ситуації, коли ви програмуєте в умовах дивних обмежень. Мені колись довелося зробити видобуток з чисельних розмірів зі скромного розміру (1000 або більше) колекцій зразків якомога швидше, але це було на невеликому мікроконтролері, який мав дуже мало запасної пам’яті для читання-запису, що виключало більшість алгоритми сортування. Сорт Shell був найкращим компромісом, оскільки він був субквадратичним і не потребував додаткової пам'яті.O(nlogn)
В інших випадках ідеї алгоритму чи структури даних можуть бути застосовні до проблеми спеціального призначення. Здається, сортування бульбашок завжди повільніше, ніж сортування вставки на реальному обладнання, але ідея виконувати пропуск бульбашки іноді саме те, що потрібно.
Розглянемо, наприклад, якусь 3D-візуалізацію чи відеоігри на сучасній відеокарті, де ви хочете намалювати предмети в порядку від найближчого до камери до найдальшого з камери з міркувань продуктивності, але якщо ви не отримаєте точне замовлення, апаратне забезпечення подбає про нього. Якщо ви пересуваєтеся в 3D-середовищі, відносний порядок об'єктів не буде сильно змінюватися між кадрами, тому виконання одного проходу міхура кожен кадр може бути розумним компромісом. (Джерело двигуна Valve робить це для ефектів частинок.)
Існує наполегливість, одночасність, локальність кешу, масштабованість на кластері / хмарі та безліч інших можливих причин, чому одна структура даних або алгоритм може бути більш доречною, ніж інша, навіть з огляду на ту ж обчислювальну складність для операцій, які вас цікавлять.
Сказавши це, це не означає, що вам слід запам'ятати купу алгоритмів і структур даних на всякий випадок. Більша частина битви - це розуміння того, що в першу чергу слід експлуатувати компроміс, і знаючи, де шукати, якщо ви думаєте, що може бути щось підходяще.