自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(183)
  • 资源 (1)
  • 收藏
  • 关注

原创 模板(模板函数+模板类)

template函数返回类型 函数名(形参列表)函数体;注意模板参数表可以有多个,用逗号分开,但是不能为空模板类型参数(template type parameter)代表一种类型,由关键字 class 或 typename)后加一个标识符构成,在这里两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户定义的类型。函数模板根据一组实际类型构造出独立函数的过程通常是隐式发生的,称为模板实参推演(template。

2023-10-26 17:44:23 157

原创 c++指针详解

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。我们将内存中字节的编号称为地址(&,Address)或指针(*,Pointer)。地址从 0开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB。定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号格式为: datatype * name;

2023-10-19 20:53:10 223

原创 结构体和联合体详解

既然结构体是一种数据类型,那么就可以像其他基本数据类型一样用它来定义变量。结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据需要存储空间。int s_age;int main()//在.c文件中 struct Student stu1;return 0;

2023-10-19 15:38:22 206

原创 RAII与智能指针

unique 是独特的、唯一的意思,故名思议,unique ptr 可以“独占”地拥有它所指向的对象,是一种定义在

2023-10-17 10:25:20 190

原创 平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树):树上任一结点的左子树和右子树的高度之差不超过1。 结点的平衡因子=右子树高-左子树高。 平衡二叉树结点的平衡因子的值只可能是−1、0或1。

2022-12-25 22:56:07 858 1

原创 二叉排序树详解及实现

二叉排序树(Binary Sorting Tree)又称二叉搜索树(Binary Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。 二叉排序树的定义: 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同; 二叉排序树或者是空树或者是具有下述性质的二叉数, ①其左子树上所有结点的数据值均小于根结点的数据值; ②右子树上所有结点的数据值均大于根结点的数据值; ③左子树和右子树又各是一棵

2022-12-18 22:22:50 900

原创 哈夫曼树,哈夫曼编码及应用——(代码实现)

假设有n各权值{w1,w2,…,wn},构造一棵有n各叶子节点的二叉树,每个叶子节点带权wk,每个叶子的路径长度为lk,WPL=w1l1+w2l2+…+wn*ln,记带权路径长度WPL最小的二叉树为哈夫曼树,也称其为最优二叉树。

2022-12-17 00:20:14 1484

原创 求集合A的子集(图+案例)

子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。 符号语言:若∀a∈A,均有a∈B,则A⊆B。

2022-12-12 19:28:51 347

原创 求n个数的全排列(图+案例))

全排列顾名思义,就是对一系列的单个字符进行排列,所有的排列结果就称为全排列, 例如“1,2,3”,其全排列就有:“123”、“132”,“213“、”231“、312”,“321”,有6种, 可以发现其全排列的个数就是n!。

2022-12-12 18:20:59 593

原创 Targin——图的割边(桥)

割边,也称为桥,即在一个无向连通图中,如果删除某条边后,图不再连通。

2022-11-21 09:34:03 186

原创 图的割点(解释及实现)

在一个无向连通图中,如果删除某个顶点后,图不再连通(任意两顶点之间不能相互到达),我们称这样的顶点为割点。

2022-11-20 22:35:45 1854 1

原创 Prim算法实现最小生成树

Prim算法求最小生成树:1. 从任意一个顶点(假设选1)开始构造生成树,首先将顶点1加入生成树中,用一个一维数组book标记那些顶点已经加入到了生成树中。 2. 用数组dis记录生成树到各个顶点的距离。最初生成树只有1号顶点,有直连边时,数组dis中存储的就是1号顶点到该顶点的边的权值,没有直连边的时候就是无穷大(INT_MAX),即初始化数组。 3. 从数组dis中选出离生成树最近的顶点(假设为顶点j)加入到生成树中(在数组dis中的最小值)。再以j为中间点,更新生成树到每一个非树顶点的距离,如果

2022-11-19 12:07:21 10292 1

原创 Kruskal求解无向图的最小生成树

Krusal算法,用来解决图的最小生成树问题。 该算法的核心思想是: ①首先按照边的权值进行从小到大的排序。 ②循环地从剩余边中选择权值较小且不会产生回路的边,加入生成树中,直到加入了n-1条边为止。

2022-11-18 13:29:01 619

原创 C++——pair用法总结

std::pair 是类模板,提供在一个单元存储两个相异类型对象的途径。简单描述,即pair可以将2个数据组合为一个数据,当然pair的返回值也可以是2个数据。

2022-11-16 17:30:35 5544

原创 动态内存分配——malloc,calloc,realloc,free

在c语言的编写过程中,为了使程序有更好的移植性,也为了使程序编写起来更加方便,当需要额外虚拟内存时,会使用**动态内存分配器**(dynamic memory allocator)。动态内存分配器维护着进程的虚拟内存区域:**堆区**。

