Оценка фактической (не теоретической) сложности реализации во время выполнения

Любой специалист в области информатики знает, что HeapSort — это O(n log n) наихудший случай в теории, а QuickSort — O(n^2) наихудший случай. Однако на практике хорошо реализованная быстрая сортировка (с хорошей эвристикой) превосходит кучевую сортировку для каждого отдельного набора данных. С одной стороны, мы едва наблюдаем наихудший случай, а с другой стороны, например. Строки кэша ЦП, предварительная выборка и т. д. имеют огромное значение во многих простых задачах. И хотя, например. QuickSort может обрабатывать предварительно отсортированные данные (с хорошей эвристикой) в O(n), HeapSort всегда реорганизует данные в O(n log n), поскольку не использует существующую структуру.

Для моего игрушечного проекта caliper-analyze я недавно искал методы оценки фактическая средняя сложность алгоритмов по результатам сравнительного анализа. В частности, я пробовал подгонку NNLS Лоусона и Хэнсона с различными полиномами.

Однако пока это работает не слишком хорошо. Иногда я получаю полезные результаты, иногда нет. Я полагаю, что это может помочь просто выполнить более крупные тесты, в частности попробовать больше параметров.

Следующие результаты относятся к сортировке объектов Double по шаблону SAW с 10% случайностью. n было только до 500 для этого прогона, так что это не очень репрезентативно для фактического использования... Цифры - это предполагаемая зависимость времени выполнения от размера. Выходные данные редактируются и сортируются вручную, поэтому они не отражают то, что в настоящее время предоставляет инструмент!

BubbleSortTextbook       LINEAR: 67.59  NLOG2N:  1.89  QUADRATIC: 2.51
BubbleSort               LINEAR: 54.84                 QUADRATIC: 1.68
BidirectionalBubbleSort  LINEAR: 52.20                 QUADRATIC: 1.36
InsertionSort            LINEAR: 17.13  NLOG2N:  2.97  QUADRATIC: 0.86
QuickSortTextbook                       NLOG2N: 18.15
QuickSortBo3             LINEAR: 59.74                 QUADRATIC: 0.12
Java                     LINEAR:  6.81  NLOG2N: 12.33
DualPivotQuickSortBo5                   NLOG2N: 11.28
QuickSortBo5             LINEAR:  3.35  NLOG2N:  9.67

Вы можете сказать, что хотя в этой конкретной настройке (часто она работает неудовлетворительно) результаты в значительной степени согласуются с известным поведением: пузырьковая сортировка действительно затратна, а хорошая эвристика на быстрой сортировке намного лучше. Однако, например. Например, быстрая сортировка с эвристикой медианы трех заканчивается оценкой O(n + n^2), в то время как другие быстрые сортировки оцениваются как O(n + n log n).

Итак, теперь к моим актуальным вопросам:

  • Знаете ли вы алгоритмы/подходы/инструменты, которые выполняют анализ сложности во время выполнения на основе данных эталонных тестов, чтобы предсказать, какая реализация (как вы можете видеть выше, мне интересно сравнить различные реализации одного и того же алгоритма! ) лучше всего работает на реальных данных?
  • Знаете ли вы научные статьи по этому поводу (оценка средней сложности реализации)?
  • Знаете ли вы надежные методы подгонки, которые помогут получить здесь более точные оценки? Например. регуляризованная версия NNLS.
  • Знаете ли вы эмпирические правила того, сколько образцов нужно, чтобы получить разумную оценку? (в частности, когда инструмент должен воздерживаться от какой-либо оценки, так как она все равно будет неточной?)

И позвольте мне еще раз подчеркнуть, что меня не интересует теоретическая сложность или формальный анализ. Мне интересно посмотреть, как реализации (теоретически даже идентичных алгоритмов) работают с данными тестов на реальных процессорах... Числовые коэффициенты для общего диапазона представляют для меня ключевой интерес, больше чем асимптотическое поведение. (и нет, в долгосрочной перспективе это не только временная сложность и сортировка. Но меня интересуют индексные структуры и другие параметры. А штангенциркуль может, например, также измерять потребление памяти, если я не ошибаюсь) Плюс, я работает в java. Подход, который просто вызывает встроенный Matlab, для меня бесполезен, так как я не живу в мире Matlab.

