还没完全写完
GitHub 代码地址
查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
查找算法分类:
1、静态查找和动态查找;
注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。
2、无序查找和有序查找。
无序查找:被查找数列有序无序均可;
有序查找:被查找数列必须为有序数列。
平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
对于含有n个数据元素的查找表,查找成功的平均查找长度为: ASL=Pi∗Ci A S L = P i ∗ C i 的和。
- Pi P i :查找表中第i个数据元素的概率。
- Ci C i :找到第i个数据元素时已经比较过的次数。
顺序查找适合于存储结构为顺序存储或链接存储的线性表。
顺序查找也称为线形查找,属于无序查找算法。从数据结构线性表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
查找成功时的平均查找长度为:(假设每个数据元素的概率相等) ASL=(1/n)∗(1+2+3+…+n)=(n+1)/2 A S L = ( 1 / n ) ∗ ( 1 + 2 + 3 + … + n ) = ( n + 1 ) / 2 ;当查找不成功时,需要n+1次比较,时间复杂度为O(n);所以,顺序查找的时间复杂度为O(n)
例子:顺序查找求 23 的位置
GitHub 代码地址 :GitHub 代码地址 sequential_search.py
主要参考文献1、2。
二分查找的前提是线性表中的元素必须是有序的,如果是无序的则要先进行排序操作。
二分查找也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线性表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
注:折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。——《大话数据结构》
最坏情况下,关键词比较次数为log2(n+1), 时间复杂度为O(logn)
例子1:二分查找求 23 的位置
例子2:二分查找求 47的位置
GitHub 代码地址 :GitHub 代码地址 sequential_search.py
主要参考文献1、2。
二叉查找树(Binary Search Tree,BST),也叫二叉搜索树,或称二叉排序树(Binary Sort Tree)。它或者是一棵空树,或者是具有下列性质的二叉树:
二叉查找树性质:对二叉查找树进行中序遍历,即可得到有序的数列。
如下图,这个是普通的二叉树:
在此基础上,加上节点之间的大小关系,就是二叉查找树:
主要参考文献1、4。
参考文献:
1. 七大查找算法
2. 七大查找常见算法(上)
3. 七大查找常见算法(下)
4. 浅谈算法和数据结构: 七 二叉查找树