常见算法与数据结构实现
文章平均质量分 75
依据严蔚敏版数据结构,包含顺序表,单链表,顺序栈,链栈,循环队列,字符串,树图等数据结构。后期加入常见算法,递归算法,贪心算法,线性回归,DFS,BFS等。
lady_killer9
CKA、CKS证书持有者,安全工程师
展开
-
数据结构(严蔚敏版)与算法的实现(含全部代码)
目录基础c/c++ 代码优化及常见错误 c语言位运算的妙用-程序优化c/c++进制转换方法汇总(含全部代码) 二进制数-北邮2012研究生复试质因子分解除树和图外的数据结构可以使用STL: C++ STL的使用数据结构线性表顺序表 循环左移(2010联考真题)单链表 单链表相邻结点逆置(2019北邮考研真...原创 2018-09-13 22:18:14 · 140425 阅读 · 65 评论 -
算法-贪心算法详解
顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。钞票支付问题 有1元、5元、10元、20元、100元、200元的钞票无穷多张。现使用这些钞票支付x元,最少需要多少张? 例如,X=628面额为1元、5元、10元、20元、100元、200元,任意面额是比自己小的面额的倍数关系。添加7元就不成立了。局部最优不满足了:X=14时,选7+7比选10+5+1+1要好。或者说,X=14时的第一个选择,不是X=13时的第一个...原创 2021-07-18 21:45:45 · 1776 阅读 · 2 评论 -
数据结构-快速排序(含全部代码)
目录函数分析代码全部代码截图算法可视化函数分析QuickSort(SqList &L,int low,high) 参数:顺序表L,待排最小下标,待排最大下标 功能:排序(默认升序)空间复杂度:O(1) 时间复杂度:O(nlog2n)-O(n) 稳定性:不稳定代码//快速排序分割函数int Partition(SqList &L,int low,int high){ int pivotekey = L.data[low]; //保存枢轴 whil原创 2021-03-15 19:13:40 · 15219 阅读 · 0 评论 -
数据结构-冒泡排序(含全部代码)
目录函数分析代码全部代码结果截图函数分析下标从小到大,相邻依次比较,直到最后两个被比较,每次比较,若为逆序,则交换,以上为一趟冒泡排序。使用一个标记,有交换时标记,若一趟下来没有需要交换的,则停止。void BubbleSort(SqList &L) 参数:顺序表L,时间复杂度O(n^2),空间复杂度O(1),稳定性:稳定代码//冒泡排序 升序排序void BubbleSort(SqList &L){ int m = L.length - 1;原创 2021-03-15 16:53:46 · 24248 阅读 · 1 评论 -
双指针算法详解(快慢指针、对撞指针、滑动窗口)
双指针双指针比较灵活,可以大大降低时间复杂度,可用在数组,单链表等数据结构中。快慢指针:一快一慢,步长一大一小,看慢指针是否能追上快指针。例如,是否有环问题,单链表找中间节点问题。对撞指针:一左一右向中间逼近。滑动窗口:类似计算机网络中的滑动窗口,例如,快慢指针是否有环对撞指针滑动窗口滑动窗口:有左右端点和长度,根据题目调整左右端点的位置进行滑动。也是一种特殊的双指针例题给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入.原创 2020-11-30 21:44:29 · 12563 阅读 · 0 评论 -
并查集(Disjoint Set)详解+例题
并:合并查:查询集:集合1.初始化:把每个点所在集合初始化为其自身;2、合并:将两个元素所在的集合合并为个集合。3、查找:查找元素所在的集合即根节点;深度不要太大union find...原创 2020-10-22 19:43:03 · 1651 阅读 · 0 评论 -
递归-深度优先搜索(模板、回溯、剪枝、记忆化)
简介深度优先搜索(DFS,Depth First Search)属于图算法的一种。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。步骤(1)访问顶点v;(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。可视化算法可视化-DFS方向问题自顶向下自底向上回溯忘记做过原创 2020-09-22 16:45:02 · 4089 阅读 · 1 评论 -
C++ string的简单使用
string是字符串,c++相对c来说增加了这个,比字符数组方便很多。有插入,替换,删除,反序,比较等功能。接下来用一个程序将大部分功能串再一起,并在下方链接一些应用string解题的链接。代码:/************** Author:FrankYu Date:2018/1/30 String **************/#include<iost...原创 2018-02-07 19:19:26 · 3007 阅读 · 1 评论 -
C++ 类型转换(内置类型,string、char*、const char*等)
文章适用于已经学了C++语言,对C++类型有一定了解的朋友。对类型转换进行总结,包括内置类型,string,以及由c语言引入的一些类型。类型内置数据类型 字节 范围 char 1 个字节 -128 到 127 或者 0 到 255 unsigned char 1 个字节 0 到 255 signed char 1 个字节 -128 到 127 int 4 个字节 -2147483648 到 2147483647 unsi原创 2020-09-06 17:16:20 · 4658 阅读 · 0 评论 -
图-欧拉图(欧拉环游/回路、欧拉迹/通路、Hierholzer算法、Fleury算法)
目录概念欧拉迹/通路(一笔画)半欧拉图环游欧拉环游/回路欧拉图欧拉定理推论Hierholzer 算法作用内容时间复杂度图代码截图Fleury算法作用内容时间复杂度图代码截图概念欧拉迹/通路(一笔画)通过图中每条边且行遍所有顶点的迹(每条边恰一次的途径),称为欧拉迹(Euler trail)。半欧拉图具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图,有且仅有两个度数为奇数的结点。环游图的环游(t原创 2020-08-31 20:08:24 · 11503 阅读 · 0 评论 -
二叉树-存储硬盘目录及文件,显示文件大小,tree命令模仿(含全部代码)
目录前言树转二叉树全部代码结果截图前言在cmd命令中有一个tree命令来显示目录及文件,类似下图:tree命令显示树转二叉树目录及文件结构(左)及二叉树保存(右)其中,大写字母的表示目录,小写字母的表示文件。根据左孩子右兄弟的规律,目录下有文件或目录则有左孩子,文件没有左孩子,目录XXX下的某个目录或文件,若接下来目录XXX还有其他目录或文件,则有右孩子,否则没有。思路:之前写过文章二叉树基本操作函数(先、中、后、层次遍历,含全部代码), 我们将其改为保存字符原创 2020-06-01 10:17:33 · 2436 阅读 · 0 评论 -
最小生成树-Kruskal算法详解(含全部代码)
目录适用条件测试所用图算法步骤Kruskal算法代码全部代码实验结果与Prim算法对比适用条件加权连通图(可以判定图是否连通)测试所用图与最小生成树-Prim算法详解(含全部代码)所用图相同,就是课本上的。算法步骤1.对边按权重排序为e1、e2、...2.若已选择V-1条边,停止。否则,按边的权重排序选择下一条边。3.判断选择的边...原创 2019-11-10 18:20:12 · 12467 阅读 · 3 评论 -
最小生成树-Prim算法详解(含全部代码)
目录适用条件测试所用图算法详解Prim算法代码全部代码实验结果适用条件加权连通图测试所用图所用原图及生成过程其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值。由实线连接的点就是集合U,即生成树在生成过程中加入的点。由虚线连接的点中不包含在集合U中的就是集合V-U,即待加入到生成树的点。虚线的变化就是在每次有节点加入集合U时,V-U中的点...原创 2019-11-10 16:12:33 · 33287 阅读 · 15 评论 -
图-弗洛伊德(FloydWarshall)算法详解(含全部代码)
目录适用条件基本操作函数功能实现函数测试使用图算法讲解初始化迭代弗洛伊德算法代码全部代码实验结果最短路径算法比较适用条件图中可以有负权,但不能有负圈(圈中弧或边的权值之和小于0)基本操作函数InitGraph(Graph &G) 初始化函数 参数:图G 作用:初始化图的顶点表,邻接矩阵等 InsertNo...原创 2019-10-25 09:51:10 · 9495 阅读 · 1 评论 -
图-贝尔曼福特(Bellman-Ford)算法详解(含全部代码)
目录适用条件基本操作函数功能实现函数测试使用图算法讲解初始化迭代贝尔曼福特算法代码全部代码实验结果适用条件图中可以有负权,但不能有负圈(圈中弧或边的权值之和小于0)基本操作函数InitGraph(Graph &G) 初始化函数 参数:图G 作用:初始化图的顶点表,邻接矩阵等 InsertNode(Graph ...原创 2019-10-24 17:46:42 · 17330 阅读 · 4 评论 -
图-迪杰斯特拉(Dijkstra)算法详解(含全部代码)
目录适用条件基本操作函数功能实现函数测试所用图算法讲解初始化结果变化过程迪杰斯特拉算法代码全部代码实验结果适用条件图中不存在负权边。基本操作函数InitGraph(Graph &G) 初始化函数 参数:图G 作用:初始化图的顶点表,邻接矩阵等InsertNode(Graph &G,VexType ...原创 2019-10-20 18:53:05 · 44851 阅读 · 15 评论 -
无向图-基本操作函数(建立,广度遍历,深度遍历,邻接表表示)
基本操作函数:InitGraph(Graph &G) 初始化函数 参数:图G 作用:初始化图的邻接表等InsertNode(Graph &G,VexType v) 插入点函数 参数:图G,顶点v 作用:在图G中插入顶点v,即改变顶点表InsertEdge(Graph &G,VexType v,VexType w) 插入边函数 参数:图G,某...原创 2019-02-16 17:29:53 · 1617 阅读 · 0 评论 -
树-双亲表示法(含全部代码)
基本操作函数:InitTree(Tree &T) 参数T,树根节点 作用:初始化树,先序递归创建InsertNode(Tree &T, TElemType node) 插入树的结点 参数:树T,结点node 作用:在双亲数组中插入结点,增加树的结点值InsertParent(Tree &T, TElemType node1, TElemType node2)//插入...原创 2019-02-25 21:46:03 · 8079 阅读 · 0 评论 -
统计结点个数(双亲表示法)-北邮2013研究生复试
地址:http://10.105.242.80/problem/p/92/92. 统计节点个数时间限制 1000 ms 内存限制 65536 KB题目描述给出一棵有向树,一共有N(1<N≤1000)个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数。如样例,第一组的p节点为...原创 2019-02-25 20:57:39 · 1779 阅读 · 0 评论 -
二叉查找树-插入结点,返回父节点(2012北邮机试)
题目:二叉排序树现在给你N个关键字值各部相同的节点,要求你按顺序插入一个初始为空的二叉排序树中,每次插入成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。输入格式:第一行:一个数字N(N<=100),表示带插入的节点数。第二行:N个互不相同的正整数,表示要顺序插入结点的关键字值,这些值不超过108.输出格式:输出共N行,每次插入节点后,该节点对应的父亲节点的关键...原创 2019-01-29 10:16:33 · 2840 阅读 · 0 评论 -
二叉树基本操作函数(先、中、后、层次遍历,含全部代码)
InitTree(BiTree &T) 参数T,二叉树根节点 作用:初始化二叉树,先序递归创建PreOrder(BiTree T) 参数T,二叉树根节点 作用:先序遍历二叉树,递归方式InOrder(BiTree T) 参数T,二叉树根节点 作用:中序遍历二叉树,递归方式PostOrder(BiTree T) 参数T,二叉树根节点 作用:后序遍历二叉树,递归方式LevelOr...原创 2019-01-12 21:38:22 · 11399 阅读 · 19 评论 -
c/c++进制转换方法汇总(含全部代码)
进制转换方法汇总表 原进制 转换进制 方法1 方法2 方法3 方法4 十进制 二进制 bitset指定格式输出 除留余数法 itoa 十进制 八进制 oct/%o指定格式输出 流 除留余数法 itoa 十进制 十六进制 hex/%x指定格式输出 流 除留余数法 ...原创 2019-02-24 17:51:16 · 38323 阅读 · 5 评论 -
无向图-基本操作函数(建立,广度遍历,深度遍历,邻接矩阵表示)
主要函数:基本操作函数:InitGraph(Graph &G) 初始化函数 参数:图G 作用:初始化图的顶点表,邻接矩阵等InsertNode(Graph &G,VexType v) 插入点函数 参数:图G,顶点v 作用:在图G中插入顶点v,即改变顶点表InsertEdge(Graph &G,VexType v,VexType w) 插入...原创 2019-02-14 17:06:21 · 7054 阅读 · 1 评论 -
动态规划-0/1背包优化(含全部代码)
题目:假设你是一个小偷,有一个可放总重量为m(m<1000)的背包。现有n(n<32)件物品。 总量分别为W1,W2,...,Wn。并且,物品具有价值,分别为V1,V2,...,Vn。m、n、Wi(1=<i<=n)均为正整数, 现要求你尝试挑选几件物品,使这些物品重量之和为m。求能装入的最大总价值。输入格式:第一行为两个正整数m和n接下来n行分...原创 2019-01-12 15:22:17 · 1236 阅读 · 1 评论 -
动态规划-简单背包问题(含全部代码)
题目:假设你是一个小偷,有一个可放总重量为m(m<1000)的背包。现有n(n<32)件物品。 总量分别为W1,W2,...Wn。m、n、Wi(1=<i<=n)均为正整数,现要求你尝试挑选几件物品 使这些物品重量之和为m。若可以,输出那true。否则,输出false。输入格式:第一行为两个正整数m和n第二行为n个正整数,分别表示n件物品的重...原创 2019-01-12 11:13:19 · 2097 阅读 · 0 评论 -
动态规划-多重背包(含全部代码)
题目:假设你是一个小偷,有一个可放总重量为m(m<1000)的背包。现有n(n<32)件物品。 总量分别为W1,W2,...,Wn。物品具有价值,分别为V1,V2,...,Vn。并且,物品是有限个, 数量分别为N1,N2,...Nn。m、n、Wi,Vi,Ni(1=<i<=n)均为正整数,求能装入的最大总价值。输入格式:第一行为两个正整数m和n接...原创 2019-01-12 09:59:39 · 2121 阅读 · 0 评论 -
动态规划-完全背包优化(含全部代码)
题目:假设你是一个小偷,有一个可放总重量为m(m<1000)的背包。现有n(n<32)件物品。 总量分别为W1,W2,...,Wn。并且,物品具有价值,分别为V1,V2,...,Vn。m、n、Wi(1=<i<=n)均为正整数, 并且,每种物品的数量不限,也就是说你可以重复拿一种物品。求能装入的最大总价值。输入格式:第一行为两个正整数m和n接下来...原创 2019-01-11 20:51:08 · 1218 阅读 · 1 评论 -
动态规划-完全背包(含全部代码)
题目:假设你是一个小偷,有一个可放总重量为m(m<1000)的背包。现有n(n<32)件物品。 总量分别为W1,W2,...,Wn。并且,物品具有价值,分别为V1,V2,...,Vn。m、n、Wi(1=<i<=n)均为正整数, 并且,每种物品的数量不限,也就是说你可以重复拿一种物品。求能装入的最大总价值。输入格式:第一行为两个正整数m和n接...原创 2019-01-11 19:54:23 · 1820 阅读 · 0 评论 -
动态规划-0/1背包问题(含全部代码)
题目:假设你是一个小偷,有一个可放总重量为m(m<1000)的背包。现有n(n<32)件物品。 总量分别为W1,W2,...,Wn。并且,物品具有价值,分别为V1,V2,...,Vn。m、n、Wi(1=<i<=n)均为正整数, 现要求你尝试挑选几件物品,使这些物品重量之和为m。求能装入的最大总价值。输入格式:第一行为两个正整数m和n接下来n...原创 2019-01-10 22:44:15 · 4660 阅读 · 0 评论 -
递归-简单背包问题(修剪递归树,含全部代码)
题目:假设你是一个小偷,有一个可放总重量为m(m<1000)的背包。现有n(n<32)件物品,总量分别为W1,W2,...Wn。 其中,m、n、Wi(1=<i<=n)均为正整数,现要求你尝试挑选几件物品,使这些物品重量之和为m。 若可以,输出那true。否则,输出false。输入格式:第一行为两个正整数m和n第二行为n个正整数,分别表示n件物品...原创 2019-01-10 22:19:25 · 3157 阅读 · 0 评论 -
动态规划-最长平衡子串(2018北邮机试真题)
题目:最长平衡串给定只含0、1的字符串,找出最长平衡子串的长度(平衡串:包含0和1的个数相同)输入包含两行: 第一行输入串长n(1=<n<=100000) 第二行输入字符串Example:Input:811011011Output:4[思路分析]: 看到题目想到了动态规划中前缀和的思想。定义dp[i]表示前i项和,但是发现,0...原创 2019-01-08 11:42:18 · 3519 阅读 · 0 评论 -
动态规划-各种题型及思路整理(自用笔记,大神绕道)
简介: 动态规划(dynamic programming,简称dp),是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。(没办法,其实算法就是数学,毕竟数学是基础学科,由数学支撑的学科太多太多) 分类: 动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。举例:线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;区...原创 2019-01-07 11:12:34 · 9716 阅读 · 8 评论 -
动态规划-最大子数组
题目:给定一个整数数组,找出和最大的子数组,返回其和。例如,(1,-2,3,5,-1,2)最大子数组(3,5,-1,2),和为9.分析: 利用动态规划,记Sum[i]表示以A[i]结尾的子数组中的和最大子数组。Sum[i+1]呢? 考虑Sum[i]的情况,若Sum[i]>0(即Sum[i]+A[i+1]>A[i+1]),则Sum[i+1]=Sum[i]+...原创 2019-01-03 17:21:45 · 4575 阅读 · 0 评论 -
分治-最大子数组(算法导论P39)
题目:给定一个整数数组,找出和最大得到子数组,返回其和。例如,(1,-2,3,5,-1,2)最大子数组(3,5,-1,2),和为9.分析:利用分治思想,将数组分为两段,则,最大子数组在左子数组、右子数组、或者跨在两个子数组中间。 对于左右子数组利用递归解决,跨在中间的左右扩展即可。 MaxSubArr(int A[], int from, int to)参数:数组A,起...原创 2019-01-01 11:08:58 · 1111 阅读 · 0 评论 -
基础算法-递归讲解及模板(C++实现)
在看本文之前,需要了解一下函数调用的过程:1.计算参数值,将函数压入函数栈2.执行函数3.结束本函数,栈帧返回至上层函数我们平时写的main也是个函数,在里面调用其他的函数。递归函数模板://递归函数void 递归函数(参数列表){ if(结束条件)//满足后执行下列语句,结束当前函数并返回 { //执行函数体,结束函数前该干的事情 } ...原创 2018-07-23 21:55:13 · 1350 阅读 · 0 评论 -
折半查找某数X在数组中出现的次数(2019北邮考研真题)
题目:采用折半查找的思想,统计所给X在数组A中出现的次数,例如,122235。2出现次数为3。分析:采用分治(折半查找)的思想,若中间值为X,则统计数量+1,并递归查找左子表与右子表。若中间值小于X,则X可能在右子表,查找右子 表。若中间值大于X,则X可能在左子表,查找左子表。函数代码://统计X在数组A中出现的次数函数int Count(int A[],int start,int...原创 2018-12-29 20:36:31 · 2759 阅读 · 7 评论 -
数据结构-各种排序对比(时间复杂度,空间复杂度,稳定性等等)
查找与排序除了需要掌握代码外,还需要掌握各种性能对比,本文对常见的排序算法的性能进行对比。如有错误,请读者指正。排序算法性能比较 排序算法 时间复杂度 空间复 杂度 稳定性 适用性 一趟是否能 确定一个位置 比较次数是否 与初态无关 直接插入排序 最好:O(n) O...原创 2018-12-28 16:27:42 · 6548 阅读 · 2 评论 -
数据结构-直接插入排序(含全部代码)
函数分析:InsertSort(SqList &L) 参数:顺序表L 功能:排序(默认升序)空间复杂度:O(1) 时间复杂度:O(n方) 稳定性:稳定代码://直接插入排序 升序排序void InsertSort(SqList &L){ int temp;int i,j; for(int i=2;i<=L....原创 2018-12-28 15:59:04 · 14508 阅读 · 0 评论 -
单链表相邻结点逆置(2019北邮考研真题)
题目:请编写单链表相邻结点逆置算法。例如,1234逆置之后为2143。12345逆置后为21435。分析:单链表逆置只需要交换数据域即可。由题可知,需要分奇数个结点和偶数个结点。可以使用两个指针p和q;p在前,q在后,换两个数据域。 当为偶数个结点时,q-next为空,跳出即可。当为奇数个结点时,p->next为空时,跳出即可。函数代码:void Rever...原创 2018-12-24 10:26:21 · 3834 阅读 · 0 评论 -
数据结构-二分查找(含全部代码)
函数分析如下:Binary_search(SqList L,ElemType key) 参数:顺序表L,待查关键字 功能:查找key 时间复杂度:O(logn)每次和中间值比较,相同返回下标,不相同调整边界。函数代码://二分查找函数int Binary_search(SqList L,ElemType key){ int low = 0;int mid = 0;int h...原创 2018-10-26 20:05:00 · 16498 阅读 · 4 评论