Рассмотрим любую функцию алгоритма
f(x0,x1,...xn).
Если вывод для каждой комбинации входных аргументов был предварительно вычислен в многомерный массив с n измерениями, может ли алгоритм, который просто ищет решение для данного вызова функции в массиве, считается алгоритмом O (1)? подобно
f (x0,x1,..xn) {
return array[x0][x1]...[xn];
}
Это будет O (n), а не O (1), так как вам нужно найти n+1
индексы массива, чтобы найти результат.
n
- это число аргументов функции - в этом случае это O (n).
Если число измерений является переменным, например, потому что ваш алгоритм является агностическим по размеру, и приложения будут использовать огромное количество измерений, то он будет точно определять сложность как O (n), где n - размерность (но обычно n ссылается к длине ввода, d или k будет более обычным именем переменной). Например, размерность может быть переменной в алгоритмах интегрирования или оптимизации функций в k-мерных пространствах. Интеграция Монте-Карло имеет, например, скорость конвергенции sqrt (k).
Однако обычно n будет небольшой константой и только формально является переменной, потому что нам задан шаблон алгоритма, поэтому разные алгоритмы, следуя одной и той же общей схеме, могут использовать на своем месте разные (но постоянные) значения. Тогда это не интересная переменная, и было бы более корректно и полезно придавать сложность, поскольку O (1) берет любую другую интересующую вас переменную.
Будьте осторожны, чтобы не смутить себя. Когда мы говорим, что алгоритм имеет временную сложность O (f (n)), то n обозначает размер ввода. В вашем случае, однако, размер ввода всегда один и тот же, смутно именованный n, но было бы лучше назвать его c, потому что он не меняется. Таким образом, вы на самом деле определили алгоритм для конечной задачи, в котором бессмысленно говорить о временной сложности. Время вычисления всегда одно и то же.
Если ваш вопрос о семействе алгоритмов, то на самом деле временем для поиска будет Theta (n), потому что вы разбиваете это на n поисковых запросов, но время для инициализации таблицы поиска будет * Theta (D ^ n * g (n)) *, если D - число значений, которое может принимать x_i, а g (n) - сложность предварительного вычисления значения.
Технически говоря, да, доступ к массиву занимает O(n)
время для n
измерений, когда n
неограничен.
Практически говоря, n
никогда не может быть неограниченным, так что n
равно O(1)
, а также время доступа.
Заметим, что предварительная вычисление массива занимает время и пространство хранения экспоненциально по n
(не менее 2^n
элементов), так что ситуации с n
действительно неограниченными не возникают, и асимптотический анализ числа измерений малопригодно.
Стандарт C рекомендует поддерживать до 256 измерений; ни один компьютер на земле не мог хранить такой массив. Я не думаю, что когда-либо превышал n=10
.
Когда доступ к массиву проходит по простому шаблону, например, перемещаясь по одному измерению, соображения Smart Optimizer учитывают это, что приводит к времени доступа O(n + k)
для k
обращений вместо O(nk)
, то есть O(1)
вместо O(n)
на доступ при k>n
. (Как в теории, так и на практике.)
Поиск таблиц алгоритмически является операцией O(1)
поскольку независимо от размера поиск будет выполняться в постоянное время.
n
здесь - плохо выбранная метрика, так как n
- это действительно число переменных, которые нужно читать и применять к массиву. Несмотря на то, что операция может быть сведена к выполнению O(1)
количество поисков по-прежнему остается n
(фактически n+1
с индексом на основе 0
), который, таким образом, становится O(n)
. Поэтому из-за неудачного выбора n
это практически ничего не значит.
n
постоянных поисков времени по этому вопросу?
поскольку вы упомянули об этом, если вывод для каждой комбинации входных аргументов был предварительно вычислен в многомерный массив с n измерениями.
это, безусловно, O (1). потому что у вас есть ограниченное количество комбинаций, прежде чем вы вызовете функцию f() (так как перед вызовом функции f() все комбинации должны быть рассчитаны и сохранены в этом многомерном массиве). поэтому вам нужно только получить доступ к массиву для конкретной комбинации ввода.
Обратите внимание, что сложность этого будет O (1), так как мы рассматриваем время доступа массива как O (1). если утверждать, что для доступа к этому массиву необходимо добавить индексы к базовому адресу (например, [i] = * (a + i)), то, поскольку будет n количество дополнений для n измерений. время доступа становится O (n).
порядок должен быть O (n), однако вы можете уменьшить его до логарифмического с помощью двоичного поиска (в лучшем случае вы можете иметь сложность ao (1)),