#c #algorithm #time-complexity
#c #алгоритм #временная сложность
Вопрос:
Как вычислить временную сложность этой функции шаг за шагом?
Эта функция преобразует список смежности в матрицу, манипулирует матрицей, а затем преобразует матрицу обратно в список
Graphe *Graphe::grapheInverse( void ){
Graphe *r = new Graphe (_adjacences.size() );
std::vector<vector<int> > matrix(_adjacences.size(), vector<int>( _adjacences.size() ) );
std::vector<vector<int> > liste(matrix.size());
for (unsigned i = 0; i < _adjacences.size(); i )
for (auto j : *_adjacences[i])
matrix[i][j] = 1;
for (int i = 0; i < matrix.size(); i ) {
for (int j = 0; j < matrix[i].size(); j ) {
if (matrix[i][j] == 1)
matrix[i][j] = 0;
else
matrix[i][j] = 1;
if (i == j)
matrix[i][j] = 0;
}
}
for (int i = 0; i < matrix.size(); i ){
for (int j = 0; j < matrix[i].size(); j ){
if (matrix[i][j] == 1){
liste[i].push_back(j);
}
}
}
for (int i = 0; i < liste.size(); i ) {
for (int j = 0; j < liste[i].size(); j ) {
r->ajouterArcs( i, liste[i][j] );
}
}
return r;
}
Комментарии:
1. Есть ли у вас какие-либо экспериментальные результаты? Это действительно может ответить на ваш вопрос или, по крайней мере, может быть использовано для проверки результатов анализа
2. что вы подразумеваете под результатами? список в качестве примера и что происходит?
3. Вас интересует точная или асимптотическая временная сложность?
4.
O(N*N)
, гдеN
— количество записей в строке матрицы. Слишком много требуется, чтобы разобраться, почему это так — это большая тема, с которой лучше справляются книги по алгоритмам.5. Знакомы ли вы с обозначением «Big O»?
Ответ №1:
Обратите внимание, что все следующее относится к временной сложности big-O:
Вычисление временной сложности включает в себя просмотр того, сколько раз вы выполняете итерацию по данным. Один цикл for равен N, поскольку вы касаетесь каждой точки один раз. Вложенный цикл for (для i в данных, для j в данных) равен N ^ 2, потому что вы касаетесь каждой точки один раз для каждой существующей точки.
Цикл for, следующий за циклом for (для i в data выполняется X, для i в data выполняется Y), касается данных N N раз. Это все еще считается временной сложностью N, потому что, поскольку N приближается к очень большому числу, 2N не имеет большого значения. То же самое относится и к вложенным циклам, N ^ 2 N ^ 2 = 2N ^ 2 -> По сути, вы бы проигнорировали любые множители и действовали в зависимости от времени касания N. Это означает, что 2N ^ 2 изменяется на N ^ 2
Повторяю, это специально для большой временной сложности
Комментарии:
1. значит, это равно: 4 * N ^ 2?
2. Пожалуйста, рассмотрите возможность редактирования ответа, в котором подчеркивается деталь «big-O» 🙂
3. @adam нет, ответ
N^2
, поскольку константы игнорируются4. @PeteBecker Вы правы, я имел в виду N ^ 2 N ^ 2, я изменил ответ, чтобы отразить это.
5. Причина, по которой «константы игнорируются», заключается в том, что они выпадают. Если вы удвоите размер входных данных, не имеет значения, касается алгоритм данных N раз или 2N раз. Удвоение размера входных данных удваивает время, затрачиваемое алгоритмом, независимо от того, на что умножается N. В этом и заключается суть O (чего бы то ни было): он измеряет, насколько увеличивается необходимое время при увеличении размера входных данных.