Следующий алгоритм (использует динамическое c программирование) принимает входные данные: C
- это целое число, p
- это массив, содержащий целые числа, а n
- это размер p
. Обратите внимание, что этот код является псевдокодом.
Start(C, p, n)
let mem[1..C, 1..n] be a multi-dimensional array
for i=1 to C
for j=1 to n
mem[i,j] = -1
return Count(C, p, n, mem)
Count(C, p, i, mem)
if mem[C, i] >= 0
return mem[C, i]
if C==0
q = 1
elif n < 1 or C < 0
q = 0
else
q = Count(C - p[i], p, i-1, mem) + Count(C, p, i-1, mem)
mem[C, i] = q
return q
Почему время выполнения этой реализации называется O (n *C)?
Для каждой подзадачи в Count
, существует максимум i-1
подзадач, и мы решаем две из них, Count(C - p[i], p, i-1, mem)
и Count(C, p, i-1, mem)
.
Таким образом, почему время выполнения не равно O (n ^ 2)? Я имею в виду, если мы для каждой подзадачи решаем подзадачи i-1 * 2, мы получим арифметический ряд c, который равен O (n ^ 2)? Если я не прав, скажите, пожалуйста:)
Наш C
положительный, но в остальном он не ограничен. C
может быть больше n
, и в этом случае я вижу, что n*C > n*n
, что подразумевает O(n*C)
из-за инициализации массива в Start
. Однако, если C
меньше n, то n*C < n*n
, что означает O(n^2)
. Так что вы скажете O(n*C)
или O(n^2)
- почему бы и нет?