
数据结构
文章平均质量分 59
zhaoliwen是猪啊
这个作者很懒,什么都没留下…
展开
-
堆的实现(大量注释)
堆的实现什么是堆堆就是用数组实现的二叉树,堆有两种形式:最大堆和最小堆,两者的差别在于节点的排序方式。在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”,并且这个属性对堆中的每一个节点都成立。这是一个最大堆,,因为每一个父节点的值都比其子节点要大。根据这一属性,那么最大堆总是将其中的最大值存放在树的根节点。而对于最小堆,根节点中的元素总是树中的最小值。堆属性非常有用,因为堆常常被当做优先队列使用,因为可以快速地访问到“最重要”的元原创 2021-05-12 09:20:52 · 183 阅读 · 2 评论 -
图结构专栏——最小生成树之Kruskal算法
最小生成树——Kruskal算法一、最小生成树在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。例如,对于上图所示的连通网可以有多棵权值总和不同的生成树,而最后的生成树是最小生成树。二、Kruskul算法克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。具体做法:首先构造一个只含n个顶点的森林,然后依权值原创 2021-04-18 18:55:51 · 564 阅读 · 0 评论 -
并查集以及路径压缩
并查集以及路径压缩一、概念并查集是一种树型的数据结构,他的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。他有两个操作:合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合中。这个确定方法就是不断向上查找找到它的根节点,它可以被用来确定两个元素是否属于同一子集。二、操作每一个集合用一棵树来表示。树根的编号就是整个集合的编号。每个节点存储它的父节点, paren原创 2021-04-18 16:43:09 · 1296 阅读 · 0 评论 -
顺序栈和链栈以及他们的应用
顺序栈和链栈以及他们的应用一、什么是栈只允许在一端插入和删除的线性表允许插入和删除的一端称为栈顶 (top),另一端称 为栈底(base)特点:后进先出 (LIFO, Last In, First Out)二、顺序栈2.1 顺序栈的顺序存储表示#define STACK_INIT_SIZE 100#define STACKINCREMENT 10 typedef struct { SElemType *base; SElemType *to原创 2021-04-15 16:37:17 · 341 阅读 · 1 评论 -
图结构专栏——Dijkstra算法详解(大量注释)
Dijkstra算法详解(大量注释)Dijkstra 算法是求一个图中一个点到其他所有点的最短路径的算法一、算法详解每次从 「未求出最短路径的点」中 取出 距离距离起点 最小路径的点,以这个点为桥梁 刷新「未求出最短路径的点」的距离,可以结合下面的案例来理解。对于这样一个无向图,我们希望求得节点3到其他节点的最短路径长度。首先,我们定义一个数组distance记录了节点3到其他节点的最短路径长度,再定义一个数组visited记录哪些节点到3节点的最短路径长度已经计算过了,这些数组初始化都为-1。原创 2021-04-15 08:54:20 · 487 阅读 · 0 评论 -
图结构专栏——判断二分图
图结构专栏——判断二分图一、什么是二分图定义:如果能将一个图的节点集合分割成两个独立的子集 A 和 B ,并使图中的每一条边的两个节点一个来自 A 集合,一个来自 B 集合,就将这个图称为二分图 。例子1:这不是一个二分图,因为不能将节点分割成两个独立的子集,以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点例子2:这是一个,可以将节点分成两组: {0, 2} 和 {1, 3}二、如何判断一个图是不是二分图对于图中的任意两个节点 u 和 v,如果它们之间有一条边直接相连,那么原创 2021-04-13 19:31:35 · 1467 阅读 · 0 评论 -
图结构专栏——拓扑排序
三种方法实现拓扑排序一、什么是拓扑排序在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。例如,下面这个图:它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法原创 2021-04-12 10:52:52 · 8814 阅读 · 0 评论 -
n! 在m进制下末尾0的个数(含大量注释)
n! 在m进制下末尾0的个数(含大量注释)一、思路:1、先从10进制思考可以先从10进制下末尾0的个数开始思考,先求出10的质因数,很显然是2 * 5,因此我们需要求n!的结果有多少2 * 5,但是我们先求n!有多少2以及有多少5,之后取最小的那个值即为有多少个2 *5了。举个例子,要求320有多少2 * 5,320 = 262^626 * 5,那么显然只有一个2 * 5,所以320在10进制下末尾就只有一个0。之后加入阶乘思考,例如思考25!在十进制下末尾有多少0,这里我们引入一个公式:那么可以原创 2021-04-10 09:40:30 · 503 阅读 · 0 评论 -
深入探究快速排序 && 随机快速排序
深入探究快速排序 && 随即快速排序本篇博客将展示快速排序中两种partition的写法,同时讲解随机快速排序,并将它们进行对比快速排序1、第一种partition这种partition的写法主要是确定一个基准值(一般最右侧的值),然后两个指针从两头往中间移动,,当两个指针相遇后,将基准值与指针交换,这样使得小于基准值的值在基准值的左侧,大于基准值的值在基准值的右侧。int partition(vector<int> &q, int l, int r){ i原创 2021-04-09 11:05:52 · 490 阅读 · 0 评论 -
基于哈夫曼编码对文件进行压缩和解压缩(详细讲解)
基于哈夫曼编码对文件进行压缩和解压缩(详细讲解)本文对应c++代码实现链接一、背景利用特定的算法来压缩数据的工具,压缩后生成的文件称为压缩包。如果想使用其中的数据,就得用压缩软件对数据进行解压。利用压缩软件对文件中重复的数据进行压缩,可以减小文件中的字节总数,常用的压缩软件有rar、zip等。二、编码介绍2.1 等长编码任何文件在计算中都是以字节为最小单位进行存储的,所以可以把任何文件看作是利用8位(一个字节)作为等长编码编码方式,编码而成的文件。往往这种编码方式并不是最优的编码方式。例如:对原创 2021-04-08 10:55:32 · 25230 阅读 · 10 评论 -
一组数中寻找加和最接近某个值的组合 JAVA实现
一组数中寻找加和最接近某个值的组合 JAVA最近帮人做了一个题,就是在一组数中寻找一个子集合,使得这个子集合的数的加和最接近给定的某个值,此外,这些数的类型是浮点数。我第一想到是用01背包问题去解,但是感觉对于整型数好做,浮点数会难以控制精度。再次我给出三种做法,第一种是暴力做法,第二三中方法都是基于蒙特卡洛算法。1、暴力法这个方法的思路是使用深度优先遍历将给定数组的所有子集合给出,在代码中,我们按子集合内数字的个数依次给出,例如对于数组[1,2,3],我们先给出只有一个数字的子集合[1],[2],[原创 2021-04-02 16:38:42 · 8804 阅读 · 5 评论 -
手写排序算法(二)
手写排序算法(二)6、快速排序void quicksort(vector<int> &q, int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + rand() % (r - l + 1)]; while (i < j) { do j--; while (q[j] > x); do i++; while (q[i] < x); if (i <原创 2021-04-01 09:11:15 · 118 阅读 · 0 评论 -
手写排序算法(一)
手写排序算法(一)算法分析1、冒泡排序vector<int> bubble(vector<int> nums)//冒泡排序{ for (int i = nums.size() - 1; i > 0; i--) { bool judge = false; for (int j = 0; j < i; j++) { if (nums[j] > nums[j + 1]) { int t = nums[j]; nums[原创 2021-03-30 20:01:42 · 530 阅读 · 0 评论 -
WesternCipher 加密解密
WesternCipher 加密解密今天帮人做了一道Java题目,是一道按照规则对字符串进行加密解密的问题,不算难,在这里记录一下。题目是英文的,就不放原题了,在这里简单描述一下加密规则:字符串仅包括空格和大写字母,空格不加密;所有的字母首先会向后移动五步,例如A变成F,B变成G(靠后的字母移动后会回到开头部分,Z变成E);所有字母会再次向后移动它在字母串的位置*2的步数,下标从0开始,例如AB变成FI;在下表中的字母在字母串的加密需要按照下表加密,而不是用上述方法,例如AB变成原创 2021-03-24 20:46:08 · 406 阅读 · 0 评论 -
顺序表的操作
顺序表的操作最近在帮人写代码,就顺便在博客记录一下自己写的代码吧,有简单代码也有难的代码(或许)。今天记录的是帮别人写一些关于顺序表的操作定义顺序表#define LIST_INIT_SIZE 80 // 线性表存储空间的初始分配量 #define LISTINCREMENT 10 // 线性表存储空间的分配增量using namspace std;typedef struct { ElemType *elem; // 存储空间基址 int lengt原创 2021-03-23 15:46:24 · 312 阅读 · 0 评论