Для таких людей, как я, которые изучают алгоритмы для жизни, стандартная модель вычислений 21-го века - это целочисленная RAM . Модель предназначена для более точного отражения поведения реальных компьютеров, чем модель машины Тьюринга. Реальные компьютеры обрабатывают многоразрядные целые числа в постоянное время, используя параллельное оборудование; не произвольные целые числа, но (поскольку размеры слов неуклонно растут с течением времени), а также целые числа фиксированного размера .
Модель зависит от одного параметра , называемого размером слова . Каждый адрес памяти содержит одно w- битное целое число или слово . В этой модели входной размер n - это количество слов на входе, а время выполнения алгоритма - это количество операций над словами . Стандартные арифметические операции (сложение, вычитание, умножение, целочисленное деление, остаток, сравнение) и логические операции (побитовое и, или, xor, сдвиг, вращение) над словами требуют O ( 1 ) времени по определению .wwnO(1)
Формально размер слова НЕ является константойw для анализа алгоритмов в этой модели. Чтобы привести модель в соответствие с интуицией, нам требуется , поскольку в противном случае мы даже не можем хранить целое число n в одном слове. Тем не менее, для большинства нечисловых алгоритмов время выполнения фактически не зависит от w , потому что эти алгоритмы не заботятся о базовом двоичном представлении их входных данных. И Mergesort, и Heapsort работают за O ( n log n ) ; медиана 3-х быстрой сортировки выполняется в O ( n 2w≥log2nnwO(nlogn) Время в худшем случае. Одним заметным исключением является двоичная радикальная сортировка, которая выполняется за время O ( n w ) .O(n2)O(nw)
Установка дает нам традиционную модель оперативной логарифмической стоимости. Но некоторые алгоритмы целочисленного ОЗУ предназначены для больших размеров слов, например алгоритм целочисленной сортировки по линейному времени, разработанный Andersson et al. , что требует w = Ω ( log 2 + ε n ) .w=Θ(logn)w=Ω(log2+εn)
Для многих алгоритмов, возникающих на практике, размер слова просто не является проблемой, и мы можем (и делаем) прибегнуть к гораздо более простой модели ОЗУ с одинаковой стоимостью. Единственная серьезная трудность связана с вложенным умножением, которое можно использовать для очень быстрого построения очень больших целых чисел . Если бы мы могли выполнять арифметику с произвольными целыми числами за постоянное время, мы могли бы решить любую проблему в PSPACE за полиномиальное время .w
Обновление: я должен также упомянуть, что есть исключения из «стандартной модели», такие как алгоритм целочисленного умножения Фюрера , который использует многолинейные машины Тьюринга (или, что эквивалентно, «битовая память»), и большинство геометрических алгоритмов, которые анализируются теоретически чистая, но идеализированная модель "реального ОЗУ" .
Да, это банка червей.