查找汇总(更新中......)
一、查找的定义
查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
二、关于查找表
查找表按照操作方式分有两种:静态查找表,动态查找表
静态查找表(Static search Table):只作查找操作的查找表,主要操作有
(一)查询某个特定的数据元素是否在查找表中
(二)检索某个特定的数据元素和其对应的属性
动态查找表(Dynamic Search Table):在查找过程中同时插入查找表中部存在的数据元素,或者从查找表中删除已经存在的某个数据元素。其主要操作有
(一)查找时插入数据元素
(二)查找时删除数据元素
三、顺序查找(Sequential Search) 【 针对无序序列的一种为简单的查找方式】
又叫线性查找,是最基本的查找技术,查找过程是:
从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值不相等,则表中没有所查的记录,查找失败。
时间复杂度分析:
最好情况:在第一个或最后一个就查找到了,算法的时间复杂度为O(1)
最坏情况:在最后一个位置才找到,需要进行n次比较,时间复杂度为O(n)
当查找不成功时,需要n+1次比较,时间复杂度为O(n)
平均查找次数为(n+1)/2,所谓总的时间复杂度为O(n)
四、折半查找(Binary Search)
针对已排序序列的一种查找方式,线性表必须采用顺序存储,要求序列中的元素基本不变,在需要做删除和插入操作的时候,会影响检索效率。
折半查找的基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值比中间记录的关键值的字小,则在中间记录的左半区域继续查找;若大,则在中间记录的右半区域查找。不断重复其过程,直到查找成功,若所查找的区域无记录,则查找失败。
时间复杂度:O(logn)
五、B树(二叉排序树 Binary Sort Tree)
其要么是一颗空树,要么具有下列性质的二叉树
(一)若左子树不为空,则左子树上所有节点的值均小于它的根节点的值
(二)若右子树不为空,则右子树上所有节点的值都大于其根节点的值
(三)它的左右子树也分别为二叉排序树
二叉树的查找:
时间复杂度与树的深度有关
若根节点的关键字等于查找的关键字,则查找成功;若小于根节点的关键字值,递归查左子树,若大于根节点的关键字值,递归查右子树。若子树为空,查找失败
二叉树的插入:
首先执行查找算法,找出被插节点的父亲节点
判断被插节点是其父节点的左儿子还是右儿子,将被插节点作为叶子节点插入,若二叉树为空。则首先单独生成根节点
注意:新插入的节点总是叶子节点,所以算法复杂度是O(h)
二叉树的删除:
如果删除的节点没有孩子,则删除后算法结束;若只有一个孩子,则删除后该孩子取代被删除节点的位置
如果删除的节点有两个孩子,则选择该节点的后继节点作为新的根,同时在该后继节点开始,执行前两种删除算法,删除算法结束。
六、B+树
七、散列表