二叉排序树查找算法
- 格式:doc
- 大小:30.00 KB
- 文档页数:1
五种查找算法总结一、顺序查找条件:无序或有序队列。
原理:按顺序比较每个元素,直到找到关键字为止。
时间复杂度:O(n)二、二分查找(折半查找)条件:有序数组原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。
时间复杂度:O(logn)三、二叉排序树查找条件:先创建二叉排序树:1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 它的左、右子树也分别为二叉排序树。
原理:在二叉查找树b中查找x的过程为:1. 若b是空树,则搜索失败,否则:2. 若x等于b的根节点的数据域之值,则查找成功;否则:3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:4. 查找右子树。
时间复杂度:四、哈希表法(散列表)条件:先创建哈希表(散列表)原理:根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。
时间复杂度:几乎是O(1),取决于产生冲突的多少。
五、分块查找原理:将n个数据元素"按块有序"划分为m块(m ≤ n)。
每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……。
然后使用二分查找及顺序查找。
二叉排序树1.二叉排序树定义二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于根结点的值。
(2)左右子树也都是二叉排序树,如图6-2所示。
2.二叉排序树的查找过程由其定义可见,二叉排序树的查找过程为:(1)若查找树为空,查找失败。
(2)查找树非空,将给定值key与查找树的根结点关键码比较。
(3)若相等,查找成功,结束查找过程,否则:①当给值key小于根结点关键码,查找将在以左孩子为根的子树上继续进行,转(1)。
②当给值key大于根结点关键码,查找将在以右孩子为根的子树上继续进行,转(1)。
3.二叉排序树插入操作和构造一棵二叉排序树向二叉排序树中插入一个结点的过程:设待插入结点的关键码为key,为将其插入,先要在二叉排序树中进行查找,若查找成功,按二叉排序树定义,该插入结点已存在,不用插入;查找不成功时,则插入之。
因此,新插入结点一定是作为叶子结点添加上去的。
构造一棵二叉排序树则是逐个插入结点的过程。
对于关键码序列为:{63,90,70,55,67,42,98,83,10,45,58},则构造一棵二叉排序树的过程如图6-3所示。
4.二叉排序树删除操作从二叉排序树中删除一个结点之后,要求其仍能保持二叉排序树的特性。
设待删结点为*p(p为指向待删结点的指针),其双亲结点为*f,删除可以分三种情况,如图6-4所示。
(1)*p结点为叶结点,由于删去叶结点后不影响整棵树的特性,所以,只需将被删结点的双亲结点相应指针域改为空指针,如图6-4(a)所示。
(2)*p结点只有右子树或只有左子树,此时,只需将或替换*f结点的*p子树即可,如图6-4(b)、(c)所示。
(3)*p结点既有左子树又有右子树,可按中序遍历保持有序地进行调整,如图6-4(d)、(e)所示。
设删除*p结点前,中序遍历序列为:① P为F的左子女时有:…,Pi子树,P,Pj,S子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,F,…。
KdTree算法详解kd树(k-dimensional树的简称),是⼀种分割k维数据空间的数据结构,主要应⽤于多维空间关键数据的近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor)。
⼀、Kd-tree其实KDTree就是⼆叉查找树(Binary Search Tree,BST)的变种。
⼆叉查找树的性质如下:1)若它的左⼦树不为空,则左⼦树上所有结点的值均⼩于它的根结点的值;2)若它的右⼦树不为空,则右⼦树上所有结点的值均⼤于它的根结点的值;3)它的左、右⼦树也分别为⼆叉排序树;例如:如果我们要处理的对象集合是⼀个K维空间中的数据集,我们⾸先需要确定是:怎样将⼀个K维数据划分到左⼦树或右⼦树?在构造1维BST树类似,只不过对于Kd树,在当前节点的⽐较并不是通过对K维数据进⾏整体的⽐较,⽽是选择某⼀个维度d,然后⽐较两个K维数据在该维度 d上的⼤⼩关系,即每次选择⼀个维度d来对K维数据进⾏划分,相当于⽤⼀个垂直于该维度d的超平⾯将K维数据空间⼀分为⼆,平⾯⼀边的所有K维数据在d维度上的值⼩于平⾯另⼀边的所有K维数据对应维度上的值。
也就是说,我们每选择⼀个维度进⾏如上的划分,就会将K维数据空间划分为两个部分,如果我们继续分别对这两个⼦K维空间进⾏如上的划分,⼜会得到新的⼦空间,对新的⼦空间⼜继续划分,重复以上过程直到每个⼦空间都不能再划分为⽌。
以上就是构造 Kd-Tree的过程,上述过程中涉及到两个重要的问题:1. 每次对⼦空间的划分时,怎样确定在哪个维度上进⾏划分;2. 在某个维度上进⾏划分时,怎样确保建⽴的树尽量地平衡,树越平衡代表着分割得越平均,搜索的时间也就是越少。
1、在哪个维度上进⾏划分?⼀种选取轴点的策略是median of the most spread dimension pivoting strategy,统计样本在每个维度上的数据⽅差,挑选出对应⽅差最⼤值的那个维度。
二叉排序树查找的递归算法介绍二叉排序树(Binary Search Tree),也称二叉查找树、有序二叉树或排序二叉树,是一种常用的数据结构。
它具有以下特点:•每个节点都包含一个键值和对应的数据。
•左子树中的所有节点的键值都小于根节点的键值。
•右子树中的所有节点的键值都大于根节点的键值。
•左右子树也分别是二叉排序树。
二叉排序树支持高效的查找、插入和删除操作,其中查找操作是利用递归实现的。
本文将详细介绍二叉排序树查找的递归算法。
二叉排序树的定义二叉排序树的定义如下:class TreeNode:def __init__(self, key, data):self.key = keyself.data = dataself.left = Noneself.right = Noneclass BinarySearchTree:def __init__(self):self.root = None在二叉排序树中,每个节点都是一个TreeNode对象,包含键值key和对应的数据data。
left和right分别指向左子树和右子树的根节点。
树的根节点由BinarySearchTree对象的root属性表示。
二叉排序树查找的递归算法二叉排序树的查找操作是利用递归实现的,其具体算法如下:1.如果待查找的键值等于当前节点的键值,返回当前节点的数据。
2.如果待查找的键值小于当前节点的键值,递归在左子树中查找。
3.如果待查找的键值大于当前节点的键值,递归在右子树中查找。
4.如果在左子树或右子树中找不到对应的键值,则返回空。
下面是二叉排序树查找的递归算法的代码实现:def search_recursive(node, key):if node is None or node.key == key:return node.dataelif key < node.key:return search_recursive(node.left, key)else:return search_recursive(node.right, key)在上述代码中,node表示当前节点,key表示待查找的键值。