算法备忘录——查找

本文详细介绍了查找算法中的红黑树和散列表,包括它们的组织方式、查找效率以及解决冲突的方法。红黑树是平衡二叉树的一种,通过旋转和颜色属性保持平衡,而散列表通过哈希函数快速定位数据,拉链法和线性探测法处理哈希冲突。这两种数据结构在不同的场景下各有优势,适用于不同的查找需求。
摘要由CSDN通过智能技术生成

查找

 

 

数据一旦被有规律得组织起来,从中查找出所需元素的效率将会大大提高。

查找算法准确的说,应该是数据的组织方法与查找方法的结合。没有组织规律的数据,我们只能用直观的暴力方法,一个一个拿出来对比,从而筛选出待查找的元素。而一旦数据变得有组织有规律,查找就变得轻而易举了。以下是各种查找算法的效率对比。


表格 1 各种查找算法性能对比

最直接的方法就是暴力查找,无需对数据做任何预先的组织与处理。其它高效查找算法,都不得不在预先的数据组织和处理上消耗一定功夫。

被查找的基本单元—数据项

数据要有一定的规则,才能够被组织起来。最基本的规则就是有序,比如“4、5、6、7、8”,“A、B、C、D、E”等数字或者字母,天生就就有顺序的规律。而有一些数据,比如中文名字“张三”、“李四”,天生是无规则的。当然我们可以用拼音字母顺序作为“张三”、“李四”排序的规则,也可以用中文笔画数作为排序的规则,这就让天生无规则的数据变得有规则,可排序了。

一般性的通用有规则数据,我们称为数据项。数据项包含两个部分——键(Key)和值(Val)。Key一般都选择天生有序的东西,比如阿拉伯数字”1 、2、3”,而值就是类似“张三”、“李四”这种天生无序的数据。有了一旦“张三”、“李四”作为值,分别有了Key 1和2之后,就好比有了学号或者工号,我们就可以通过学号(key)来对“张三”、“李四”进行组织排序了。

Figure1 符号表的数据项,键,值的关系

所以一般我们说Key 映射(Map)到Val,对于被查找的数据,键一般是人为加上的可排序的属性,而值就是数据真实的值。

当时数据项是类似“4、5、6、7、8”,“A、B、C、D、E”等数字或者字母或者其组合字符串,它们是天生就可排序的,那么Key 和 Val都可以对应可排序数据项本身,因而在讨论类似字符串或者数字查找的问题时,可以省略Key 和 Val的区分,直接对数字或者字符串进行组织排序和查找讨论。

可查找的有序的数据组织

一组数据,如果将基本的数据项,根据其键(Key)先后顺序进行排序组织,那么通过键(Key)大小关系,在组织好的一堆数据中通过类似二叉查找的方法,查找对应的数据项,效率将接近lgN。

1). 有序数组二分查找

如果输入数据可以组织成数组形式,那么对数组进行由小到大排序后,可以通过二分法对数据项进行查找。二分法一般从有序数组中间开始,判断待查找的数据项是大于还是小于中间项,然后再把查找范围缩小一半,如果小于中间项,则下次查找范围是第1项到中间项,否则就是中间项到最后一项。


Figure2 一次命中的二分法数据查找过程


Figure3  一次未命中的二分法数据查找过程

有序数组二分查找比较简单,但是适应的场景有限,尤其是需要面对动态增加或者删除数据项的场景,数组删除和插入都不灵活,需要提前确定数据项的数目量,定义好一块空间,这样将大大降低数据插入和删除的效率。。

2).二叉树

二叉树在高层抽象上,可以看成一种树形结构的数据组织方式。其实现方式可以是某种特殊数组,也可以是链式结构(不同于单双向链表。采用链式结构的二叉树,能够弥补有序数组二分查找的缺点,适应无法提前知道输入数据数量,需要动态插入和删除数据的场景。二叉树的每个二叉节点包含分别指向左右子节点的引用或指针)。二叉树1个节点只有1个键,没用左右子节点(子树)的二叉树节点,称为叶节点。


Figure4  典型的二叉树

将数据项(默认不含重复键)插入二叉树时,保证一个节点的键值,大于其左节点键值,小于其右节点键值。这样从根节点(root),一直往左查找,则值越小&#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值