- 博客(183)
- 资源 (1)
- 收藏
- 关注
原创 模板(模板函数+模板类)
template函数返回类型 函数名(形参列表)函数体;注意模板参数表可以有多个,用逗号分开,但是不能为空模板类型参数(template type parameter)代表一种类型,由关键字 class 或 typename)后加一个标识符构成,在这里两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户定义的类型。函数模板根据一组实际类型构造出独立函数的过程通常是隐式发生的,称为模板实参推演(template。
2023-10-26 17:44:23
295
原创 c++指针详解
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。我们将内存中字节的编号称为地址(&,Address)或指针(*,Pointer)。地址从 0开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB。定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号格式为: datatype * name;
2023-10-19 20:53:10
313
原创 结构体和联合体详解
既然结构体是一种数据类型,那么就可以像其他基本数据类型一样用它来定义变量。结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据需要存储空间。int s_age;int main()//在.c文件中 struct Student stu1;return 0;
2023-10-19 15:38:22
304
原创 平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等
平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树):树上任一结点的左子树和右子树的高度之差不超过1。 结点的平衡因子=右子树高-左子树高。 平衡二叉树结点的平衡因子的值只可能是−1、0或1。
2022-12-25 22:56:07
1019
原创 二叉排序树详解及实现
二叉排序树(Binary Sorting Tree)又称二叉搜索树(Binary Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。 二叉排序树的定义: 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同; 二叉排序树或者是空树或者是具有下述性质的二叉数, ①其左子树上所有结点的数据值均小于根结点的数据值; ②右子树上所有结点的数据值均大于根结点的数据值; ③左子树和右子树又各是一棵
2022-12-18 22:22:50
1235
原创 哈夫曼树,哈夫曼编码及应用——(代码实现)
假设有n各权值{w1,w2,…,wn},构造一棵有n各叶子节点的二叉树,每个叶子节点带权wk,每个叶子的路径长度为lk,WPL=w1l1+w2l2+…+wn*ln,记带权路径长度WPL最小的二叉树为哈夫曼树,也称其为最优二叉树。
2022-12-17 00:20:14
1716
原创 求集合A的子集(图+案例)
子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。 符号语言:若∀a∈A,均有a∈B,则A⊆B。
2022-12-12 19:28:51
493
原创 求n个数的全排列(图+案例))
全排列顾名思义,就是对一系列的单个字符进行排列,所有的排列结果就称为全排列, 例如“1,2,3”,其全排列就有:“123”、“132”,“213“、”231“、312”,“321”,有6种, 可以发现其全排列的个数就是n!。
2022-12-12 18:20:59
1025
原创 Prim算法实现最小生成树
Prim算法求最小生成树:1. 从任意一个顶点(假设选1)开始构造生成树,首先将顶点1加入生成树中,用一个一维数组book标记那些顶点已经加入到了生成树中。 2. 用数组dis记录生成树到各个顶点的距离。最初生成树只有1号顶点,有直连边时,数组dis中存储的就是1号顶点到该顶点的边的权值,没有直连边的时候就是无穷大(INT_MAX),即初始化数组。 3. 从数组dis中选出离生成树最近的顶点(假设为顶点j)加入到生成树中(在数组dis中的最小值)。再以j为中间点,更新生成树到每一个非树顶点的距离,如果
2022-11-19 12:07:21
15388
2
原创 Kruskal求解无向图的最小生成树
Krusal算法,用来解决图的最小生成树问题。 该算法的核心思想是: ①首先按照边的权值进行从小到大的排序。 ②循环地从剩余边中选择权值较小且不会产生回路的边,加入生成树中,直到加入了n-1条边为止。
2022-11-18 13:29:01
772
原创 C++——pair用法总结
std::pair 是类模板,提供在一个单元存储两个相异类型对象的途径。简单描述,即pair可以将2个数据组合为一个数据,当然pair的返回值也可以是2个数据。
2022-11-16 17:30:35
7657
原创 动态内存分配——malloc,calloc,realloc,free
在c语言的编写过程中,为了使程序有更好的移植性,也为了使程序编写起来更加方便,当需要额外虚拟内存时,会使用**动态内存分配器**(dynamic memory allocator)。动态内存分配器维护着进程的虚拟内存区域:**堆区**。
2022-11-11 21:40:39
940
原创 什么是线程及线程相关知识
线程是进程里面的一个执行上下文或者执行序列。执行序列就是一组有序指令的集合——函数。在线程模式下,一个进程至少有一个线程(主线程,即main方法代表的执行序列),但也可以有多个线程。也就是说,一个进程可以同时拥有多个执行序列。
2022-11-10 12:29:53
813
原创 C++11并发编程——多线程
C++11 引入了 thread 类,降低了使用多线程的复杂度,原先使用多线程只能用系统的 API,无法解决跨平台问题,代码平台的改变,对应多线程代码也必须要修改。 在 C++11 中只需使用语言层面的 thread 可以解决这个问题。编写并发程序需引入头文件。
2022-11-09 14:43:11
2287
原创 多线程——信号量、条件变量、互斥量互斥锁
信号量是所有原语里面功能最强大的。它不光是一个通信原语,还是一个同步原语。多线程——信号量、条件变量、互斥量互斥锁
2022-11-05 12:20:01
3863
原创 三种方法求图中连通分量的个数(BFS、DFS、并查集)
无向图G的极大连通子图称为G的连通分量( Connected Component)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。
2022-11-04 14:53:01
11696
原创 图的广度优先搜索
BFS:以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点再访问它们相邻的未被访问的顶点,直到所有顶点都被访问过,遍历结束。
2022-10-29 22:23:43
906
原创 Bellman-Ford(单源最短路径)——队列优化
Bellman-Ford(单源最短路径)——队列优化初始时将源点加入队列。每次从队首取出一个顶点,并对与其相邻的所有顶点进行松弛操作,若某个相邻的顶点松弛成功且这个相邻的顶点不在队列中,则对当前顶点处理完毕后立即出队,并对新的队首元素进行如上操作,直到队列为空时算法结束。
2022-10-17 18:33:45
911
原创 Bellman-Ford解决单源最短路径(负权边)
Bellman-Ford解决单源最短路径(负权边)。算法的基本思想为:对所有的边进行n-1次“松弛”操作。所谓“松弛”操作就是每次加入新的节点i,将节点i作为中间节点,判断源点—>节点i—>各个节点的最短距离 较之于 上一次的最短距离是否会有更新。
2022-10-16 17:36:10
819
原创 Dijkstra算法——单源最短路径(指定一个节点(源点)到其余各个顶点的最短路径)
Dijkstra算法——单源最短路径。每次找到距离源点最近的一个节点,然后以该节点为中心进行扩展,最终得到源点到其余所有点的最短路径。
2022-10-15 15:33:09
9032
原创 异或(^)小知识
异或 是一种位运算,根据其特性也称为不进位相加 异或(相同为0,不同为1) 根据异或的这一特性,可以很容易的得到: N^N=0 N^0=N
2022-10-13 14:18:11
96
原创 unordered_set的理解与使用
unordered_set 是含有 Key 类型唯一对象集合的关联容器。搜索、插入和移除拥有平均常数时间复杂度。在内部,元素并不以任何特别顺序排序,而是组织进桶中。元素被放进哪个桶完全依赖其值的哈希。这允许对单独元素的快速访问,因为哈希一旦确定,就准确指代元素被放入的桶。不可修改容器元素(即使通过非 const 迭代器),因为修改可能更改元素的哈希,并破坏容器。
2022-10-07 15:43:31
3344
原创 桶排序(图解详细过程)
基数算法(Radix Sort)(桶排序):按照多个关键字进行排序的方法 将所有数据从最低位开始调整,例如个位、十位、百位等等,判断需要几次,需要通过数据中的最大值的位数去决定。 例如,数据中的最大值史999,则所有数据需要进行个位、十位、百位的排序。 可以判断出这种排序适合于所有的数据位数差别不大的情景。桶:队列(先进先出) 10个桶(0-9)时间复杂度:O(kn)空间复杂度:O(n) k是关键字的最大位数稳定性:稳定(没有有跳跃式的交换数据,没有交换数据)
2022-10-04 21:56:12
380
原创 快速排序(递归与非递归)详解(图示)
快速排序:(平均性能最快) 1.在待排序数据中选取一个数据作为基准(选择第一个数据) 2.使用基准数据将剩余的数据分成两部分,左部分(不一定有序)都比基准小,//从后向前找比基准值小的数据 右部分(不一定有序)都比基准大,从前往后找比基准值大的数据 前两步封装成函数 OneQuick();一次快排 3.分别在对左部分(至少有两个数据时)和右部分(至少有两个数据时)数据进行快速排序(递归)
2022-10-04 21:36:57
513
原创 选择排序具体思路及实现(图解)
选择排序: 每一趟循环都从待排序序列中找到最小值,和待排序序列的第一个值进行交换,从而让待排序序列的长度-1, 直到待排序序列中只剩下一个值,则全部有序。
2022-10-03 22:23:56
213
原创 堆排序具体思路以及实现(图解)
堆排序: 可以将数据看做一个完全二叉树,然后将其调整为大跟堆(升序),此时,根节点就可以保证是数据中的最大值, 接下来,将根节点与最后一个节点交换,这时可以将最后一个节点剔除出排序(因为最后一个节点值已经有序),完全二叉树的节点个数 -= 1, 直到这颗完全二叉树的节点个数为1时,则完全有序。
2022-10-03 22:17:40
587
原创 递归实现合并排序
递归实现合并排序:其中,算法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
520
原创 unordered_map详解
unordered_map 是关联容器,含有带唯一键的键(key;it->first)-值(value;it->second) pair 。搜索、插入和元素移除拥有平均常数时间复杂度。 元素在内部不以任何特定顺序排序,而是组织进桶中。元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。
2022-09-13 12:41:39
16415
原创 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
2022-09-08 18:09:48
325
C++仿写指针指针(auto-ptr,unique-ptr,shared-ptr,weak-ptr)
2023-10-17
平衡二叉树的所有操作(全)
2022-12-25
二叉排序树的相关代码(插入,删除,创建,遍历)
2022-12-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人