6、查找算法

还没完全写完

GitHub 代码地址

1、查找算法概述

查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

查找算法分类
1、静态查找动态查找

注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。

2、无序查找有序查找

无序查找:被查找数列有序无序均可;
有序查找:被查找数列必须为有序数列。

平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。

对于含有n个数据元素的查找表,查找成功的平均查找长度为: ASL=PiCi A S L = P i ∗ C i 的和。
- Pi P i :查找表中第i个数据元素的概率。
- Ci C i :找到第i个数据元素时已经比较过的次数。

2、顺序查找

顺序查找适合于存储结构为顺序存储或链接存储的线性表。
  

2.1、基本思想

顺序查找也称为线形查找,属于无序查找算法。从数据结构线性表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败

2.2、复杂度分析: 

查找成功时的平均查找长度为:(假设每个数据元素的概率相等) 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)

2.3、顺序查找动画演示

例子:顺序查找求 23 的位置


6、查找算法_第1张图片
顺序查找动画演示

2.4、顺序查找完整代码

GitHub 代码地址 :GitHub 代码地址 sequential_search.py

主要参考文献1、2。

3、二分查找

二分查找的前提是线性表中的元素必须是有序的,如果是无序的则要先进行排序操作。

4.1、基本思想

二分查找也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线性表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点

:折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。——《大话数据结构》

4.2、复杂度分析: 

最坏情况下,关键词比较次数为log2(n+1), 时间复杂度为O(logn)

4.3、二分查找动画演示

例子1:二分查找求 23 的位置


6、查找算法_第2张图片
二分查找动画演示1

例子2:二分查找求 47的位置


6、查找算法_第3张图片

4.4、二分查找代码

GitHub 代码地址 :GitHub 代码地址 sequential_search.py

主要参考文献1、2。

4、二叉查找树

二叉查找树(Binary Search Tree,BST),也叫二叉搜索树,或称二叉排序树(Binary Sort Tree)。它或者是一棵空树,或者是具有下列性质的二叉树:

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树。

二叉查找树性质对二叉查找树进行中序遍历,即可得到有序的数列

如下图,这个是普通的二叉树:


6、查找算法_第4张图片
普通二叉树

在此基础上,加上节点之间的大小关系,就是二叉查找树:


6、查找算法_第5张图片
二叉查找树

主要参考文献1、4。

参考文献:
1. 七大查找算法
2. 七大查找常见算法(上)
3. 七大查找常见算法(下)
4. 浅谈算法和数据结构: 七 二叉查找树

你可能感兴趣的:(数据结构与算法-Python)