查找

来源:互联网 发布:jpg看图软件 编辑:程序博客网 时间:2024/04/30 18:01
二分查找:

数组必须是有序的数组。
int low,hiagh;
int k;

while(low<=high)
{
     int mid=(low+high)/2;
     if(k==a[mid])return true;
     else if(k<a[mid]){high=mid-1;}
     else low=mid+1;
}

寻找数组中第i小的元素

利用快速排序的思想。
int   select(int low,int high,int i) //i代表第i小的元素
{
     if(low==high)return a[low];
     q=partition(low,high);
     k=q-low+1;
     if(i==k)return a[q];
     else if(i<k)
        return select(low,q-1,i);
     else return select(q+1,high,i-k);
}

hash表

1.利用链表解决冲突
2.利用线性探查,二次探查,双重散列来解决冲突。

 双重散列是用于开放寻址法的最好方法之一。它采用如下形式的散列函数
 h(k,i)=(h1(k)+i*h2(k))mod m;
 其中h1,h2为辅助散列函数,初始探查位置为T[h1(k)],后续的探查位置在此基础上加上偏移量h2(k)模m.为能查找整个散列表,值h2(k)要与表的大小m互质。一种方法为,取m为质数,并设计一个总是产生较m小的整数的h2.例如我们可以取m为质数,并取
h1(k)=k mod m,   h2(k)=1+(k mod m1);
m1略小于m(如m-1);例如m=13,可取m1=11,这样h1(k)=k mod 13; h2(k)=1+(k mod 11);

int  hash-insert(int k)
{
    for(i=0;i<m;i++)
    {
          j=h(k,i);
          if(T[j]==null){T[j]=k;return j;}
    }
    return -1;
}

int hash-search(int k)
{
     for(i=0;i<m;i++)
    {
          j=h(k,i);
          if(T[j]==null)return -1;
          else if(T[j]==k)return j;
    }
    return -1;
}

串树是一个字典树,它的每一个元素都包含一个数组bool a[27],前26位为各个英文字母,最后一位代表到该元素的父节点字符串是否结束。

struct Node
{
    bool a[27];
};

原创粉丝点击