2022-11-11 21:40:39 680

原创 什么是线程及线程相关知识

线程是进程里面的一个执行上下文或者执行序列。执行序列就是一组有序指令的集合——函数。在线程模式下,一个进程至少有一个线程(主线程,即main方法代表的执行序列),但也可以有多个线程。也就是说,一个进程可以同时拥有多个执行序列。

2022-11-10 12:29:53 586

原创 C++11并发编程——多线程

C++11 引入了 thread 类,降低了使用多线程的复杂度,原先使用多线程只能用系统的 API,无法解决跨平台问题,代码平台的改变,对应多线程代码也必须要修改。 在 C++11 中只需使用语言层面的 thread 可以解决这个问题。编写并发程序需引入头文件。

2022-11-09 14:43:11 1946

原创 多线程——信号量、条件变量、互斥量互斥锁

信号量是所有原语里面功能最强大的。它不光是一个通信原语,还是一个同步原语。多线程——信号量、条件变量、互斥量互斥锁

2022-11-05 12:20:01 2173

原创 三种方法求图中连通分量的个数(BFS、DFS、并查集)

无向图G的极大连通子图称为G的连通分量( Connected Component)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。

2022-11-04 14:53:01 7644

原创 图的广度优先搜索

BFS:以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点再访问它们相邻的未被访问的顶点,直到所有顶点都被访问过,遍历结束。

2022-10-29 22:23:43 587

原创 图的深度优先遍历求最短路径

dfs

2022-10-29 13:09:57 1960

原创 Bellman-Ford(单源最短路径)——队列优化

Bellman-Ford(单源最短路径)——队列优化初始时将源点加入队列。每次从队首取出一个顶点,并对与其相邻的所有顶点进行松弛操作,若某个相邻的顶点松弛成功且这个相邻的顶点不在队列中,则对当前顶点处理完毕后立即出队,并对新的队首元素进行如上操作,直到队列为空时算法结束。

2022-10-17 18:33:45 631

原创 Bellman-Ford解决单源最短路径(负权边)

Bellman-Ford解决单源最短路径(负权边)。算法的基本思想为:对所有的边进行n-1次“松弛”操作。所谓“松弛”操作就是每次加入新的节点i,将节点i作为中间节点,判断源点—>节点i—>各个节点的最短距离 较之于 上一次的最短距离是否会有更新。

2022-10-16 17:36:10 633

原创 Dijkstra算法——单源最短路径(指定一个节点(源点)到其余各个顶点的最短路径)

Dijkstra算法——单源最短路径。每次找到距离源点最近的一个节点,然后以该节点为中心进行扩展,最终得到源点到其余所有点的最短路径。

2022-10-15 15:33:09 7282

原创 Floyd_Warshall算法详解及实现(多源最短路径)

Floyd_Warshall算法详解及实现

2022-10-14 19:24:37 1764

原创 异或(^)小知识

异或 是一种位运算,根据其特性也称为不进位相加 异或(相同为0,不同为1) 根据异或的这一特性,可以很容易的得到: N^N=0 N^0=N

2022-10-13 14:18:11 65

原创 unordered_set的理解与使用

unordered_set 是含有 Key 类型唯一对象集合的关联容器。搜索、插入和移除拥有平均常数时间复杂度。在内部,元素并不以任何特别顺序排序,而是组织进桶中。元素被放进哪个桶完全依赖其值的哈希。这允许对单独元素的快速访问,因为哈希一旦确定,就准确指代元素被放入的桶。不可修改容器元素(即使通过非 const 迭代器),因为修改可能更改元素的哈希,并破坏容器。

2022-10-07 15:43:31 2764

原创 桶排序(图解详细过程)

基数算法(Radix Sort)(桶排序):按照多个关键字进行排序的方法 将所有数据从最低位开始调整,例如个位、十位、百位等等,判断需要几次,需要通过数据中的最大值的位数去决定。 例如,数据中的最大值史999,则所有数据需要进行个位、十位、百位的排序。 可以判断出这种排序适合于所有的数据位数差别不大的情景。桶:队列(先进先出) 10个桶(0-9)时间复杂度:O(kn)空间复杂度:O(n) k是关键字的最大位数稳定性:稳定(没有有跳跃式的交换数据,没有交换数据)

2022-10-04 21:56:12 251

原创 快速排序(递归与非递归)详解(图示)

快速排序:(平均性能最快) 1.在待排序数据中选取一个数据作为基准(选择第一个数据) 2.使用基准数据将剩余的数据分成两部分,左部分(不一定有序)都比基准小,//从后向前找比基准值小的数据 右部分(不一定有序)都比基准大,从前往后找比基准值大的数据 前两步封装成函数 OneQuick();一次快排 3.分别在对左部分(至少有两个数据时)和右部分(至少有两个数据时)数据进行快速排序(递归)

