随笔分类 -  【19】数据结构

摘要:AVL树简介 AVL树的名字来源于发明作者G.M. Adelson-Velsky 和 E.M. Landis的缩写。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性 阅读全文
posted @ 2023-03-25 17:18 苏格拉底的落泪 阅读(357) 评论(0) 推荐(0)
摘要:堆排序 作为选择排序的改进版,堆排序可以把每一趟元素的比较结果保存下来,以便我们在选择最小/大元素时对已经比较过的元素做出相应的调整。堆排序是一种树形选择排序,在排序过程中可以把元素看成是一颗完全二叉树,每个节点都大(小)于它的两个子节点 。 当每个节点都大于等于它的两个子节点时,就称为大顶堆,也叫 阅读全文
posted @ 2022-03-19 17:53 苏格拉底的落泪 阅读(142) 评论(0) 推荐(0)
摘要:前序遍历 思路:前序遍历算法先访问树的根节点,然后遍历左子树,最后遍历右子树。 解法1 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * Tr 阅读全文
posted @ 2021-09-13 21:05 苏格拉底的落泪 阅读(48) 评论(0) 推荐(0)
摘要:开根号 #include <iostream> #include <stdio.h> using namespace std; double myqrt(double x) { if (x < 0) return -1; constexpr auto eps = 1e-8; double low, 阅读全文
posted @ 2021-09-11 20:15 苏格拉底的落泪 阅读(156) 评论(0) 推荐(0)
摘要:归并排序算法 1. 分阶段: 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为logn。2. 治阶段:再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将 阅读全文
posted @ 2021-01-15 22:03 苏格拉底的落泪 阅读(82) 评论(0) 推荐(0)
摘要:快速排序 快速排序的思想是这样的,如果要对数组区间 [p, r] 的数据进行排序,我们先选择其中任意一个数据作为 pivot(分支点),一般为区间最后一个元素。然后遍历数组,将小于 pivot 的数据放到左边,将大于 pivot 的数据放到右边。接着,我们再递归对左右两边的数据进行排序,直到区间缩小 阅读全文
posted @ 2019-03-27 10:02 苏格拉底的落泪 阅读(214) 评论(0) 推荐(0)
摘要:AVL树简介 AVL树的名字来源于发明作者G.M. Adelson-Velsky 和 E.M. Landis的缩写。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性 阅读全文
posted @ 2018-09-30 10:47 苏格拉底的落泪 阅读(748) 评论(0) 推荐(0)
摘要:二叉排序树简介 二叉排序树,又叫二叉查找树,它或者是一棵空树;或者是具有以下性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 它的左右子树也分别为二叉排序树。 二叉排序树的创建 假设我们要为数组 {62, 阅读全文
posted @ 2018-09-30 09:39 苏格拉底的落泪 阅读(1050) 评论(0) 推荐(0)
摘要:实验3:由遍历序列构造二叉树 二叉树构造定理: 定理7.1:任何n(n>0)个不同结点的二又树,都可由它的中序序列和先序序列唯一地确定。 定理7.2:任何n(n>0)个不同结点的二又树,都可由它的中序序列和后序序列唯一地确定。 题目: 已知先序序列为ABDGCEF,中序序列为DGBAECF,则构造二 阅读全文
posted @ 2018-09-19 16:32 苏格拉底的落泪 阅读(1966) 评论(0) 推荐(0)
摘要:哈夫曼树定义 (01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子:100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3 阅读全文
posted @ 2018-09-18 21:01 苏格拉底的落泪 阅读(924) 评论(0) 推荐(0)
摘要:参考资料 1. 红黑树 2. Red–black tree【wikipedia】 3. 维基百科红黑树 阅读全文
posted @ 2018-09-10 21:47 苏格拉底的落泪 阅读(179) 评论(0) 推荐(0)
摘要:流量控制算法 令牌桶算法示意图: 令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。 令牌桶算法的描述如下: 假如用户配置的平均速率为r,则每隔1/r秒一个令牌被加入到桶中; 假设桶最多可以存b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃; 当一个n个字节大小的数据包到 阅读全文
posted @ 2018-06-27 20:21 苏格拉底的落泪 阅读(196) 评论(0) 推荐(0)
摘要:算法简介 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。 算法动态演示: 算法思想 阅读全文
posted @ 2018-06-09 10:34 苏格拉底的落泪 阅读(2036) 评论(0) 推荐(0)
摘要:二分查找图解 第一类: 查找等于目标值的数 比如我们有数组 [2, 4, 5, 6, 9],target = 6,那么我们可以写出二分查找法的代码如下: int find(vector<int> &nums, int target) { int left = 0, right = nums.size 阅读全文
posted @ 2018-06-07 20:51 苏格拉底的落泪 阅读(238) 评论(0) 推荐(0)
摘要:预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于 阅读全文
posted @ 2018-06-07 19:23 苏格拉底的落泪 阅读(140) 评论(0) 推荐(0)
摘要:2. 暴力匹配算法 【问题】假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置。 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: • 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字 阅读全文
posted @ 2018-05-26 21:09 苏格拉底的落泪 阅读(317) 评论(0) 推荐(0)
摘要:树的特征 树是一种数据结构,它是n(n>=0)个节点的有限集。n=0时称为空树。n>0时,有限集的元素构成一个具有层次感的数据结构。 区别于线性表一对一的元素关系,树中的节点是一对多的关系。树具有以下特点: n>0时,根节点是唯一的,不可能存在多个根节点。 每个节点有零个至多个子节点;除了根节点外, 阅读全文
posted @ 2018-05-22 22:07 苏格拉底的落泪 阅读(818) 评论(0) 推荐(0)
摘要:• 二叉树节点类型BTNode: 1 typedef struct node 2 { 3 char data; 4 struct node *lchild, *rchild; 5 } BTNode; 创建二叉树 1 void CreateBTree(BTNode *&b, char *str) 2 阅读全文
posted @ 2018-05-09 19:37 苏格拉底的落泪 阅读(402) 评论(0) 推荐(0)