查找

一、顺序查找
遍历整个线性变,直到找到要找到值。这是最简单粗暴的方法,时间复杂度为O(n)。

二、二分查找
要求线性表必须有序,取中间对象作为比较对象,把给定值与中间值比较,如果给定值大于中间值,在右半边找,如果给定值小于中间值,在左半边找。不断二分,最后找出给定值。时间复杂度为O(logn)

int half_search(int *a,int n,int key)
{
   int low,high,mid;
  low=1;
  high=n;
  while(high>=low)
    {
       mid=(high-low)/2;
       if(a[mid]>key)
         high=mid-1;
       else if(a[mid]<key)
         low=mid+1;
       else
         return mid;
    }
    return 0;
}

2.1插值查找
插值查找其实是二分查找的变种,不和中间位置比较了,根据要查找的值,查找范围的第一个和最后一个值之间的比例关系,确定一个点,跟给定值进行比较。这种方法在数值分布比较均匀的时候比较好。时间复杂度也是O(logn)。
在这里插入图片描述
2.2 斐波那契查找
利用斐波那契数列确定该找哪个点跟给定值作比较。

三、线性索引
3.1 稠密索引
3.2 分块索引:块内有序,块间无序
3.3 倒排索引:由次关键字找出数据,由book关键字根据索引边对应找出所有拥有次关键字book的数据。

四、二叉排序树(二叉搜索树)
左子数上的所有结点的值均小于根节点的值。
右子树上的所有结点的值均大于根节点的值。
当中序遍历二叉树的时候就可以得到一个有序序列
在二叉搜索树中删除一个节点的操作需要注意:找要删除结点的前驱或者后继替代要删除的节点,需要处理剩余的左右结点问题。
一个平衡的二叉搜索树,他的查找复杂度为O(logn)
在这里插入图片描述
五、平衡二叉树(AVL)
特殊的二叉排序树,每一个结点的左右子树高度至多相差1。
最小不平衡子树:距离新插入结点最近,平衡因子大于1的节点为根的子数。
AVL的目的,是为了创造出一棵高度平衡的二叉排序树,这样在查找的时候才能效率比较高。
以下是构建平衡二叉树的方法:当最小不平衡子树根节点的平衡因子大于1时(左边多),右旋,如果小于-1(右边多)就左旋。插入结点时,最小不平衡子树的BF与它的子数的BF符号相反时,先进行一次旋转使符号相同,,再进行反转一次。
AVL的查找时间复杂度为O(logn),而插入和删除时间复杂度也是O(logn)。

六、多路查找树
每一个节点的孩子数可以多于两个,且每一个节点可以放多个元素。

七、希哈表
再不出现散列冲突的情况下,查找时间复杂度为O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值