- 博客(45)
- 收藏
- 关注
原创 Sting类的实现
#include <iostream>#include <cstring>using namespace std;class String{public: String(const char *str = NULL); //构造函数 String(const String &str); //拷贝构造函数 ~String(); //析构函数 String operator+(const String &str) con.
2020-12-03 11:43:00
157
原创 排序算法
排序算法分类:排序算法分为两类:比较类和非比较类;比较类排序:通过元素间比较来决定他们的相对次序,时间复杂度最大为O(nlogn),也称之为非线性时间比较类排序;非比较类排序:不通过元素间比较决定次序,可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。算法复杂度:相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度:对排序数据的总的
2020-11-03 10:46:13
195
原创 标准I/O函数
标准IO是带缓冲的IO,IO流,它的效率要比系统IO要高系统IO:read 1byte 从硬件上面读取一个字节标准IO:read 1byte 从硬件上面读取一块(512byte)出来,放到标准IO的缓冲区。标准IO缓冲区有三种类型:行缓冲(_IOLBF):缓冲区的数据达到了一行,自动的同步到你的硬件上面去 假设你设置的一行的大小最多为512字节 缓冲区的数据达到了512字节,就会自动的同步 ...
2020-08-22 11:26:05
519
原创 系统I/O函数
系统I/O1、打开文件#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);pathname:要打开或者创建的文件的文件名,带路径(如果不带路径,就表示在当前文件夹)flags:打开文件
2020-08-22 10:25:42
286
原创 Makefile
Makefile一个工程中的源文件不计数,其按类型、功能、 模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译, 哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。 makefile 带来的好 处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译, 极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile
2020-07-26 14:35:02
166
原创 图的存储
图的存储一共有四种方法:1.邻接矩阵:这种方法简单易懂,但是容易造成内存的浪费。 最简单的存图方式,一般就是开辟一个二维数组,比如一共有n个点组成的图,就开个edge[n][n],edge[1][2] = 3,就表示点1到点2的权值为3,但是有一些到不了的点,比如4到达不了5,但是仍有edge[4][5]这个数据,我们可以把它初始化为一个标记数,代表无法到达。太简单,代码就不放了;2.邻接表:改善了矩阵所带来的内存浪费问题,但是操作不便。邻接表的处理办法是这样。1) 图中顶...
2020-07-22 21:59:51
956
原创 红黑树
一.为什么要有红黑树这种数据结构?首先,在二叉搜索树,极个别极端的数据会使二叉树退化成链表,所以出现了平衡二叉树(AVL树);ALV树:是一种严格按照定义来实现的平衡二叉查找树,所以它查找的效率非常稳定,为O(log n),由于其严格按照左右子树高度差不大于1的规则,插入和删除操作中需要大量且复杂的操作来保持ALV树的平衡(左旋和右旋),因此ALV树适用于大量查询,少量插入和删除的场景中。所以说,如果有大量数据进行插入,则AVL树会耗费大量时间去进行旋转平衡操作,为了使整个二叉树更具备查找与插入
2020-07-20 20:18:55
175
原创 最小生成树
下面介绍两种求最小生成树算法1.Kruskal算法此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。1. 把图中的所有边按代价从小到大排序;2. 把图中的n个顶点看成独立的n棵树组成的森林;3. 按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。...
2020-07-08 12:16:27
270
转载 devC++常用快捷键
Ctrl+/ 快速对一行进行注释,拉中的范围也可以,再次进行则取消注释Ctrl+w 关闭Ctrl+s 保存Ctrl+m 新开一页Ctrl+b 打开文件所在位置Ctrl+f 搜索与替换Ctrl+n 新建Ctrl+d Ctrl+e 删除、复制一行Ctrl+z Ctrl+y 撤销与还原Ctrl+shitf+w 全部关闭Ctrl+shift+s 全部保存Ctrl+shift+up/down 所选区域 移动f5 调试f9 编译f10 运行f11 编译并运行shift+e...
2020-07-07 17:35:31
2942
原创 正则表达式
正则表达式: Regular Expression 字符串是计算机应用中最广泛的处理对象之一,(网页,文档),并且 字符串组合规则形式多样,比如 数字字符串 C语言标识符 IP地址字符串 URL字符串(统一资源定位符) 。。。 上面这些都是我们程序设计需要处理的对象,现在的问题是:计算机要处理这些 字符串,首先需要某种语言去描述这些字符串的规则 ==>正则表达式,它就是描述某一特定规...
2020-07-05 11:06:53
249
原创 shell
shell的实质是命令解析器,分为图形化界面shell和命令行shellshell脚本文件实质是文本文件,其内容为命令的有序集合shell文件的注释用#vim 1.sh#!/bin/bash 执行这个shell脚本的程序路径一行要执行多条指令,可以用;把各指令隔开chmod +x 1.sh./1.shecho "123" 或 echo 123shell变量,没有类型的概念,全部是字符串 A=value //定义一个变量A并初始化为value B= ...
2020-07-05 10:57:59
308
原创 Linux基础
0,Linux历史 Linux诞生于1991年,创始人是 林纳斯.托瓦茨 Linux是一套免费使用且开源的类Unix操作系统。 UNIX系统是一个多用户,多任务的分时操作系统。 Linux可划分为四个部分: Linux内核 GNU工具组件: GNU由美国著名黑客 理查德·斯托曼发起的GUN project GNU = GNU is Not Unix, 发行版权是copyleft 图形化桌面环境 应用软...
2020-07-05 10:01:59
326
原创 结构体_共用体_枚举
1,问题的引入 现实世界物体需要抽象成计算机语言中的数据类型 学生: 学号 ==> int 姓名 ==> char[] 性别 ==> char 年龄 ==> int 地址 ==> char[] 颜值 ==> int ... 这些都是物体的属性 ==>组合到一个数据类型中去 C语言...
2020-07-04 19:27:18
204
原创 指针
1,问题的引入 int a; a = 100;//把数值100存放到变量a对应的存储单元中去 b = a;//把a的数值存放到变量b对应的存储单元中去 ==> 在C语言中,任何一个变量名,都有两层含义 (1)代表该变量的存储单元,左值 lvalue (2)代表该变量的值 右值 rvalue 而且,我们对变量的访问有两种情况 (1)写操作,把一个值写入变量对应的存储单元中 (2)读操作,读出变量对应存储单元中...
2020-07-04 19:09:13
101
原创 数组
数组:一组具有相同数据类型的数据的集合 一维数组 二维数组 字符数组 一维数组 定义格式: 类型说明符 数组名[整型表达式]; "类型说明符":指定数组元素的类型,任意C语言合法的类型都可以 "数组名":C语言标识符 "整型表达式":指定数组元素的个数。 如: int a[10]; 一维数组在内存中的存放: ...
2020-07-04 16:32:06
321
原创 函数
函数的主要内容: 函数的概念,设计,实现(定义) 变量的作用域和生存期 递归函数 1,函数的概念: function,功能模块 在C语言中,函数是完成某个特定功能的指令序列的封装。 (1)函数可以实现代码复用 (2)函数有利于实现模块化设计 (3)函数可以灵活的组合调用 "函数就是实现某个功能的指令序列" 函数的设计: 需求分析: 你得知道完成什么事情 ...
2020-07-04 16:19:15
115
原创 C程序的组成
C程序的组成 C程序是由一个或多个.c和.h文件组成 .c : c源代码文件 .h :c的头文件 1,.c(c源代码文件)的组成 (1)预处理命令。以"#"开头的行,在编译之前预先做的一些工作 a.#include 文件包含命令 #include <stdio.h> #include "xxx.h" 上面两个都是文件包含命令,其作用是找到相应的文件,然后把该文件 的...
2020-07-04 15:44:51
1988
原创 循环
C循环种类 goto语句与if构成循环 while do~while for 1,goto语句: 无条件跳转语句 goto 语句标号; "语句标号":在C语言中,把一个名字(标识符)与某一行的地址相关联。 格式为在一行的开始处定义一个名字,然后加一个':' loop: n++; goto loop; 作用: (1)与if语句向上跳转构成循环结构...
2020-07-04 15:30:06
159
原创 选择(分支)
一、if语句 有三种基本形式 (1)if(表达式) 语句 只要"表达式"的值为真(非0),就执行语句 "表达式":任意的C语言合法的表达式都可以 语句: 单语句,一个分号;的语句 复合语句,用{}把多条语句括起来 eg: int a=200; int b=100; if(a&...
2020-07-04 15:22:58
591
原创 表达式与运算符
一、什么是表达式? 表达式就是表达某种意思的式子。 在C语言中,表达式用运算符连接操作数的式子。 广义上讲,有;的就是语句,没有分号的就是表达式。 二、C语言中的运算符: (1)算术运算符: 双目运算符(需要连接两个操作数),结合性:左->右 * / % + - ★注意整数/整数,其结果还是整数,若想要结果为实数,可在分子*1.0 隐式类型转换:不同数据类型之间进行运算时,其结果会转化为精度高的那个数据类型。 ...
2020-07-04 10:53:52
1175
原创 数据类型
一、C语言数据类型 基本类型:系统分配给基本类型的变量的内存空间大小固定 整型 (unsigned) short 2字节 (unsigned) int 4字节 (unsigned) long 4字节 实型(浮点型) 单精度实型 float 4字节 双精度实型 double 8字节...
2020-07-04 10:52:17
132
转载 运算符优先级和结合性
所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁。这个其实我们在小学学算术的时候就学过,如1+4÷2。但是C语言中的运算符已经远不止四则运算中的加减乘除了,还有其他很多运算符。当它们出现在同一个表达式中时先计算谁后计算谁呢?所以本节还是有必要讲一下的。最后我还会将所有运算符展示出来,然后告诉你哪个优先级高、哪个优先级低。首先不需要专门记忆,也没有必要。因为作为初学者,哪个优先级高、哪个优先级低我们很难记住。就算死记硬背记住了,时间长不用也会忘记。所以当一个表达式中有多个运算符时,如果不知道
2020-07-04 10:45:47
1693
原创 二叉树
树的概念树(Tree)是n(n>=0)个结点的有限集合,在任何一颗非空树中:(1)有且仅有一个特定称为根(root)的结点;(2)当n>1时,其余节点可以分为m个互不相交的有限集T1,T2...Tm;其中每个集合本身又是一个树,并且称为根的子树(subtree)。树是一种递归的数据结构,树作为一种逻辑结构,同时也是一种分层结构,树的根结点没有前驱节点,而其他结点都有...
2020-05-08 11:22:27
284
原创 class类实现栈、队列
在c++中,STL里有stack和queue两个封装函数,一直不知道是怎么实现的,直到在网上看到了class类,然后自己写了一下特此记录栈class stack{ public: stack(); void pop(); void push(char c); char top(); void show(); bool empty(){ return _to...
2020-02-25 13:57:31
413
原创 数据结构之链表
链表在介绍链表之前首先说一下数组,因为链表跟数组的功能类似,都是用来存储数据的,但是数组却要提前分配大小,如果太大,则造成了内存资源的浪费,而太小了又会造成数据的丢失,那有没有一种存储结构是按需分配,即输入多少数据就相应的分配多少空间来存储它们,链表便完全解决了这种数据跟空间不匹配的问题。链表的概念链表就是由一个或多个含有指针成员的结构体,通过其指针成员的地址指向,形成了一种逻辑上的链...
2020-02-21 12:03:10
463
原创 双向广搜——DBFS
双向:简而言之就是从起点(正向搜索)和终点(逆向搜索)同时开始搜索,当两个搜索产生的一个子状态相同时就结束搜索。通常有两种实现方法:1、用一个队列来储存子状态,起点和终点先后入队,正向搜索和逆向搜索交替进行,两个方向的搜索交替扩展子状态。直到两个方向的搜索产生相同的子状态结束。2、两个方向的搜索虽然是交替扩展子状态的。但是两个方向生成的子状态的速度不一定平衡。所以,可以每次选择子状态数...
2019-08-14 16:23:15
923
原创 Floyd
解决最短路径问题有几个出名的算法:1.dijkstra算法,最经典的单源最短路径算法2.bellman-ford算法,允许负权边的单源最短路径算法3.spfa,其实是bellman-ford+队列优化,其实和bfs的关系更密一点4.floyd算法,经典的Floyd算法又叫做插点法Floyd算法: Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图...
2019-08-14 11:30:46
161
原创 Dijkstra
相对于暴力简单的Floyd算法,Dijkstra算法更为有用且复杂度较为合理--O(N^2)。今天就为大家介绍一下这个算法。Dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。算法思路:Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一...
2019-08-14 10:07:45
287
原创 链式前向星存图
我们首先来看一下什么是前向星.前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.用len[i]来记录所有以i为起点的边在数组中的存储长度.用head[i]记录以i为边集在数组中的第一个存储位置.那么对于下图:我们输入边的顺序为:...
2019-08-12 10:36:21
335
原创 图论--SPFA算法
算法优点: 1.时间复杂度比普通的Dijkstra和Ford低。 2.能够计算负权图问题。 3.能够判断是否有负环(即:每跑一圈,路径会减小,所以会一直循环跑下去)。算法思想:我们用数组记录每个结点的最短路径估计值,用邻接表来存储图G。 我们采取的方法是动态逼近法: ...
2019-08-12 10:33:42
304
原创 AStar(A*)算法
A* 寻路算法搜索区域(The Search Area)我们假设某人要从A点移动到B点,但是这两点之间被一堵墙隔开。如图1,绿色是A,红色是B,中间蓝色是墙。图1你应该注意到了,我们把要搜寻的区域划分成了正方形的格子。这是寻路的第一步,简化搜索区域,就像我们这里做的一样。这个特殊的方法把我们的搜索区域简化为了2维数组。数组的每一项代表一个格子,它的状态...
2019-08-10 20:08:01
2280
原创 DFS——深度优先搜索法
深度优先搜索属于图算法的一种,英文缩写为DFS即大法师,嘻嘻嘻是Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.举例说明之:下图是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)...
2019-08-10 20:01:47
623
3
原创 并查集模板
题目来源:https://www.luogu.org/problem/P3367 (洛谷P3367)题目描述如题,现在有一个并查集,你需要完成合并和查询操作。输入格式第一行包含两个整数N、M,表示共有N个元素和M个操作。接下来M行,每行包含三个整数Zi、Xi、Yi当Zi=1时,将Xi与Yi所在的集合合并当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输...
2019-08-10 19:31:16
79
原创 高精度模板
#include<stdio.h>#include<string>#include<string.h>#include<iostream>using namespace std;//compare比较函数:相等返回0,大于返回1,小于返回-1int compare(string str1,string str2){ if(st...
2019-08-10 19:22:38
135
原创 BFS——广度优先搜索法
BFS的基本思想是:首先访问初始点v并将其标志为已经访问。接着通过邻接关系将邻接点入队。然后每访问过一个顶点则出队。按照顺序,访问每一个顶点的所有未被访问过的顶点直到所有的顶点均被访问过。广度优先遍历类似与层次遍历。其特点是尽可能先对横向进行搜索,从指的出发点,按照该点的路径长度由短到长的顺序访问图中各顶点。利用队列先进先出的性质,从起点开始,将一步能到达的点全部存入队列,然后将队列中...
2019-08-10 17:20:19
246
原创 子集生成和组合问题
子集一个包含n个元素的集合,它的子集(包含空集)的个数为个。这样我们发现,子集的状况可以用二进制的概念进行对照是最直观的。例如:n=3的集合{,,},他的子集和二进制数的关系如下表;子集 ∅ , , , ,, 二进制数 000 001 010 011 100 101 110 1...
2019-08-10 16:05:53
277
原创 递归和排列
排列和组合问题n个数的全排列:n!n个数中任意m个数的全排列:n个数中任意m个数的组合:用STL输出全排列:先用sort得到序列最小字典序的排序,然后可以调用next_permutation()得到下一字典序排列。还有一种是pre_permutation(),是可以输出当前字典序的前一字典序排列。递归定义递归是通过嵌套来实现的,一般会用数学中的递推方程来讲解递归的...
2019-08-10 15:18:55
230
原创 康托展开
定义康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。原理介绍X = A[0] * (n-1)! + A[1] * (n-2)! + … + A[n-1] * 0!A[i] 指的是位于位置i后面的数小于A[i]值的个数,后面乘的就是后面还有多少个数的阶乘说明 :这个算出来的数康拖展...
2019-08-10 09:38:05
127
原创 STL之五:set和map
setset就是集合。STL的set用二叉搜索树实现,集合中每个元素只出现一次,并且是排好序的。访问元素的时间复杂度是O()。set和map在竞赛中应用广泛,特别是需要使用二叉搜索树处理数据的题目,用set和map可以极大地简化代码。set的有关操作set<Type> a; //定义Type类型的set,aa.insert(item); //把item放入se...
2019-08-08 15:33:20
414
原创 STL之四:链表和list
STL的list是数据结构的双向链表,他的内存空间可以是不连续的,通过指针来进行数据的访问,它可以高效率的在任意地方删除和插入,插入和删除的时间复杂度都是O(1)。vector:插入和删除操作少,随机访问元素频繁。list:插入和删除频繁,随机访问较少。在vector插入一个元素之后,这个元素后面的地址全部会改变,而list不会,地址不会连续。由于地址不是连续的,所以当用迭代器访问...
2019-08-08 11:33:39
180
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人