演算法資料結構面試題——標記陣列在矩陣特徵識別中的應用
題目:有一個矩陣(10*10),元素值只能為0或1,現在寫一個函式判斷一下有沒有一行都為1,且有一列都為0(除了該行的這個元素為1外)。現要求程式只需要掃描該矩陣一遍,即可得出結果。
來源:網際網路,據說出自微軟面試題。
解答:
不考慮題目最後一句要求的情況下,最直接的方法如下:
bool F(int [10][10]input) { for(int i=0;i<10;i++) { int j; for(j=0;j<10;j++) if(input[i][j]==0) break; if(j==10) { for(int m=0;m<10;m++) { for(int n=0;n<10;n++) if(input[n][m]==1&&n!=i) break; if(n==10) return true; } } } return false; }
可見,這個演算法在每找到一行元素都是1後,會對整個矩陣進行再掃描,理論上對mxn矩陣操作的時間複雜度為O(mn+mxmxn)=O(mxmxn)。但是考慮到實際情況,肯定是不會到這個上限,但是已經效率很低了。
這時可以考慮,另設一個bool ColAllZero[n]陣列,初始為true。在第二層迴圈中掃描第i行是否都是1時,如果出現該行j列元素為1,即標記ColAllZero[j]為false。
這樣只需兩層迴圈,一次掃描,演算法如下。
bool F(int [10][10]input)
{
bool ColAllZero[10];
for(int j = 0; j < 10; j++)
ColAllZero[j] = true;
for(int i = 0; i < 10; i++)
{
int j;
for(j=0; j < 10; j++)
if(input[i][j] == 0) break;
if(j < 10) //掃描到[i][j]時發現為0,即不滿足要求
{
for(int m = 0; m < j; m++)
ColAllZero[m] = false; //標記0至j-1列不滿足全0
}
else //j為10,即掃描完第i行,該行滿足要求
{
for(int m = 0; m < 10; m++)
{
if(!ColAllZero[m]) continue;
for(int n = 0; n < i - 1; i++)
{
if(input[n][m] == 1)
{
ColAllZero[m] = false;
break;
}
}
if(n != i - 1) continue; //[n][m]不為0,不滿足要求
//否則,m列的0至i-1行滿足全0要求
if(i == 9) //滿足要求的行號為第9行,即最後一行
return true; //識別結束,為[i][m]
for(int n = i + 1; n < 10; i++) //滿足要求的行在最後一行之上
{
if(input[n][m] == 1)
{
ColAllZero[m] = false;
break;
}
}
if(n == 10) return true; //第i行第m列滿足要求
}
}
}
return false;
}
特別注意,雖然該演算法仍是三重迴圈,但分析其時間複雜度就會發現是O(mn),而非O(mmn)或O(mnn)。因為在第二層迴圈中不滿足要求但值為1的元素所在的列都會被ColAllZero標記,這些被標記為false的列在第三重迴圈中不會再被訪問。因此時間複雜度為O(mn)。
-
相關文章
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- 資料結構之陣列和矩陣--矩陣&不規則二維陣列資料結構陣列矩陣
- 資料結構和演算法面試題系列—C指標、陣列和結構體資料結構演算法面試題指標陣列結構體
- Rust中陣列資料結構基礎知識Rust陣列資料結構
- 演算法資料結構試題——在陣列中找出已知和的組成數演算法資料結構陣列
- 資料結構與演算法——陣列資料結構演算法陣列
- 資料結構(一)-稀疏矩陣資料結構矩陣
- 資料結構 - 陣列資料結構陣列
- 資料結構-陣列資料結構陣列
- 演算法-陣列與矩陣演算法陣列矩陣
- 脈動陣列在二維矩陣乘法及卷積運算中的應用陣列矩陣卷積
- 【資料結構與演算法】——稀疏陣列資料結構演算法陣列
- 資料結構與演算法 | 陣列(Array)資料結構演算法陣列
- 資料結構之「陣列」資料結構陣列
- 資料結構之陣列資料結構陣列
- 資料結構2——陣列資料結構陣列
- Java資料結構-陣列Java資料結構陣列
- 資料結構與演算法基礎之指標和陣列資料結構演算法指標陣列
- 詳解資料結構中的“陣列”與程式語言中的“陣列”的區別和聯絡資料結構陣列
- JavaScript 的資料結構和演算法 - 陣列篇JavaScript資料結構演算法陣列
- 資料結構與演算法學習-陣列資料結構演算法陣列
- TypeScript演算法與資料結構-陣列篇TypeScript演算法資料結構陣列
- 資料結構與演算法:稀疏陣列(一)資料結構演算法陣列
- 資料結構與演算法之稀疏陣列資料結構演算法陣列
- 矩陣的特徵值和特徵向量矩陣特徵
- TRIZ矛盾矩陣在專利分析中的應用矩陣
- js 中基礎資料結構陣列去重問題JS資料結構陣列
- 資料結構與演算法—稀疏陣列和佇列資料結構演算法陣列佇列
- ORACLE 陣列在過程中的應用Oracle陣列
- Java版-資料結構-陣列Java資料結構陣列
- JavaScript資料結構01 - 陣列JavaScript資料結構陣列
- JS資料結構(一)——陣列JS資料結構陣列
- 資料結構——樹狀陣列資料結構陣列
- 矩陣分解在協同過濾推薦演算法中的應用矩陣演算法
- 《JavaScript資料結構與演算法》筆記——第2章 陣列JavaScript資料結構演算法筆記陣列
- 陣列結構之陣列陣列
- 資料結構之真別多想—樹狀陣列資料結構陣列
- 資料結構與演算法---螺旋矩陣、整數反轉資料結構演算法矩陣