我有一个赋值,我需要在C函数中编写一个函数,它检查给定矩阵中是否有一行充满'1'。矩阵值可以只是'1'或'0'(布尔矩阵)。
例如:(大小3)
1 1 0
1 1 1
0 0 1
返回1(true)
1 1 0
1 0 1
1 0 0
返回0(错误)
现在,它非常简单,没有任何限制,但后来我被要求以O(1)
的时间复杂度执行此操作,我不知道,从哪里开始。
如果有帮助:我们被要求在此之前编写2个函数:
init(n, A)
使用O(n^2)
flip(A, i ,j)
将{i,j]的值从'0'变为'1'或'1'变为'{0} {/ 1} 答案 0 :(得分:2)
要抓住的是先前完成了"会计工作"现在只需要在恒定时间内获取结果。
这里可能会采用不同的策略。在O(n^2)
时间内用1s初始化矩阵后,现在每次翻转都可以跟踪:
如果您选择跟踪1,那么每个矩阵需要额外的O(n)
内存来存储它们。当您翻转1
时,从 one-on-a-row 数组中减去1。当您翻转0
时,您将1添加到您的行上*阵列。
如果您跟踪翻转,则按行执行,您需要再次O(n)
个额外内存。同样,您有一个帮助器数组,您可以在其中存储每行的翻转次数。如果你翻转并且新的是0
- 添加一个,如果你翻转&新的是1
- 减去一个。
然后,在您的O(1)
- 函数中,您只需检查行的相应数组位置的存储值。
答案 1 :(得分:0)
O(1)(恒定时间)是不可能的,除非矩阵的大小是固定的
然后,您只需对每一行使用一些if
操作:
// Matrix has fixed size 2x2
if (matrix[0][0] && matrix[0][1]) return 1;
if (matrix[1][0] && matrix[1][1]) return 1;
return 0;
(您需要flip
函数用于什么?)
否则:只需遍历矩阵:
<强>初始化:强>
void init(unsigned n, unsigned matrix[n][n]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = 1;
}
}
}
选项1:
unsigned check(unsigned n, unsigned matrix[n][n]) {
for (int i = 0; i < n; i++) {
unsigned found = 1;
for (int j = 0; j < n; j++) {
if (!matrix[i][j]) {
found = 0;
break;
}
}
if (found) {
return 1;
}
}
return 0;
}
选项2:
unsigned check(unsigned n, unsigned matrix[n][n]) {
for (int i = 0; i < n; i++) {
unsigned sum = 0;
for (int j = 0; j < n; j++) {
sum += matrix[i][j];
}
if (sum == 3) {
return 1;
}
}
return 0;
}
答案 2 :(得分:-2)
由于“大O”表示法想要给出时间(复杂性)的顺序,它只会查看顺序1,n,正方形,日志等。
通过n x n
矩阵需要n 2 步骤(时间),O(n 2 )也是如此。 init
会做类似的事情。
O(1)应该一步完成任务。翻转可以做到这一点,因为它转到元素一步翻转(索引数组)。
注意:完成初始化和翻转的算法(函数)非常简单,但我不想为你做功课,只是让你去。