- 博客(36)
- 收藏
- 关注
原创 读程序虚函数
在基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义。虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型的顺序,都必须与基类中的原型完全相同。虚函数的定义是在基类中进行的,它是在基类中需要定义为虚函数的成员函数的声明中冠以关键字virtual,从而提供一种接口界面。
2024-12-12 20:33:11
190
原创 读程序题哇咔咔
t相当于取的是这个数组的首地址,&t+1就变成数组后面一个空间的首地址嘞。通俗的理解嗨嗨嗨:t指的是第一行的首地址,t+1就变成第二行了。然后char数组和string一样,输出整个字符串(**t)*t指的是第一个的首地址,*t+1就变成第二个嘞;
2024-12-06 21:29:05
275
1
原创 归并排序111
每趟归并的时间复杂度是O(n),所有总的时间复杂度是O(nlog2n)因此归并的趟数是h-1,叶子结点数也就是序列长度为n,第h层最多。空间复杂度主要取决于辅助数组B,O(n)二路归并的归并树,形似一颗倒立的二叉树。归并就是把两个或多个序列合成一个。这是二路归并,将两个合成一个。个节点,所以h-1=
2024-12-04 22:05:16
179
原创 选择排序111
将n个关键字序列构造成大根堆,即可知序列的最大值就是根的值,输出堆顶元素后(用最后一个元素代替大根堆),将剩余元素调整成新的大根堆,再次输出堆顶元素,循环此过程,直到序列排序完成。2、L(i)=孩子最大值,大根堆。每一趟将堆顶元素加入有序序列(与待排序序列的最后一个元素交换)树高为h,元素在第i层,关键字对比不超过2(h-i)次。时间复杂度:o(n^2)
2024-12-03 22:23:47
162
原创 快速排序111
快速排序:选取一个基准元素pivot(通常是首元素),通过一趟排序将排序表划分为两个部分,左边的所有元素小于pivot,右边的元素都大于pivot,确定pivot最终的位置,这个过程称为一次划分,递归的对上述操作进行重复,直到每部分只剩一个元素或者为空,即所有元素都已经排到应到的位置;快速排序是所有内部排序算法中平均性能最优的。
2024-12-02 21:13:24
167
原创 冒泡排序111
从后往前(也可以从前往后)两两比较相邻元素值,假设我们要得到一个递增序列,则将较小的值交换到前面,因此,每一次冒泡排序都可以“冒”一个最小的值,下一次排序的比较次数-1;如果在一次排序过程中没有元素交换,则证明序列已经有序,可以停止。链表也可以用冒泡排序。
2024-12-01 22:06:12
118
原创 希尔排序111
先取一个小于n的增量d1,把表中的记录分成小组,所有距离为d1的记录视为一组,先在小组内进行直接插入排序;然后取一个小于d1的增量d2重复上述操作;直到dt=1,即对整个序列进行直接插入排序,但此时序列已经具有一定的有序性,因此效率变高;++i是依次对所有小组进行排序,与手算思路有所区别,是依次对每一个元素,与该元素前面已经排好的小组序列进行排序;手算可以先对一个小组进行整体排序;最外层的循环是,每一次增量的变化后进行再一次插入排序。希尔排序只能基于顺序表(随机访问特性),且算法不稳定。
2024-12-01 21:39:37
110
原创 插入排序111
非常简单直观的一个排序算法啦啦将每个待排序的记录按照关键字大小插入前面已经排好的序列中,直到全部记录插入完成分为三个算法:直接插入排序,这版插入排序,希尔排序。
2024-12-01 21:11:09
422
原创 平衡二叉树
为了避免树的高度增长过快,从而影响二叉排序树的性能,因此在删除和插入过程中,要保证左右子树高度差不超过1;这样的树称为二叉排序树(AVL树);定义左子树和右子树的高度差为该节点的平衡因子,因此平衡因子的值为0,1,-1;
2024-12-01 21:09:26
141
原创 哈希HASH表
哈希表,一种数据结构,关键字与存储地址直接相关哈希函数:Addr=H(key)(p是小于或等于表长的最大素数)不同关键字通过函数映射到同一个值,称他们为“同义词”通过函数确定的 位置已经存放其他元素,这种情况称为冲突。
2024-11-28 21:51:20
247
原创 读程序题(调用构造/析构函数的次数)
总结:只有涉及到内存分配的时候,才会调用构造函数。只定义指针而不给指针赋值,则不涉及内存分配,不调用构造函数。*e[2]:定义含有两个指向类对象的指针的数组,但没有进行实际的内存分配,所以不调用构造函数。**d:定义指向类对象指针的指针,但没有进行实际的内存分配,所以不调用构造函数。b[2]:定义含有两个元素的数组,实际上定义两个对象,所以调用2次构造函数。*c:定义指向类对象的指针,但没有进行实际的内存分配,所以不调用构造函数。*g=new MyClass [2],涉及到内存的分配,调用2次构造函数。
2024-11-27 22:19:23
219
原创 二叉排序树
二叉排序树的特点:左子树所有的关键字<根<右子树所有结点的关键字任意一棵子树都是二叉排序树(左右子树都是二叉排序树)中序遍历二叉排序树得到一个递增序列二叉排序树中不能存在相同值(即每个关键字只出现一次)
2024-11-24 22:03:28
198
原创 读程序题4(类对象创建和销毁的两种形式)
这种方法是在堆上分配内存来创建对象的(与上不同);不同的是,C++用new创建对象时返回的是一个对象指针,object指向一个ClassName的对象,C++分配给object的仅仅是存放指针值的空间。而且,用new 动态创建的对象必须用delete来撤销该对象。只有delete对象才会调用其析构函数。该方法创建的对象调用类方法时,必须用“.”,而不能用“->”这种方法创建的对象,内存分配是分配到栈中的,还剩1个class对象。
2024-11-23 21:47:32
227
原创 顺序查找、折半查找
n个节点的二叉树,有2n个链域,有n-1个不为空(看成二叉树的n-1条分支/指针),则空链域为2n-(n-1)=n+1。1、mid=(low+high)/2(向下取整时,向上取整则结论相反)2、失败结点=n+1个(成功结点的空链域)因此偶数个结点时,右子树比左子树多一个。查找效率分析用平均查找长度ASL。奇数个节点左右子树结点个数相同。即右子树比左子树多0或1个结点。4、时间复杂度log2n。ASL成功=45/14。ASL失败=59/15。
2024-11-21 22:04:28
499
原创 如何求关键路径
2.网中的关键路径并不唯一,对于有几条关键路径的网,值提高一条关键路径的关键活动速度不能缩短整个工程的工期,只要加快那些包括在所有关键路径上的关键活动才能达到效果。1.关键活动影响着整个工程的工期,可以通过缩短关键路径缩短工期,但不能任意缩短,否则关键路径会变为非关键路径。1.求事件vk的最早发生时间,如有多条边(多个活动)同时指向该事件,取max。4.活动的最晚开始时间就是弧终点指向事件的最晚发生时间-权值(活动时间)2.求事件vk的最晚发生时间,逆向求,若一个事件有多个出度,取min、
2024-11-19 22:01:38
205
原创 拓扑排序(核心代码)
思路:找到入度为0的顶点入栈,出栈时将这些顶点相邻的边“抹去”,即相邻的顶点入度-1,若变化后的顶点入度为0则入栈,当遍历完邻接点后,继续出栈,即输出新的点,并做相同的操作,直至栈内没有顶点;前提准备:先初始化入度表(indegree[]),和print输出表(初始为-1)若输出结点数少于总结点,则证明图中有环路。拓扑排序是对有向无环图(AOV)的排序。
2024-11-19 19:45:19
107
原创 读程序题3
所以要考虑的情况就是:1,2,3,5,6,10,15。continue:跳过本次循环,执行下一次。n%i有余数的情况下跳过本次循环,不执行。
2024-11-16 21:50:18
183
原创 判断一个无向图是否是一棵树
用深度优先搜索的基本方法,从一个顶点出发如果能访问所有的顶点,则是连通的,在深度优先搜索的过程中,记录边的个数(在邻接表中还有有邻接点未访问时,即两个点相连,边+1)思路:一个图连通且只有n-1个边,则是一棵树;
2024-11-16 20:25:51
202
1
原创 DFS深度优先搜索
图的邻接表表现方式不唯一,因此遍历序列不唯一;邻接矩阵表示方式唯一,因此深度优先遍历序列唯一的。从一个顶点尽可能深的搜索,该顶点的所有邻接点访问完后,返回上一层,继续深度搜索;最坏的空间复杂度是o(v),最好o(1);空间复杂度主要来自递归工作栈。将时间复杂度简化为:访问各节点所需要的时间+探索各边所需要的时间。和树的先序遍历类似,即尽可能“深”的搜索一个图;邻接表:时间复杂度o(|v|+|e|)邻接矩阵:时间复杂度:o(v^2)思路:用到栈(递归)
2024-11-16 19:34:02
123
原创 广度优先遍历
NextNeighbor(G,v,w):返回图G中除了w以外的顶点v的下一个邻接点;其中NextNeighbor(G,v,w)函数,若w是最后一个邻接点,则返回-1;FirstNeighbor(G,v):返回图G中顶点v的第一个邻接点;使用这两个函数来遍历顶点v的单链表;广度优先遍历类似于二叉树的层序遍历。对邻接表进行广度优先遍历。
2024-11-15 21:36:56
177
原创 图的两种存储
是指对图中的每个顶点vi建立一个单链表,第i个单链表的结点表示依附于顶点vi的边,每个单链表就称为顶点vi的边表,边表的头指针和顶点信息顺序存储,称为顶点表。邻接矩阵是用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息,存储顶点之间邻接关系的二维数组称为邻接矩阵。邻接表存储的是顶点与边的关系!
2024-11-13 21:28:13
132
原创 用孩子兄弟表示法为存储结构的树的高度
遍历孩子兄弟法存储的二叉树,每一个结点在原本的树中的高度都等于孩子结点+1或兄弟结点最大的高度;如果没有左孩子则该结点没有孩子结点,即自己就是叶子结点。因此叶子结点数量=孩子子树叶子结点+兄弟子树叶子结点。求孩子兄弟表示法存储的树的叶子结点。从下往上依次“增加”高度。
2024-11-12 21:21:15
232
原创 读程序题2
在每个 case 标签的代码块结束处通常需要使用 break 语句来终止 switch 语句的执行。如果没有 break 语句,程序将会继续执行下一个 case 标签中的代码,直到遇到 break 语句或 switch 语句结束。在执行 switch 语句时,根据 switch 后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
2024-11-12 20:40:13
209
原创 读程序题1
左移运算符:左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值;++a表示取a的地址,增加它的内容,然后把值放在寄存器中;转义字符可以表示特殊的意义,或者表示不容易表示的字符。\\表示反斜杠字符‘\’
2024-11-10 21:33:56
152
原创 二叉树已知先序中序求后序
已知先序序列和中序序列,则可知先序序列的第一个元素是根节点,根据根节点在中序序列中的位置分为左右两个子树。先访问左子树,先序序列指针右移,指向的第一个元素是子树的根节点,通过中序序列将左子树再次分为左右子树,因此可以用递归的思想;先构建左子树,再构建右子树,从下往上依次建立树。当指针指向的先序序列元素=指针指向的中序序列元素;即该节点已经不存在左子树(中序序列中该元素的左边已经没有未访问的结点),则继续构建右子树;解题思路:根据先序序列和中序序列构建二叉树。右子树也为空,返回该结点(即插入到树中)
2024-11-10 17:35:22
656
1
原创 KMP算法求next数组
一个字符的next数组是根据前面有多少个能匹配上决定的,所以必须是匹配上了才能移动i和j,同时确定了该字符的next。之后再检验该字符是否和模式串中/已经匹配上的字符串/的下一个字符(即此时的j指向的字符)/匹配,若匹配不上则i不能向前移动,也相当于模式串第j个字符串匹配失败,继续向前寻找能够匹配的位置,即j=next[j],一直向前查找到j=0为止。KMP优化,对next数组进行优化。
2024-11-03 22:16:06
230
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人