Пример алгоритма, где член младшего порядка доминирует во время выполнения для любого практического ввода?

10

Обозначение Big-O скрывает постоянные коэффициенты, поэтому существуют некоторые алгоритмы , которые недопустимы для любого разумного размера входных данных, потому что коэффициент по члену очень велик.nO(n)n

Существуют ли какие-либо известные алгоритмы, для которых время выполнения равно но с некоторым членом младшего разряда, который настолько велик, что для разумных размеров входных данных он полностью доминирует во время выполнения? Я хотел бы использовать алгоритм, подобный этому, в качестве примера в курсе алгоритмов, поскольку он дает вескую причину, почему нотация big-O не является чем-то вечным.o ( f ( n ) )O(f(n))o(f(n))

Спасибо!

templatetypedef
источник
Алгоритмы, которые сначала устанавливают большую таблицу, а затем выполняют быстрый поиск в таблице для каждого элемента ввода? Если таблица достаточно велика, то количество элементов должно быть огромным, чтобы компенсировать затраты на создание таблицы. Поисковые системы являются одним из примеров, если число запросов. n
Андрас Саламон
Я слышал, что линейное программирование такое. Симплекс экспоненциальный, но быстрее, чем полиномиальные алгоритмы на практике.
13
1
Я не знаю ни одного алгоритма, который бы соответствовал вашим потребностям, но я бы искал что-то, имеющее максимально линейное время работы, поскольку помимо этого я бы очень сомневался в том, что меньшие члены могут доминировать в главном для большинства разумных входных данных. Но, может быть, k-way mergesort соответствует вашим потребностям, когда используется для сортировки больших данных? Проблема заключается в том, чтобы минимизировать доступ к вторичной памяти, так как это требует огромного количества времени - хотя я не совсем уверен, что это будет подходящий пример того, что вы хотите продемонстрировать, и я не думаю, что это достаточно просто, чтобы быть иллюстративным
Г. Бах

Ответы:

2

Криптография - пример, если вырожденный. Например, нарушение шифрования AES - это - все, что вам нужно сделать, - это найти правильный ключ среди конечного числа, 2 128 или 2 192 или 2 256, в зависимости от размера ключа (предположим, что достаточно открытого текста известно определить ключ однозначно). Однако даже 2 128 операций заняли бы сегодня все компьютеры (миллиард или около того, каждый из которых выполняет около миллиарда операций за один раз) больше, чем время жизни вселенной (около миллиарда миллиардов секунд).O(1)2128219222562128


Немного другой способ проиллюстрировать, почему big-O - это еще не все, это отметить, что мы иногда используем другой алгоритм для небольших входных размеров. Например, взять быструю сортировку. При правильном выборе пивота (что сложно!) Это . Quicksort работает по принципу «разделяй и властвуй»: каждый случай требует много сортировки небольших массивов. Для небольших массивов квадратичные методы, такие как сортировка вставок, работают лучше. Таким образом, для лучшей производительности быстрая сортировка большого массива включает в себя множество прогонов сортировки вставки для небольших размеров.O(nlgn)

Жиль "ТАК - перестань быть злым"
источник
Я не думаю, что взлом шифрования является разумным примером здесь; Одна вещь состоит в том, что для анализа проблемы нахождения правильного ключа асимптотически, мы должны были бы рассмотреть теоретически доступные версии Rijndael с непостоянным размером ключа, то есть взломать ключ для ключей размера . В противном случае мы могли бы также сказать, что любой алгоритм, который завершается, выполняет в O ( 1 ) для ввода фиксированного размера. nO(1)
Г. Бах
@ G.Bach Смысл этого примера в том, что он недопустим (что теория сложности ассоциирует с высокой сложностью), даже если это постоянное время (с точки зрения размера зашифрованного текста).
Жиль "ТАК - перестань быть злым"
2
Я не думаю, что ваш первый пример работает. Поскольку имеется только конечное число параметров для проверки, время выполнения алгоритма равно , поэтому нет термина низкого порядка o ( 1 ), который учитывает полное время выполнения. O(1)o(1)
templatetypedef
1
@templatetypedef Нарушение шифрования сообщения, зашифрованного AES, равно с точки зрения длины сообщения . O(1)
Жиль "ТАК - перестать быть злым"
1

Два примера приходят на ум из области параметризованной сложности и алгоритмов FPT. Это может быть не совсем то, что вы ищете, но здесь идет.

Рассмотрим проблему с графом, такую ​​как 3-ЦВЕТ или ЦИКЛ. Обе проблемы могут быть выражены в монадической логике второго порядка, и, следовательно, могут быть решены в линейном времени графов с ограниченной шириной дерева. Это результат Bruno Courcelle , но полученный алгоритм далеко не практичен.

O(p9p/2)LO(p2pL)pL

Юхо
источник
2
O(n)o(n)
0

Отчасти с вашим вопросом связаны алгоритмы, которые, как известно, теоретически имеют хорошую производительность, но не используются в реальных задачах из-за непрактичности в небольших случаях. Другими словами, как вы и просили, «заявленная производительность» возможна только для больших входов в теории, а не в практических приложениях. это иногда отражается в оценках Big-Oh, в других случаях не совсем так. некоторые алгоритмы имеют хорошую теоретическую «производительность», но очень логически сложны и никогда не были реализованы кем-либо, и поэтому «производительность» на практических размерах экземпляров даже не известна, например, как с проблемой максимального потока .

ВЗН
источник
Но являются ли они непрактичными, потому что доминируют младшие члены или потому, что константы в старших членах плохие?
Дэвид Ричерби
Либо, либо их сочетание было бы трудно выделить в каждом случае. эффективно / практически тот же эффект.
vzn
-1

Это шутка, но есть серьезная сторона ...

O(nlogn)O(n2)

Дэвид Ричерби
источник
1
Нет, это другое. Быстрая сортировка полезна на практике, потому что для типичного ввода не существует квадратичного термина, независимо от его размера. Если выбор разворота плох для макета данных, быстрая сортировка демонстрирует квадратичное поведение даже для небольшого ввода.
Жиль "ТАК - перестань быть злым"