2022-10-04 21:36:57 428

原创 选择排序具体思路及实现(图解)

选择排序: 每一趟循环都从待排序序列中找到最小值,和待排序序列的第一个值进行交换,从而让待排序序列的长度-1, 直到待排序序列中只剩下一个值,则全部有序。

2022-10-03 22:23:56 148

原创 堆排序具体思路以及实现(图解)

堆排序: 可以将数据看做一个完全二叉树,然后将其调整为大跟堆(升序),此时,根节点就可以保证是数据中的最大值, 接下来,将根节点与最后一个节点交换,这时可以将最后一个节点剔除出排序(因为最后一个节点值已经有序),完全二叉树的节点个数 -= 1, 直到这颗完全二叉树的节点个数为1时,则完全有序。

2022-10-03 22:17:40 496

原创 递归实现合并排序

递归实现合并排序:其中,算法merge合并2个排好序的数组到新的数组b中,然后由算法copy将合并后的数组段再复制回数组a中。算法merge和copy显然可以在O(n)时间内完成,因此合并排序算法对n个元素进行排序,在最坏情况下所需的计算时间T(n)=2T(n/2)+O(n)(n>1)解此递归方程可知T(n)=)(nlogn)。

2022-09-25 22:28:49 451

原创 希尔(shell)排序(缩小增量排序)

希尔(shell)排序:缩小增量排序

2022-09-24 22:05:24 318

原创 直接插入排序

直接插入排序。

2022-09-16 14:19:03 216

原创 哈希的应用拓展(一致性哈希,虚拟节点,布隆过滤器)

哈希的应用拓展(一致性哈希,虚拟节点,布隆过滤器)

2022-09-14 14:19:53 213

原创 unordered_map详解

unordered_map 是关联容器,含有带唯一键的键(key;it->first)-值(value;it->second) pair 。搜索、插入和元素移除拥有平均常数时间复杂度。 元素在内部不以任何特定顺序排序,而是组织进桶中。元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。

2022-09-13 12:41:39 13449

原创 简单快速排序----桶排序

简单快速排序——桶排序。

2022-09-09 18:35:43 116

原创 哈希详解与实现1(哈希是什么以及解决哈希冲突)

【代码】哈希详解与实现1(哈希是什么以及解决哈希冲突)

2022-09-09 10:44:16 442

原创 二叉树的序列化与反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

2022-09-08 18:09:48 262

原创 二叉树的先序遍历(递归与非递归)

二叉树的先序遍历(递归与非递归)

2022-09-08 13:32:21 176

C++仿写指针指针(auto-ptr,unique-ptr,shared-ptr,weak-ptr)

智能指针其实是一个类,是对普通指针进行了封装,将其作为参数传入智能指针的构造函数实现绑定。只不过通过运算符重载让它“假装”是一个指针,也可以进行解引用等操作。既然智能指针是一个类,对象都存在于栈上,那么创建出来的对象在出作用域的时候(函数或者程序结束)会自己消亡,所以在这个**类中的析构函数中写上delete**就可以完成智能的内存回收,避免忘记释放指针指向的内存地址造成内存泄漏。。 C11 里面的四个智能指针: 1. auto ptr, 2. unique ptr, 3. shared ptr, 4. weak ptr 下面的代码对这四个智能指针进行一一仿写:

2023-10-17

平衡二叉树的所有操作(全)

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树):树上任一结点的左子树和右子树的高度之差不超过1。平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等。 在二叉排序树中插入新结点后,如何保持平衡? 查找路径上的所有结点都有可能受到影响。 从插入点往回找到第一个不平衡结点,调整以该结点为根的子树。 每次调整的对象都是“最小不平衡子树”。 1)LL平衡旋转(右单旋转)。 由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。 总结为如下三步: ①newroot指向B ②A结点向右下旋转成为B的右子树的根结点,而B的原右子树则作为A结点的左子树 ③A的左孩子B向右上旋转代替A成为根结点

2022-12-25

二叉排序树的相关代码(插入,删除,创建,遍历)

二叉排序树(Binary Sorting Tree)又称二叉搜索树(Binary Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。 二叉排序树的定义: 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同; 二叉排序树或者是空树或者是具有下述性质的二叉数, ①其左子树上所有结点的数据值均小于根结点的数据值; ②右子树上所有结点的数据值均大于根结点的数据值; ③左子树和右子树又各是一棵二叉排序树。 二叉排序树用中序遍历就可以得到由小到大的有序序列

2022-12-18

C++仿写string类

使用C++语言仿写STL中的string

2022-07-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除