Подтвердить что ты не робот

Является ли моя функция O (n!) Или O ((n-1)!) Более точной?

Я написал алгоритм поиска грубой силы для проблемы коммивояжера и протестировал его, чтобы увидеть время, которое требуется для разных номеров "городов". Из графика ниже видно, что время примерно пропорционально (n-1)!, где n - число "городов". Он не прямо пропорционален n! (в конце концов, (n-1)! = n! / n).

Мой вопрос в том, правильно ли сказать, что алгоритм работает в O(n!), или мне лучше сказать O((n-1)!)? Я никогда раньше этого не видел, но он кажется более точным. Кажется, я что-то неправильно понял.

[t = время, n = количество городов]

4b9b3361

Ответ 1

По определению, O (f (n)) - множество всех функций, асимптотически доминирующих f (n), т.е. множество всех функций g (n), для которых существуют константы C и n_0 такие, что

g(n) < C * f(n)   for all n > n_0

Из этого определения следует, что O (n!) на самом деле является надмножеством O ((n-1)!), так как функция f (n) = n! является членом первого набора, но не второго набора. Эти два набора на самом деле не совпадают.

Верно, однако, сказать, что ваша проблема - O (n!), так как это только утверждает верхнюю границу. Неправильно было бы сказать, что ваша проблема Θ (n!), Так как это означает точное асимптотическое поведение с точностью до постоянных факторов.

На практике нет большой разницы, и, как отмечено в другом ответе, вы можете переопределить n, чтобы иметь в виду число городов минус единицы.

Ответ 3

Вы можете просто доказать:

O ((n-1)!) означает, что существует константа c, такая как:

алгоритм (или временная сложность) < c (n-1)! < c n!/n < c n! для любого n > 1.

Итак, так как ваша функция сложности алгоритма выполняется: алгоритм (или временная сложность)

ваш алгоритм также O (n!).

Итак, мы доказали, что если временная сложность вашего алгоритма O ((n-1)!), то это также O (n!).

Ответ 4

Ответ Свена Марнаха действительно хороший, я просто хочу немного рассказать об этой части:

или мне лучше сказать O ((n-1)!)?

Как говорили другие, O(n) обычно достаточно хорош. Если вы хотите узнать больше о проблеме, вы можете попытаться найти и доказать:

  • Нижняя граница (обычно обозначаемая Ω(n))
  • Тесная верхняя граница

Нижняя граница в основном говорит, что при некоторых асимптотах не может быть алгоритма, решающего задачу асимптотически быстрее. Тесная верхняя граница является верхней границей, которая соответствует нижней границе, т.е. Вам нужно доказать нижнюю границу Ω(f(n)) и верхнюю границу O(f(n)). Если вы можете доказать нижнюю границу и плотную верхнюю границу, это означает, что ваш алгоритм является асимптотически оптимальным алгоритмом для проблемы.

Чтобы дать конкретный пример для этого: вы наверняка знаете алгоритмы сортировки, такие как сортировка слияния или быстрая сортировка и их верхняя граница O(n log n)). Дональд Кнут (десятилетие назад) показал, что алгоритмы сортировки на основе сравнения для целых чисел требуют не менее n log n сравнений, т.е. Операций Ω(n log n). Поскольку у нас есть соответствующая верхняя граница, как сортировка сортировки, так и быстрая сортировка называются асимптотически оптимальными (хотя их производительность на практике сильно отличается).