
算法
文章平均质量分 61
大雄是个程序员
这个作者很懒,什么都没留下…
展开
-
九种查找算法-B树/B+树
其中P[1]指向关键字小于K[1]的 子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;B+的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B树可以在 非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树, B树是开区间。非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;根结点的儿子数为[2, M];原创 2023-02-01 11:25:27 · 622 阅读 · 0 评论 -
九种查找算法-红黑树
红黑树的思想就是对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息。黑色链接用来链接普通的2-3节点。特别的,使用红色链接的两个2-nodes来表示一个3-nodes节点,并且向左倾斜,即一个2-node是另一个2-node的左子节点。2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgn,从而保证了最坏情况下的时间复杂度。再将3节点的位于中间的子节点的父节点设置为父节点中那个红色的节点,如图4的所示;原创 2023-01-31 11:06:10 · 440 阅读 · 0 评论 -
九种查找算法-2-3树
另一方面,2-3树的一个内部节点确实有3个孩子,故比相同高度的满二叉树的节点更多。高为h的2-3树包含的节点数大于等于高度为h的满二叉树的节点数,即至少有2^h-1个节点。右节点也是一个2-3节点,节点的所有key值比两个key中的最大的key还要大。对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key要小,右节点也是一个2-3节点,所有的值比key要大。2-3树正是一种绝对平衡的树,任意节点到它所有的叶子节点的深度都是相等的。原创 2023-01-31 11:06:00 · 113 阅读 · 0 评论 -
九种查找算法-二叉树查找
二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。原创 2023-01-30 06:04:14 · 895 阅读 · 0 评论 -
九种查找算法-哈希查找
我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方。但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了"冲突",换句话说,就是把不同的元素分在了相同的"类"之中。后面我们将看到一种解决"冲突"的简便做法。原创 2023-01-30 06:04:21 · 5125 阅读 · 0 评论 -
九种查找算法-斐波那契查找
斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记录的个数为某个斐波那契数小1,及n=F(k)-1;开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1).原创 2023-01-29 11:59:49 · 361 阅读 · 0 评论 -
九种查找算法-插值查找
插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。原创 2023-01-29 11:59:34 · 756 阅读 · 0 评论 -
九种查找算法-二分查找(折半查找)
折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。原创 2023-01-28 18:08:17 · 596 阅读 · 0 评论 -
九种查找算法-顺序查找
顺序查找也叫线性查找查找过程:从列表中的第一个元素开始,逐个元素进行比较,如果找到相等的元素,则 查找成功 ,如果直至表中最后一个记录数与目标值都不相等,则表示 查找失败 。顺序查找算法适用于绝大多数场景,既可以在有序序列中查找目标元素,也可以在无序序列中查找目标元素。原创 2023-01-28 18:08:25 · 1161 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-基数排序
对radix进行计数排序(利用计数排序适用于小范围数的特点)arr为原始数组,从最低位开始取每个位组成radix数组;一种多关键字的排序算法,可用桶排序实现。取得数组中的最大数,并取得位数;原创 2023-01-27 21:05:53 · 174 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-桶排序
将值为i的元素放入i号桶,最后依次把桶里的元素倒出来。寻访序列,并且把项目一个一个放到对应的桶子去。从不是空的桶子里把项目再放回原来的序列中。设置一个定量的数组当作空桶子。对每个不是空的桶子进行排序。原创 2023-01-27 21:05:42 · 318 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-计数排序
如果 k(待排数组的最大值) 过大则会引起较大的空间复杂度,一般是用来排序 0 到 100 之间的数字的最好的算法,但是它不适合按字母顺序排序人名。向填充目标数组:将每个元素 i 放在新数组的第 C[i] 项,每放一个元素就将 C[i] 减去 1;计数排序统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。计数排序基于一个假设,待排序数列的所有数均为整数,且出现在(0,k)的区间之内。统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项;原创 2023-01-26 07:31:21 · 163 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。:1.把长度为n的输入序列分成两个长度为n/2的子序列;2. 对这两个子序列分别采用归并排序;3. 将两个排序好的子序列合并成一个最终的排序序列。归并排序动图演示。原创 2023-01-26 07:31:09 · 201 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]原创 2023-01-25 08:23:25 · 2823 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-快速排序与希尔排序
选取第一个数为基准将比基准小的数交换到前面,比基准大的数交换到后面对左右区间重复第二步,直到各区间只有一个数快速排序动图演示。原创 2023-01-24 23:04:48 · 871 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-选择排序与插入排序
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾以此类推,直到所有元素均排序完毕选择排序动图演示。原创 2023-01-25 08:23:09 · 817 阅读 · 0 评论 -
十大经典排序算法(动态演示+代码)-冒泡算法
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。如果第一个比第二个大,就交换他们两个。针对所有的元素重复以上的步骤,除了最后一个。原创 2023-01-24 23:04:50 · 1577 阅读 · 0 评论