Является ли поиск таблицы с предварительно вычисленными значениями алгоритмом O (1)?

1

Рассмотрим любую функцию алгоритма

f(x0,x1,...xn). 

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

 f (x0,x1,..xn) { 
 return array[x0][x1]...[xn]; 
 } 
  • 2
    Как это связано с функциональным программированием?
  • 0
    Да............
Показать ещё 1 комментарий
Теги:
algorithm
functional-programming

7 ответов

2

Это будет O (n), а не O (1), так как вам нужно найти n+1 индексы массива, чтобы найти результат.

  • 0
    Это будет N O (1) OPS, который является O (1)
  • 1
    @ Не играет, если n - это число аргументов функции - в этом случае это O (n).
Показать ещё 6 комментариев
1

Если число измерений является переменным, например, потому что ваш алгоритм является агностическим по размеру, и приложения будут использовать огромное количество измерений, то он будет точно определять сложность как O (n), где n - размерность (но обычно n ссылается к длине ввода, d или k будет более обычным именем переменной). Например, размерность может быть переменной в алгоритмах интегрирования или оптимизации функций в k-мерных пространствах. Интеграция Монте-Карло имеет, например, скорость конвергенции sqrt (k).

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

0

Будьте осторожны, чтобы не смутить себя. Когда мы говорим, что алгоритм имеет временную сложность O (f (n)), то n обозначает размер ввода. В вашем случае, однако, размер ввода всегда один и тот же, смутно именованный n, но было бы лучше назвать его c, потому что он не меняется. Таким образом, вы на самом деле определили алгоритм для конечной задачи, в котором бессмысленно говорить о временной сложности. Время вычисления всегда одно и то же.

Если ваш вопрос о семействе алгоритмов, то на самом деле временем для поиска будет Theta (n), потому что вы разбиваете это на n поисковых запросов, но время для инициализации таблицы поиска будет * Theta (D ^ n * g (n)) *, если D - число значений, которое может принимать x_i, а g (n) - сложность предварительного вычисления значения.

0

Технически говоря, да, доступ к массиву занимает 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. (Как в теории, так и на практике.)

0

Поиск таблиц алгоритмически является операцией O(1) поскольку независимо от размера поиск будет выполняться в постоянное время.

n здесь - плохо выбранная метрика, так как n - это действительно число переменных, которые нужно читать и применять к массиву. Несмотря на то, что операция может быть сведена к выполнению O(1) количество поисков по-прежнему остается n (фактически n+1 с индексом на основе 0), который, таким образом, становится O(n). Поэтому из-за неудачного выбора n это практически ничего не значит.

  • 0
    Хм, нет ли n постоянных поисков времени по этому вопросу?
  • 1
    Да, я перефразировал, чтобы более четко ответить на полный вопрос
Показать ещё 11 комментариев
0

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

это, безусловно, O (1). потому что у вас есть ограниченное количество комбинаций, прежде чем вы вызовете функцию f() (так как перед вызовом функции f() все комбинации должны быть рассчитаны и сохранены в этом многомерном массиве). поэтому вам нужно только получить доступ к массиву для конкретной комбинации ввода.

Обратите внимание, что сложность этого будет O (1), так как мы рассматриваем время доступа массива как O (1). если утверждать, что для доступа к этому массиву необходимо добавить индексы к базовому адресу (например, [i] = * (a + i)), то, поскольку будет n количество дополнений для n измерений. время доступа становится O (n).

-3

порядок должен быть O (n), однако вы можете уменьшить его до логарифмического с помощью двоичного поиска (в лучшем случае вы можете иметь сложность ao (1)),

  • 1
    Мне интересно, как вы могли бы использовать бинарный поиск здесь. Во-первых, это относится только к отсортированным массивам, затем не имеет ничего общего с проблемой.
  • 0
    Есть два варианта: вы можете отсортировать алгоритм, используя сортировку слиянием, которая будет стоить вам время входа в систему, затем применить бинарный поиск, который будет также стоить время входа в систему, так что у вас есть чистый заказ (logN). Я думаю, что лучше изменить структуру данных с массива на BST.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню