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

顺序表的查找

  • 直接查找
  • 复杂度: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值