楊氏矩陣搜尋演算法

來源:互聯網
上載者:User

楊氏矩陣搜尋演算法

個人資訊:就讀於燕大本科軟體工程專業 目前大三;

本人部落格:百度搜尋“cqs_2012”即可;

個人愛好:酷愛資料結構和演算法,希望將來搞科研為人民作出自己的貢獻;

部落格內容:楊氏矩陣搜尋演算法;

知識選自:面試題;

部落格時間:2014-3-25;

 

  • 引言

昨天過生日,女朋友陪我過了我從生下來最好的一次生日,好開心有木有,還送我一個生日礼物,你們猜猜是啥,直接給大家爆照吧;

這是燕大食堂照的,她說我每天在裡面放一個硬幣,放滿以後,我們就訂婚,好開心有木有。

好了,謝謝大家一直以來對我的支援與關注,祝福大家事業有成,家庭美滿。

  • 楊氏矩陣

楊氏矩陣的定義:楊氏矩陣是一個二維數組;每一行和每一列都嚴格遞增.(有的版本是嚴格遞減,其原理是一樣的,即不存在重複元素)

  • 思路

我們先學習一個一般的演算法,演算法思路選自《編程之美》和《劍指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)

然後我就一直糾結於,楊氏矩陣是不是方陣,如果是方陣,還有沒有可以最佳化的空間呢?我覺得是可以的,如果楊氏矩陣是方陣的情況下,可以類比二分尋找的方法,去尋找,

舉個例子,演算法示範如下

取圖中線上的元素集合作為二分尋找的資料來源,這時候我們沒有找到,然後劃分楊氏矩陣如下

這時候兩個子矩陣都不是方針了,這時候我們就可以用剛才提到的演算法解決了,可以並行計算; 如果得到的子陣中包含方陣,那子方陣就還可以用二分尋找。

這隻是我個人的想法,做的話肯定能解決問題,但是我分析不出來我的解法的時間複雜度,還請大神助小弟解答,敬請留言。

  • 實驗

實驗工具 vs2008

程式設計語言 C++

第一種演算法實驗,keyword : 54

  • 代碼

test.cpp

// include: head file#include<iostream>#include<utility>using namespace std;// 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);// function: mainint main(){size_t size = 10;int ** ysjz = new int*[size];for(size_t i=0;i<size ;i++){ysjz[i] = new int[size];}for(size_t i=0;i<size;i++){for(size_t j=0 ;j<size;j++){ysjz[i][j] = i*10+j;cout<<ysjz[i][j]<<' ';}cout<<endl;}std::pair<bool,std::pair<size_t,size_t>>  p = _yangshijuzhen(ysjz,std::make_pair(0,0),std::make_pair(size-1,size-1),54);if( p.first )cout<<"line="<<p.second.first<<" ,row="<<p.second.second<<endl;else cout<<" not find "<<endl;system("pause");return 0;}// 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) ;}}


 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.