Может ли сложность времени Big-Oh содержать более одной переменной?

11

Скажем, например, я занимаюсь обработкой строк, которая требует некоторого анализа двух строк. У меня нет никакой информации о том, какова их длина, поэтому они происходят из двух разных семей. Было бы приемлемо назвать сложность алгоритма или O ( n + m ) (в зависимости от того, используем ли мы наивный или оптимизированный алгоритм)?O(nm)O(n+m)

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

Было бы уместно просто назвать их потому что оба вычисления линейны?O(n)

corsiKa
источник
Посмотрите комментарии к этому ответу для небольшого предыстории - мое уважение к @corsiKa за то, что так смело задавал такой спорный вопрос.
OldCurmudgeon
@ OldCurmudgeon, понятно. Я бы не хотел заходить в эту ветку комментариев. Oldcurmudgeon, вы спорите о нотации big-O, не понимая нотацию big-O? Действительно неловко. Кроме того, вы и corsiKa спорите по поводу времени выполнения без определения параметров и m - рецепт для недопонимания. Подсказка: одно общее соглашение при работе со строками - согласиться использовать m для использования длины одной строки и n для длины другой строки - но в идеале, вероятно, лучше сделать это явным, потому что в противном случае это может вызвать путаницу (как проиллюстрировано здесь). nmmn
DW
@DW Вполне возможно, что OldCurmudgeon просто выучил другое определение в школе ... Как я отмечаю в комментарии ниже, возможно избежать нескольких переменных, хотя я никогда не думал об этом до сих пор. Может быть, это - или что-то подобное - раньше было стандартом?
Patrick87
2
Я думаю, что здесь достаточно ответов здесь и здесь .
Рафаэль

Ответы:

14

Ну конечно; естественно. Это хорошо и вполне приемлемо. Распространено и стандартно видеть алгоритмы, время работы которых зависит от двух параметров.

Например, вы часто будете видеть время выполнения поиска в глубину, выраженное как , где n - количество вершин, а m - количество ребер в графе. Это совершенно верно. Смысл этого в том, что существует постоянная c и числа n 0 , m 0, такие что время работы алгоритма не более c ( n + m ) для всех n > n 0 , m > m 0O(n+m)nmcn0,m0c(n+m)n>n0,m>m0, Другими словами, если точное время выполнения равно , мы говорим, что f ( n , m ) = O ( n + m ), если существует c , n 0 , m 0 такое, что n > n 0, и m > m 0 подразумевает f ( n , m ) c ( n + m )f(n,m)f(n,m)=O(n+m)c,n0,m0n>n0m>m0f(n,m)c(n+m),

O(n)O(m)

nmO(n)nnn=m=

O(n)m=O(n)m=O(n)m+n=O(n)O(m+n)O(n)m=O(n)O(n)

Это основные вещи. Вы найдете это по всем учебникам алгоритмов.

DW
источник
1
@OldCurmudgeon, есть вероятность, что вы найдете примеры этого во многих стандартных учебниках по алгоритмам. На какие вы смотрели? Вы пытались просмотреть главу о поиске в глубину (пример, который я упомянул в своем ответе)?
DW
2
OO(V+E)(V,E)
2
n
1
Я согласен, поскольку все используют нотацию Ландау таким образом, но почти никто не знает, что это на самом деле означает (если вы не подключите параметры функционально). См. Также статью, приведенную в ответе А. Шульца, которая начинается с заявления о том, что «основное» и «общее» использование неверно.
Рафаэль
1
@ Patrick87 Теория сложности использует, в силу определения многих известных классов, в основном длину ввода (с заметными исключениями). Анализ алгоритма - когда он сделан серьезно - заинтересован в том, чтобы узнать что-то о фактическом использовании ресурсов (насколько позволяет модель), поэтому другие параметры становятся более интересными, чтобы нарисовать всю картину (более точно).
Рафаэль