读书人

优于O(n^2)的算法

发布时间: 2012-10-08 19:54:56 作者: rapoo

求一个优于O(n^2)的算法
一个N*N的矩阵,从左至右,右边的数比左边的数,下边的数比上面的数大,现在给定某一个数N,求搜索到它的一个优于O(n^2)的算法~

[解决办法]
lz搜索杨氏矩阵查找。
[解决办法]

C/C++ code
#include<iostream>#include<string>using namespace std;const int MM=1005;int map[MM][MM],N,M; int search(int x,int y,int key,int &px,int &py){//从矩阵的左下角开始查找     if(x<0 || y>=M)         return 0;     if(map[x][y]<key)          return search(x,y+1,key,px,py);    else if(map[x][y]>key)         return search(x-1,y,key,px,py);    else{          px=x, py=y;         return 1;     } } int main(){    while(scanf("%d%d",&N,&M)==2){         for(int i=0;i<N;++i) //输入矩阵,N行,M列,下标从0开始              for(int j=0;j<M;++j)                 scanf("%d",&map[i][j]);         int key;          while(cin>>key){  // 查找key              int px,py;              if(search(N-1,0,key,px,py)){ //返回的(px,py)是key在矩阵中的最后一个位置                  puts("have find");                  printf("px == %d , py == %d \n",px,py);              }              else                 puts("not find");          }    }    return 0;}
[解决办法]
从右上角往下走,遇到超过的数值,改变方向
只有两个方向:往下,或往左
只有两个结果:找到了或走出去了

Python code
def foo(M,n):    l = len(m)     x,y = l-1,0    goDown = True    while M[y][x]!=n:        if M[y][x] > n and goDown:            goDown = False        elif M[y][x]<n and not goDown:            goDown = True        if goDown:            y+=1        else:            x-=1        if x<0 or y>=l:            return ('not found!')    return x,ym = ((0,2,4,6,8),     (3,5,7,9,10,),     (4,8,10,11,16,),     (6,9,13,15,18),     (8,10,17,19,21)     )print(foo(m,15))print(foo(m,11))print(foo(m,7))print(foo(m,17))print(foo(m,20))print(foo(m,1))print(foo(m,12)) 

读书人网 >软件架构设计

热点推荐