- 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;
}
Вряд ли, т.к. здесь надо думать
Т.е. массив [,] всегда можно представить как таблицу, а [][] - нет
Стек парву!
Без рекурсии было бы больше страданий и хуже код
боюсь int-а тебе не хватит
Другой реализации не вижу.
Ну хотя бы наивный способ с суммой по всем перестановкам... Та же факториальная сложность, но там хотя бы матрицу не надо копировать на 100500 раз.
P.S. Хотя там, походу, умножений больше выйдет.
https://ideone.com/UXsvAl
перестановки через алгоритм пилораммы Нарайаны
Хз че кого, просто запилил. Но вообще мне кажется что так лучше чем вычислять перебором все перестановки и потом бегать по ним высчитывая знак их четность
А вообще можно и гауссом имбануть так то
Прочитал как "волшебное".
Всё же, 14 февраля уже, день влюблённых в код, романтика, все дела.
В гейдев решил податься?
P.S. Гугл подсказывает, что надо юзать LU или QR разложение, а потом посчитать определитель по-читерски, тупо перемножив циферки на диагоналях. Там будет O(N^3) вместо O(N!).
Гугли алгоритм Гаусса за О(N^3)
Там глубина рекурсии копеечная, всего лишь на размер матрицы. А сложность у алгоритма - O(N!). Так что оно скорее повиснет на годы, чем стек порвёт...
— Вычислял определитель.
— Чей?
— Матрицы.
— Когда?
— Летом.
— Как вычислял?
— Итеративно .
— КАК?!
— Итеративно .
— Точно?
— Точно.
— А стек чё у неё порван?
— Не знаю.
— Ты порвал?
— Может не я…
— А может и ты, да?
— Нет.