Матричное умножение с использованием стандартного итерационного подхода - это O (n), так как вы должны выполнять итерацию по n строкам и n столбцам, а для каждого элемента вектор умножается на одну из строк и один из столбцов , который принимает n умножений и n-1 дополнений.
псевдопользователей код для умножения матрицы А матрицы Ь и хранить в матрице с:
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
int sum = 0;
for(m = 0; m < n; m++)
{
sum += a[i][m] * b[m][j];
}
c[i][j] = sum;
}
}
Для булевой матрицы, как указано в задаче, и используется в вместо умножения и ИЛИ вместо Кроме того, так что становится это:
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
boolean value = false;
for(m = 0; m < n; m++)
{
value ||= a[i][m] && b[m][j];
if(value)
break; // early out
}
c[i][j] = value;
}
}
Дела заметить здесь в том, что когда-то наша булевой «сумма», правда, мы можем остановить вычисления и рано из внутреннего цикла, так как ORing любых последующих значений с Tru e будет выдавать истину, поэтому мы сразу можем знать, что окончательный результат будет правдой.
Для любой константы k
количество операций, прежде чем мы сможем сделать это раньше (при условии, что значения являются случайными), будет зависеть от k и не будет увеличиваться с n. На каждой итерации будет (1/k) вероятность того, что цикл завершится, потому что нам нужно два 1s для этого, и вероятность того, что каждая запись будет равна 1, равна 1/k. Число итераций до завершения будет следовать за Geometric distribution, где p является (1/k) , а ожидаемое количество «проб» (итераций) до «успеха» (выход из цикла) не зависит от n (кроме как верхняя граница для количества испытаний), поэтому самый внутренний цикл работает в постоянное время (в среднем) для заданного k, делая общий алгоритм O (n). Формула геометрического распределения должна дать вам некоторое представление о том, что произойдет, если k = n. Заметим, что в формуле, приведенной в Википедии, k - количество испытаний.
Когда k велико, вы почти никогда не выйдете раньше, и ваш алгоритм будет O (n^3). –
@ Анонимное обозначение Big O определяет * предельное * поведение функции. Независимо от того, насколько велика k, поскольку n стремится к бесконечности, время выполнения будет стремиться к O (n^2) для данного k. – samgak
Вы правы ... вопрос запутан, так как он говорит о постоянстве k, а также k = n. –