随笔分类 - 数据结构学习
数据结构 链表and顺序表
摘要:链表 7-3 单链表的创建,遍历与销毁 从键盘输入任意多个正整数,输入以-1结束。逆序输出这些整数(不包括-1)。 提示: 1、逆序创建单链表。结点数据域是整型数。每输入一个整数,向链表中插入一个结点。当输入-1时结束链表的创建。 2、遍历链表,输出结点数据域的值。 3、遍历完成后,要求销毁该链表。
图论 _ 基本最短路算法
摘要:约定: n是指点的数量,m是指边的数量 目录: Dijkstra算法 Dijkstra算法只能用于所有边权均为非负数值的图 Dijkstra算法有两种实现: 一种是朴素实现,复杂度是 一种是堆优化版,复杂度是 堆优化版+邻接表存图有以下优点: 不需要对
数据结构 _ ST表 | RMQ 问题
摘要:基本概念 RMQ问题 RMQ英文是Range Maximum(Minimum) Query, 翻译就是区间求最值的意思。 ST表(Sparse Table,稀疏表) 是一种简单的数据结构,基于 倍增 思想,主要用来解决RMQ问题。 不支持修改操作 实现 复杂度: 预处理:
二叉树
摘要:正常建树和遍历 先序遍历 void Pre(node *F){ if(!F)return; cout<<F->value; Pre(F->L); Pre(F->R); } 代码 /** *输入格式:ABC##DE#G##F### **/ #include<bits/stdc++.h> using n
并查集(Disjoint Set)
摘要:解决的问题 查找无向图是否成环 在无向图上,查询是否在同一个连通图中 思想 利用数组建树,数组元素值代表该位置的父亲结点,如果为数组元素值为本身代表为独立结点 找祖先 每次询问自己的父亲,直到查找到数组元素值为本身的点即为祖先。 合并两个圈 合并两圈=把a2图的头结点的父亲结点改为a1图的头结点 成
图的遍历(DFS、BFS)
摘要:深度优先遍历(DFS) 思想: 一条路走到底:走到访问过的结点,退回上一结点;从上一结点开始,继续遍历未访问的结点,重复此项工作。(遍历次序可能不同) 案例:根的先根遍历 代码(邻接矩阵)(连通图) **代码思想:**每次取出一个元素,放入与该元素相连的并且没有放入栈中的其他结点;直到无路可走,只取
最小生成树(ST)概念及构造
摘要:概念 图的生成树 它的一棵含有所有顶点的无环连通子图。 特点: 有n个顶点一定有,n-1条边。 生成树是图的极小连通子图 (去掉一条边则非连通)。 分类: 深度优先生成树 广度优先生成树 最小生成树: 对于加权图(网) 的生成树中边的权重之和最小的生成树。 最小生成树可能不唯一 最小生成树作用: 修
哈夫曼树和哈夫曼编码
摘要:基础概念 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。 结点的权值: 将树中结点赋给一个含有某种含义的数值。记为:Wi(i=1,2,...n) 路径长度: 等于路径上的结点数减1。 结点的带权路径长度: 从根结点到该结点的路径长度与该结点的权值的乘积。记为:Li(i=1,2,...n)。
数据结构 排序
摘要:归并排序 插入排序 直接插入排序 基本思想: 每步将一个待排序的元素,插入到已经排好序的一组元素的适当位置上去,直到元素全部插入为止。 基本操作: 将待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(
数据结构 查找
摘要:基础概念: 查找: 根据给定的值,在查找表中确定一个其关键字等于给定值的数据元素。 关键字: 用于标识一个数据元素的数据项的值。 主关键字: 可以唯一的表示一个记录的关键字。 平均查找长度ASL ASL(Average Search Length) 线性表的查找 顺序查找 优点: 简单,对逻辑次序无
数据结构 图
摘要:图是一种比线性表和树更复杂的数据结构, 在图中,结点之间的关系是任意的,任意两个数据元素之间都可能相关。图是一种多对多的数据结构。 概述 概念: 图(Graph): 由顶点的有穷非空集合和顶点之间边的集合组成。 通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
数据结构 五、树与二叉树
摘要:基本概念 树和森林 森林: 是m(m>=0)棵互不相交的树的集合 树(Tree): 是n(n>=0)个结点的有限集。 n=0时称为空树。 在任意一颗非空树中: (1)有且仅有一个特定的称为根(Root)的结点。 (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、.....、T
堆排序
摘要:链接: 原文. 推荐的视频教程 一,基础知识(记忆) 完全二叉树基础知识 若树的根节点记为 0 i处节点的left_child位置为:2 * i +1 i处节点的left_child位置为:2 * i +2 i处节点的parent位置为:( i - 1 )/ 2 n个元素的堆的最后一个父亲结点的位置
归并排序
摘要:原文 概述 归并算法采用经典的分治(divide-and-conquer)策略,将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 思想 先对只有单个元素的子序列通过两两合并(或两个以上)的方式进行排序,形成一个长度
7-7 词典 (15 分)
摘要:#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; map<string,string> M; for(int i=0;i<n;i++){ string a; string b; cin>>a>>
7-3 词频统计 (30 分)
摘要:思路 使用java更简单,可以一次读取然后用split进行分割字符串,再进行判断 如果使用c的话只能曲线救国 代码思路: 这个题的难点在于什么时候停止输入,什么时候分割字符。 因为题目的输入可能有几行,不能使用gets,因为分割符号不止是空格和回车,所以scanf也不行。 c里面虽然有可以满足我们要
error: 'gets' was not declared in this scope; did you mean 'fgets'? 解决方法
摘要:问题原因 gets()已经不被提交平台的C++编译器支持, 解决方法 方法1:改用c语言 但是C语音编译器未受影响,把头文件改成C语言格式,用C语音编译器即可通过。 方法2:改用cin.getline /* 读入一行(可含空格),直到换行符结束 * 将其前num-1个字符存入数组a中并以字符c结尾
C++ map按key或按value排序
摘要:map按key排序 (1)map默认按照 key 从小到大排序 map<string,int> hash; //等价于 map<string,int, less<string>> hash; (2)map按照 key 从大到小排序 map<string,int, greater<string> >
7-5 任务调度的合理性 (25 分)
摘要:题意 简单拓扑排序查找是否成环。 代码 #include <bits/stdc++.h> using namespace std; int dis[105][105], ru[105]; int n; void Tsort(){ int cnt=0; int flag=1; while(flag){
7-7 最短工期 (25 分)
摘要:题目解析 一个项目由若干个任务组成,任务之间有先后依赖顺序。 该题是个有向图 项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务。 里程碑是指:指向里程碑的任务全部完成,才能继续里程碑指向的任务。 现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间