Самый простой способ определить временную сложность от времени выполнения

54
6

Предположим, что я пытаюсь проанализировать алгоритм, и все, что я могу сделать, это запустить его с разными входами. Я могу построить набор точек (x, y) как (размер выборки, время выполнения).
Я хотел бы динамически классифицировать алгоритм в класс сложности (линейный, квадратичный, экспоненциальный, логарифмический и т.д.)
В идеале я мог бы дать уравнение, которое более или менее приближает поведение.
Я просто не уверен, что лучший способ сделать это.


Для любого полинома степени я могу создавать кривые регрессии и придумывать некоторую меру пригодности, но на самом деле я не знаю, как бы это сделать для любой неполиномиальной функции. Это сложнее, поскольку у меня нет каких-либо знаний о том, какую форму я должен попробовать.


Это может быть скорее математический вопрос, чем вопрос программирования, но мне это очень интересно. Я не математик, поэтому может быть более простой метод, чтобы получить разумную функцию из множества точек, о которых я просто не знаю. Есть ли у кого-нибудь идеи для решения такой проблемы? Есть ли числовая библиотека для С#, которая может помочь мне хруст числа?

спросил(а) 2020-03-25T17:01:26+03:00 2 месяца назад
1
Решение
65

Хорошо, что вам не очень много классов сложности, поэтому скажем: линейный, квадратичный, полиномиальный (степень > 2), экспоненциальный и логарифмический.


Для каждого из них вы можете использовать самую большую (x, y) пару для решения неизвестной переменной. Пусть y = f (x) обозначает время выполнения вашего алгоритма в зависимости от размера выборки. Предположим, что f (1) = 0, и если это не так, мы всегда можем вычесть это значение y (1) из каждого из y, это просто исключает константы в f (x). Пусть y (end) обозначает последнее (и наибольшее) значение y в вашем наборе данных (x, y).


В этот момент мы можем решить для неизвестного в каждой канонической форме:


f(x) = c*x
f(x) = c*x^2
f(x) = x^c
f(x) = c^x
f(x) = log(x)/log(c)

Поскольку в каждом уравнении есть только одно неизвестное, мы можем вам решить любую задачу. Рассмотрим следующие данные, полученные из многочлена случайной степени > 2:


x = [ 1 2 3 4 5 6 7 8 9 10 ];
y = [ 0 6 19 44 81 135 206 297 411 550 ];

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


550 = c*10    -> c = 55
550 = c*10^2 -> c = 5.5
550 = 10^c -> c = log(550)/log(10) ~= 2.74
550 = c^10 -> c = 550^(1/10) ~= 1.88
550 = log(x)/log(c) -> c = 10^(1/550) ~= 1.0042

Теперь мы можем сравнить, насколько хорошо каждая из этих функций соответствует остальным данным, вот график:


Я новичок, и я не могу размещать изображения, поэтому посмотрим на сюжет здесь: http://i.stack.imgur.com/UH6T8.png


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

ответил(а) 2020-03-25T17:16:47.748548+03:00 2 месяца назад
53

Фигура кривой была искусством, но теперь она как-то декадентна:) (Это шутка для физиков)


Достигнут большой прогресс, который позволяет простым смертным угадывать (некоторые) нетривиальные функциональные зависимости.


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


Eureqa (произносится как "eureka" ) - это программный инструмент для обнаружения уравнений и скрытых математических отношений в ваших данных. Его цель - определить простейшие математические формулы, которые могли бы описать лежащие в основе механизмы, которые создавали данные. Eureqa можно скачать бесплатно и использовать. Найдите загрузку программы, видео-учебник, форум пользователей и другие и справочные материалы.


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


НТН!


Post Scriptum:


К сожалению, программное обеспечение уже не бесплатное: (

ответил(а) 2020-03-25T17:01:26+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема