数据结构_8:查找:线性查找

来源:互联网 发布:迈远短信平台网页源码 编辑:程序博客网 时间:2024/05/16 01:19

顺序表的查找

  • 直接查找
  • 复杂度:O(n)
int Sequential_Search(int *a,int n,int key) //n是要查找的长度,key是关键字{    int i;    for(i=1;i<=n;i++)    {        if(a[i]==key)        return i;    }    return 0;}
  • 直接查找的改进
  • 复杂度O(n)
int Sequential_Search2(int *a,int n,int key) //n是要查找的长度,key是关键字{    int i;    a[0]==key; //设置a[0]是关键字,哨兵    i=n; //循环从数组的尾部开始    while(a[i]!=key)    {        i--;    }    return  i;}

有序表查找

  • 折半查找
  • 复杂度0(lgn)
int Binary_Search(int *a,int n,int key){    int low,high,mid;    low=1;    high=n;     while(low<=high)    {         mid=(low+high)/2;         if(key<a[mid])            high=mid-1;         else if (key>a[mid])            low=mid+1;         else            return;    }     return 0;}
  • 插值查找
  • 表较长,且分布均匀
//改进:mid=low+(high-low)*(key-a[low])/(a[high]-a[low]); // 插值
  • 斐波那契查找
  • 黄金分割查找
int  Fibonacci_Search(int *a,int n,int key){   int low,high,mid,i,k;   low=1;   high=n;   k=0;   while(n>F[k]-1)  //计算n位于斐波那契数列的位置      k++;   for(i=n;i<F[k]-1;i++)  // 将不满的数值补全     a[i]=a[n];   while(low<=high)   {       mid=low+F[k-1]-1; //计算当前的分隔小标       if(key<a[mid])    // 若查找记录小于当前分隔的记录       {           high=mid-1;   //最高下标调整到分隔下标mid-1           k=k-1;        //斐波那契的下标减一       }       else if(key>a[mid])  //若查找记录大于当前分隔记录       {            low=mid+1;            k=k-2;       }       else       {           if(mid<=n)              return mid; // 说明 找到了位置            else                return n;  //若mid>n说明补全数值,返回n       }   }    return 0;}

线性索引

  • 索引:将一个关键字与它对应的记录相关联的过程
  • 一个索引由若干个索引项组成
  • 索引项至少包含关键字和其对应的记录在存储器中的位置
  • 线性索引;分块索引;倒排索引

稠密索引

  • 关键码有序排列
  • 索引项有序=可以使用折半,插值,等算法查找

分块索引

  • 分块有序:快内无序;快间有序

倒排索引

0 0
原创粉丝点击