Степень сложности определителя Лейбница

58
8

Я написал код, который вычисляет детерминант данной матрицы nxn, используя формулу Лейбница для детерминант.

Я пытаюсь понять его сложность в O-нотации. Я думаю, что это должно быть что - то вроде: O(n!) * O(n^2) + O(n) = O(n!*n^2) Или O((n+2)!) Аргументация: Я думаю, что O(n!) - сложность перестановок. и O(n) сложность perm_parity, а O(n^2) - умножение n элементов на каждую итерацию.

это мой код:

def determinant_leibnitz(self):
assert self.dim()[0] == self.dim()[1] # O(1)
dim = self.dim()[0] # O(1)
det,mul = 0,1 # O(1)
for perm in permutations([num for num in range(dim)]):
for i in range(dim):
mul *= self[i,perm[i]] # O(1)
det += perm_parity(perm)*mul # O(n) ?
mul = 1 # O(1)
return det

Следующие функции, которые я написал, также используются в расчете:

perm_parity: При перестановке цифр 0..n в порядке списка возвращается его четность (или знак): +1 для четного паритета; -1 для нечетного.

Я думаю, что perm_parity должен работать на O(n^2) (это правильно?).

def perm_parity(lst):
parity = 1
lst = lst[:]
for i in range(0,len(lst) - 1):
if lst[i] != i:
parity *= -1
mn = argmin(lst[i:]) + i
lst[i],lst[mn] = lst[mn],lst[i]
return parity

argmin: возвращает индекс минимального аргумента в списке. Я думаю, что argmin должен работать на O(n) (это правильно?)

def argmin(lst):
return lst.index(min(lst))

и перестановка: возвращает все перестановки заданного списка. например: вход: [1,2,3], выход [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]].

Я думаю, что перестановки должны выполняться на O(n!) (Это правильно?)

def permutations(lst):
if len(lst) <= 1:
return [lst]
templst = []
for i in range(len(lst)):
part = lst[:i] + lst[i+1:]
for j in permutations(part):
templst.append(lst[i:i+1] + j)
return templst

спросил(а) 2013-05-13T20:32:00+04:00 7 лет, 4 месяца назад
1
Решение
71

Это старый вопрос, но по-прежнему заслуживает ответа.

Сложность, которую вы ищете, - O((n+2)!).
Это связано с тем, что O(n!) - сложность этого:
for perm in permutations([num for num in range(dim)])
O(n) сложность функции perm_parity.
O(n^2) - сложность умножения n элементов на каждой итерации.
Это все дает O(n!)*O(n)*O(n^2)=O(n!n^2)=O((n+2)!)

(И, как говорится в комментарии, в вашем случае вы даже получаете ϴ((n+2)!))

ответил(а) 2016-01-25T21:28:00+03:00 4 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема