- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
static int Determinant(int[,] matrix)
{
int length = matrix.GetLength(0);
int result = 0;
if (matrix.Length > 1)
for (int i = 0; i < length; ++i)
result += (2 * (i & 1) - 1)
* matrix[i, 0]
* Determinant(CutMatrix(matrix, i, 0));
else
result = matrix[0, 0];
return result;
}
static int[,] CutMatrix(int[,] matrix, int cutRowIndex, int cutColumnIndex)
{
int length = matrix.GetLength(0);
int[,] result = new int[length - 1, length - 1];
for (int y = 0, ry = 0; y < length; ++y, ++ry)
{
if (y != cutRowIndex)
for (int x = 0, rx = 0; x < length; ++x, ++rx)
{
if (x != cutColumnIndex)
result[ry, rx] = matrix[y, x];
else
--rx;
}
else
--ry;
}
return result;
}
d_fomenok 12.02.2016 18:34 # 0
Tryff 12.02.2016 18:37 # 0
Вряд ли, т.к. здесь надо думать
cykablyad 12.02.2016 18:42 # +1
Tryff 12.02.2016 18:46 # −1
Т.е. массив [,] всегда можно представить как таблицу, а [][] - нет
cykablyad 12.02.2016 18:53 # +2
nihau 12.02.2016 18:54 # +5
nihau 12.02.2016 18:45 # +3
Стек парву!
Tryff 12.02.2016 19:44 # 0
Без рекурсии было бы больше страданий и хуже код
3_dar 12.02.2016 22:16 # +2
боюсь int-а тебе не хватит
j123123 12.02.2016 22:28 # +1
Tryff 12.02.2016 22:46 # +1
3_dar 13.02.2016 13:57 # −1
Tryff 13.02.2016 16:30 # −2
Другой реализации не вижу.
bormand 13.02.2016 17:37 # −1
Ну хотя бы наивный способ с суммой по всем перестановкам... Та же факториальная сложность, но там хотя бы матрицу не надо копировать на 100500 раз.
P.S. Хотя там, походу, умножений больше выйдет.
kegdan 13.02.2016 19:52 # −1
https://ideone.com/UXsvAl
перестановки через алгоритм пилораммы Нарайаны
Хз че кого, просто запилил. Но вообще мне кажется что так лучше чем вычислять перебором все перестановки и потом бегать по ним высчитывая знак их четность
А вообще можно и гауссом имбануть так то
1024-- 13.02.2016 21:25 # 0
Прочитал как "волшебное".
Всё же, 14 февраля уже, день влюблённых в код, романтика, все дела.
kegdan 13.02.2016 21:26 # −1
1024-- 13.02.2016 21:27 # −1
kegdan 13.02.2016 21:30 # −1
bormand 13.02.2016 21:33 # −1
В гейдев решил податься?
kegdan 13.02.2016 21:39 # −1
bormand 13.02.2016 18:06 # −1
bormand 13.02.2016 18:21 # −1
P.S. Гугл подсказывает, что надо юзать LU или QR разложение, а потом посчитать определитель по-читерски, тупо перемножив циферки на диагоналях. Там будет O(N^3) вместо O(N!).
3_dar 14.02.2016 10:12 # −1
Гугли алгоритм Гаусса за О(N^3)
bormand 13.02.2016 18:12 # −1
Там глубина рекурсии копеечная, всего лишь на размер матрицы. А сложность у алгоритма - O(N!). Так что оно скорее повиснет на годы, чем стек порвёт...
kegdan 13.02.2016 21:37 # +2
— Вычислял определитель.
— Чей?
— Матрицы.
— Когда?
— Летом.
— Как вычислял?
— Итеративно .
— КАК?!
— Итеративно .
— Точно?
— Точно.
— А стек чё у неё порван?
— Не знаю.
— Ты порвал?
— Может не я…
— А может и ты, да?
— Нет.
bormand 13.02.2016 21:51 # −1
kegdan 13.02.2016 21:53 # −1