数据结构
数据结构
不太聪明的样子
这个作者很懒,什么都没留下…
展开
-
并查集(C语言)
并查集 并查集是一种树形的数据结构,顾名思义,它用于处理一些不相交集的合并和查询问题。它支持两种操作:1.查找(Find):确定某个元素处于哪个集合2.合并(Union):将两个子集合并成一个集合在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。一般我们用一个数组来表示全部集合,数组有两种初始化的方式,第一种,数组每个元素都设置为-1,理由是数组下标都是非负整数,用负数可以标记一原创 2020-12-19 20:49:32 · 1054 阅读 · 1 评论 -
线段树(C语言)
线段树线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶子结点。使用线段树可以快速以O(logN)的时间复杂度实现单点、区间的修改和查询,综合性能较好。对于线段树中的每一个非叶子结点[i, j],它的左儿子表示的区间为[i, (i + j)/2],右儿子表示的区间为[(i + j)/2 + 1, j],因此线段树是平衡二叉树。以数组arr = [1, 2, 3, 5, 7]为例,我们可以画出以下的线段树,每个结点的值表示对应区间的元素和,叶子结点表示单原创 2020-12-14 22:06:22 · 681 阅读 · 0 评论 -
差分、前缀和数组(C语言)
差分、前缀和数组差分数组作用:加快区间修改的速度一般要将数组的[i, j]区间元素都加上或减去一个数,需要从i遍历到j,但是使用差分数组,只需要修改差分数组上两个位置的值即可int nums[6] = {2, 3, 5, 8, 4, 9}; //待操作的数组int diff[6];diff[0] = 0;for(int i = 1; i < 6; i++){ diff[i] = nums[i] - nums[i - 1]; }//diff[6] = {0, 1, 2, 3,原创 2020-12-13 22:12:02 · 1194 阅读 · 0 评论 -
哈希表(C语言)
哈希表 哈希表又称散列表,是一种是“key-value"形式存储的数据结构。即将key映射到表上的一个单元,从而实现快速查找等操作,这个映射操作就叫散列,具体通过散列函数实现相应的映射。根据key的形式,散列的形式多种多样,这里以正整数为例,常用的散列函数为:Hash(Key)=Key%TableSizeHash(Key) = Key \% TableSizeHash(Key)=Key%TableSize TableSize为表长,一般情况下,我们希望一个元素能唯一对应表上的一个单元,但是这是原创 2020-12-13 21:15:56 · 2705 阅读 · 0 评论 -
拓扑排序(mooc笔记)
拓扑排序拓扑排序是对有向无环图的顶点的一种排序,一个最典型的的例子就是学校排课,在学习一门课程时有时需要用到另一门课程的知识,因此需要安排好课程学习的先后顺序我们可以用有向边(V, W)表明课程V必须在课程W选修前修完,由此建立出一张有向图,称其为AOV网络拓扑排序的经典做法就是利用一个队列。首先,对每一个顶点计算它的入度。然后,将所有入度为0的顶点放入队列中。当队列不为空时,删除一个顶点V,并将与V邻接的所有顶点的入度减1.只要一个顶点的入度降为0,就把该顶点放入队列中。此时,拓扑排序就是顶点出原创 2020-07-22 01:04:52 · 307 阅读 · 0 评论 -
KMP串的模式匹配(mooc笔记)
什么是串?线性存储的一组数据(默认是字符)串的模式匹配即在串中寻找给定子串,要实现这点一个简单的方法是调用相关的库函数,比如c语言的strstr函数,它的实现方式是逐个字符匹配,例如在string = "abcabd"中匹配pattern = “abd”,遇到’a’开始匹配,当匹配到’c’的时候发现匹配不上,就退到第二个字符开始,所以这种匹配方法的时间复杂度为O(nm),其中n为string的长度,m为pattern的长度大师改进(KMP算法)时间复杂度:T = O(n + m)特点:利用了已经匹原创 2020-07-10 21:13:30 · 106 阅读 · 0 评论 -
LeetCode-设计循环队列(c语言)
队列是典型的 FIFO 数据结构。插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾。 删除(delete)操作也被称为出队(dequeue)。 你只能移除第一个元素。队列应支持两种操作:入队和出队。入队会向队列追加一个新元素,而出队会删除第一个元素。 所以我们需要一个索引来指出起点。一般的队列会出现空间浪费的情况,因此,更有效的方法是使用循环队列。 具体来说,...原创 2020-05-07 17:52:19 · 263 阅读 · 0 评论 -
二叉树的遍历与基本操作(mooc笔记)
二叉树结点的定义:typedef struct TNode* BinTree;typedef BinTree Position;typedef int ElementType;struct TNode{ ElementType Data; BinTree Left; BinTree Right;};二叉树的遍历:1.前序遍历访问顺序:根节点->...原创 2020-04-11 10:25:15 · 191 阅读 · 1 评论 -
最大子序列和问题(mooc笔记)
对于这个问题我们给出三种算法:算法1:T(N) = O(N^2)一种笨办法,两个for循环,起点从下标0开始,每遍历一次就加1再遍历,一直加到N,这样就得到了最后的结果,思路不难但是不算好。代码如下:int MaxSubSequenceSum(int A[],int N){ int ThisSum,MaxSum; MaxSum = 0; for(int i...原创 2020-03-31 22:51:49 · 263 阅读 · 1 评论 -
矩阵的抽象数据类型定义(mooc笔记)
用二位数组存放矩阵,c语言实现矩阵的加法和乘法代码如下:#include<stdio.h>#include<stdlib.h>#define MAXR 100 //矩阵最大行数#define MAXC 100 //矩阵最大列数typedef int ElementType;typedef struct matrix* Matrix;struc...原创 2020-03-30 21:36:07 · 1831 阅读 · 0 评论