![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
In_qing青
这个作者很懒,什么都没留下…
展开
-
哈夫曼树与哈夫曼编码
这样既符合带权路径长度最小,又满足了前缀编码的条件(字符处于叶子结点上,所以到达任意一个字符都不会完全经过其它字符,不会出现A是B的前缀的情况)且为了防止编码重合导致多译的情况,要求任一个字符的编码都不是另一个字符编码的前缀。2.在森林中选取两颗根结点最小的树作为左右子树构造一颗新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。1.根据给定的n个权值构成n颗二叉树的集合(森林),其中每颗二叉树Ti中只有一个带权为wi的根结点,左右子树均空。:带权路径长度最小的树(最优二叉树)原创 2023-09-06 16:25:50 · 89 阅读 · 1 评论 -
『二叉树』之遍历(递归、迭代法与层序遍历)
递归法遍历非常简单且容易理解,代码基于同一个模板,不同遍历顺序只是调换了几行代码的顺序。即一层一层的遍历二叉树,每层从左到右输出,实际上是图论中的广度优选搜索(BFS)原创 2023-09-06 11:25:23 · 161 阅读 · 1 评论 -
十大排序之『桶排序』(计数、桶、基数排序)
优化:扫描数列记录min与max,count数组的size即为max-min+1,并且范围是从0到size,即记录count[a[i]-min]++,等于将有数据的区块左边界平移至与原点重合,这样既优化空间,又解决了无法存储负数的问题。优化:区别于桶排序要用二维数组存储桶的编号与该编号下的所有数据,基数排序有一种巧妙的方法,只需要一个一维数组,即十个桶,并且每个编号的桶只存储一个元素——数列中位数等于该编号的数据个数。原理:在数据范围(min~max)中分若干个区间(桶),将每个区间(桶)内的元素排序。原创 2023-08-30 10:44:33 · 98 阅读 · 0 评论 -
十大排序之『归并排序』
1.如何得到有序的子序列:继续划分,有序的子序列是由更小的有序子序列合并而成。很明显这是一个递归过程,划分直到子序列只有一个元素,一个元素即有序。2.如何将有序子序列合并成有序长序列:比较两个序列中的元素,小的先取出放在前面即可,运用双指针容易实现。原理:将已经有序的子序列合并,得到有序的完整序列。(3/3)第三个O(nlogn)的排序算法。原创 2023-08-30 10:04:51 · 58 阅读 · 0 评论 -
十大排序之『选择排序』(选择排序、堆排序)
取走大根堆堆顶元素走,左子树和右子树仍然是大根堆,只需将改变后的堆顶元素一步步下沉,比左右子结点中更大的那个结点小则交换,子树依旧递归交换,如此堆顶元素就可以下沉到正确的位置。原理:从数列0到k上维护一个大根堆,每趟从堆的顶端中取出最大的元素,放到位置k上,然后进行维护使得0到k-1成为一个大根堆,继续取堆顶最大的元素交换……(2/3)第二个O(nlogn)的排序算法,一共进行n趟,每趟维护大根堆(优先队列)的复杂度是O(logn)原理:每次从待排序序列中选出一个最小的元素,放在排好序的序列最后面。原创 2023-08-29 23:10:38 · 41 阅读 · 1 评论 -
十大排序之『交换排序』(冒泡、快速排序)
原理:元素之间两两进行比较,逆序则交换,这样第一趟下来最大的元素一定被交换到了最后面(反证法易理解),第二趟从前n-1个元素开始,第二大的被交换到倒数第二位……平均时间复杂度为O(nlogn)的算法,也是STL库中sort函数的实现原理,但在数组已经有序的情况下降低至O(n^2)2.扫描数,比基准数小的元素放在基准数左边,大的则放在右边,得到左右两个区间。值得注意的是,如过某一趟中没有进行过交换,说明数组有序,跳出即可。1.先从数列中取出一个数(一般是中间的数)作为基准数。原创 2023-08-29 22:49:41 · 45 阅读 · 1 评论 -
十大排序之『插入排序』(直接、折半、希尔排序)
原理:易知插入排序在数列有序度较高的情况下时间复杂度较低(可降至O(n)),基于此,希尔排序的思想是:先将待排序序列分割为若干个子序列,分别进行直接插入排序,待整个数列基本有序,再对全体序列进行一次直接插入排序。,增量序列是一组递减并且互质的数,并且最后一个数一定是1,对于t趟的希尔排序,增量序列可以是dlta[k]=2^(t-k+1)-1。值得一提的是,目前希尔排序的最优增量序列仍是数学界尚未解决的难题。原理:类比扑克牌理牌原理,将未排序序列中的元素一个个插入到已排序序列的正确位置上。原创 2023-08-29 22:29:44 · 47 阅读 · 1 评论