Как ускорить эту рекурсивную функцию? Когда он достигает матрицы 10x10, для решения проблемы требуется около минуты или около того. Я включил функцию события так, чтобы вы могли видеть, когда произойдет расчет.Ускорение алгоритма рекурсивного детерминанта
void determinantsFrame::OnCalculateClick(wxCommandEvent &event)
{
double elem[MAX][MAX]; double det; string test; bool doIt = true;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
test = (numbers[i][j]->GetValue()).mb_str();
if (test == "")
{
doIt = false;
break;
}
for (int k = 0; k < test.length(); k++)
if (isalpha(test[k]) || test[k] == ' ')
{
doIt = false;
break;
}
else if (ispunct(test[k]))
{
if (test[k] == '.' && test.length() == 1)
doIt = false;
else if (test[k] == '.' && test.length() != 1)
doIt = true;
else if (test[k] != '.')
doIt = false;
}
if (doIt == false)
break;
}
if (doIt == false)
break;
}
if (doIt)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
elem[i][j] = static_cast<double>(wxAtof(numbers[i][j]->GetValue()));
det = determinant(elem, n);
wxMessageBox(wxString::Format(wxT("The determinant is: %.4lf"),det));
}
else
wxMessageBox(wxT("You may have entered an invalid character. Please try again"));
}
double determinantsFrame::determinant(double matrix[MAX][MAX], int order) // Here's the recursive algorithm
{
double det = 0; double temp[MAX][MAX]; int row, col;
if (order == 1)
return matrix[0][0];
else if (order == 2)
return ((matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]));
else
{
for (int r = 0; r < order; r++)
{
col = 0; row = 0;
for (int i = 1; i < order; i++)
{
for (int j = 0; j < order; j++)
{
if (j == r)
continue;
temp[row][col] = matrix[i][j];
col++;
if (col == order - 1)
col = 0;
}
row++;
}
det = det + (matrix[0][r] * pow(-1, r) * determinant(temp, order - 1));
}
return det;
}
}
Рассмотрите возможность замены рекурсивного вызова на 'stack <>' рекурсию данных. Это устранит некоторые «JMP» и накладные расходы стека. Кроме того, вы запускаете это через профилировщик? Где узкое место в производительности? Вы также выделяете новый «temp» для каждого вызова. Это действительно необходимо? –
Если у вас нет полезных ответов здесь, вы можете попробовать на http://codereview.stackexchange.com/. Тем не менее, я считаю этот вопрос уместным, поэтому я бы не закрыл его. –
Это очень помогло бы, если это было [MCVE] (http://stackoverflow.com/help/mcve). Что такое 'MAX',' numbers [] [] ',' n' и т. Д. Размер матрицы, вероятно, определит, какой тип оптимизации нужен (матрица 3x3 будет оптимизирована значительно иначе, чем 30000x30000) , – uesp