Если у меня будет время, я попытаюсь повторно запустить некоторые из этих тестов с большим разнообразием размеров, чтобы получить больше точек данных. Может быть, тогда это просто сработает... но я считаю, что есть более надежные методы регрессии, которые я мог бы использовать для получения более точных оценок даже из небольших наборов данных. Кроме того, я хотел бы определить, когда выборка слишком мала, чтобы вообще делать какие-либо прогнозы!


person Erich Schubert    schedule 05.07.2013    source источник
comment
@JimGarrison Не обязательно. ОП продолжает подчеркивать, что его меньше интересуют теоретические компоненты...   -  person Zong    schedule 05.07.2013
comment
Больше подходит для теоретической информатики или перекрестной проверки   -  person Jim Garrison    schedule 05.07.2013
comment
Верно, но этот вопрос не о программировании, а об оценке алгоритма. Несмотря на то, что подход является эмпирическим, он все же больше связан со статистикой и [прикладной] теорией.   -  person Jim Garrison    schedule 05.07.2013
comment
Это не совсем применимо для TCS, потому что я предполагаю модель алгоритма черного ящика. А по CV у меня сложилось впечатление, что решения будут не слишком практически применимы. SO гораздо больше касается реализации этих вещей в реальном коде. Решение, которое работает в теории, мне мало помогает. Теоретически NNLS должна выполнять эту работу, но на практике она работает недостаточно хорошо; возможно, он недостаточно надежен. выбросы и плохо переносят многократные измерения при одном и том же n?   -  person Erich Schubert    schedule 05.07.2013
comment
Кроме того, статистики часто предполагают, что я делаю это только один раз. Затем я могу выбрать параметры вручную, настроить ядро ​​и т.д.; но я пытаюсь превратить это во встроенную функцию моего инструмента для анализа штангенциркуля, которая должна работать без установки каких-либо параметров. :-(   -  person Erich Schubert    schedule 05.07.2013
comment
Итак, вопрос сводится к тому, чтобы порекомендовать какие-нибудь сложные инструменты сравнительного анализа, которые выполняют некоторый статистический анализ?   -  person Raedwald    schedule 06.07.2013
comment
@Raedwald Я думаю, что он довольно хорошо обобщил вопросы в списке в конце: как написать программу, которая автоматически оценивает масштабируемость алгоритма с учетом набора результатов тестов.   -  person Has QUIT--Anony-Mousse    schedule 06.07.2013


Ответы (1)


Если вам нужна реальная сложность, вам лучше ее измерить. Попытка угадать, как программа будет работать без измерения, очень ненадежна.

Одна и та же программа может работать по-разному на разных машинах. например один алгоритм может быть быстрее на одной машине, но медленнее на другой.

Ваши программы могут работать медленнее в зависимости от того, что еще делает машина, поэтому алгоритм, который выглядит хорошо, но сильно использует ресурсы, такие как кеши, может быть медленнее и замедлять работу других программ, когда ему приходится совместно использовать эти ресурсы.

Тестирование алгоритма на машине само по себе может быть в 2-5 раз быстрее, чем попытка использовать его в реальной программе.

Знаете ли вы эмпирические правила того, сколько образцов нужно, чтобы получить разумную оценку? (в частности, когда инструмент должен воздерживаться от какой-либо оценки, так как она все равно будет неточной?)

Для определения процентиля, такого как 90% или 99%, вам нужно 1/(1-p)^2, т. е. для тайла 99% вам нужно как минимум 10 000 образцов после прогрева. Для тайла 99,9% нужен миллион.

person Peter Lawrey    schedule 05.07.2013
comment
Но разве он на самом деле не пытается это сделать: автоматизировать такого рода тестирование? Оценка сложности по данным бенчмаркинга очень похожа на это, ИМХО. - person Has QUIT--Anony-Mousse; 06.07.2013
comment
Конечно. Я уже измеряю время выполнения при различных настройках параметров, теперь я хочу обобщить это для пользователя в виде функции входных параметров (например, размера набора данных). - person Erich Schubert; 08.07.2013
comment
@ErichSchubert Вы можете начать с n^p, где p - неизвестная степень. Вы можете сделать это, взяв журнал с размером выборки n и журнал времени, и ваша оценка отношения этих журналов будет p. Это будет работать, даже если p равно 1, 1,1, 1,5, 2 и т. д. Моделирование данных очень сложный предмет, и многие кандидаты наук зарабатывают на жизнь этим после многолетнего опыта. Однако они обычно моделируют теоретические системы. Вы хотите смоделировать реальную систему, что означает принятие некоторых компромиссов, которые трудно привести в какое-либо доказательство. - person Peter Lawrey; 08.07.2013