Какие модели времени работы алгоритма существуют?
Мы все ожидаем, что сортировка слиянием будет быстрее, чем сортировка с сортировкой, и отметим, что сортировка слиянием делает O (n log n) сравнений с O (n 2 ) для пузырьковой сортировки.
Для других алгоритмов вы учитываете другие операции (кроме сравнения и замены), такие как разыменование указателя, поиск в массиве, арифметика целых чисел фиксированного размера и т. Д.
Какие есть другие способы моделирования времени выполнения?
Один из тех, кого я знаю о себе, считает количество блоков, прочитанных и записанных на диск; см. мой ответ на Когда запись Big-O терпит неудачу? для подробного описания.
Еще один счетчик подсчитывает количество пропущенных кешей. Это расширяет модель ввода-вывода, рассматривая все уровни иерархии памяти.
Третье, для распределенных алгоритмов (например, в безопасных многопартийных вычислениях), заключается в подсчете объема данных, передаваемых по сети (обычно измеряется в раундах связи или количестве сообщений).
Какие еще интересные вещи нужно учитывать (а не считать!), Чтобы предсказать производительность алгоритма?
Кроме того, Насколько хороши эти модели? Насколько я слышал, не обращающие внимания на кэш алгоритмы конкурируют с эффективными алгоритмами ввода / вывода для данных на диске, но не для алгоритмов в памяти.
В частности: в каких конкретных случаях эти модели неверно предсказывают относительную производительность? Согласно моим собственным экспериментам, кучи Фибоначчи не ускоряют кратчайший путь Диджстры (по сравнению с двоичными кучами), когда данные достаточно малы, чтобы поместиться в памяти.