我們先學習一個一般的演算法,演算法思路選自《編程之美》和《劍指offer》,我們逐步縮小楊氏矩陣的規模,直到尋找到元素或者沒有尋找到元素;
舉個例子,演算法示範如下:
規模減少一行是吧,依次下去
規模減少了一列,直至找到元素或者規模減少至0為止;
C++代碼,演算法如下:
// function: yangshijuzheng 楊氏矩陣template<typename T>std::pair<bool,std::pair<size_t,size_t>> _yangshijuzhen(T** data,std::pair<size_t,size_t> s,std::pair<size_t,size_t> e,T keyword){pair<size_t,size_t> p ;if(data != NULL && s.first >= 0 && s.second >= 0 && e.first >= s.first && e.second >= s.second){size_t i = s.first, j = e.second;while( i<= e.first && j >= s.first ){if( *(*(data+i)+j) == keyword ){p = std::make_pair(i,j);return std::make_pair(true,p);}else if( *(*(data+i)+j) < keyword ){i++ ;}else j-- ;}p = std::make_pair(0, 0);return std::make_pair(false,p) ;}else{cout<<"exception of function _yangshijuzhen input"<<endl;p = std::make_pair(0, 0);return std::make_pair(false,p) ;}}
此演算法時間複雜度O(N)
然後我就一直糾結於,楊氏矩陣是不是方陣,如果是方陣,還有沒有可以最佳化的空間呢?我覺得是可以的,如果楊氏矩陣是方陣的情況下,可以類比二分尋找的方法,去尋找,
舉個例子,演算法示範如下
取圖中線上的元素集合作為二分尋找的資料來源,這時候我們沒有找到,然後劃分楊氏矩陣如下
這時候兩個子矩陣都不是方針了,這時候我們就可以用剛才提到的演算法解決了,可以並行計算; 如果得到的子陣中包含方陣,那子方陣就還可以用二分尋找。
這隻是我個人的想法,做的話肯定能解決問題,但是我分析不出來我的解法的時間複雜度,還請大神助小弟解答,敬請留言。