c
文章平均质量分 63
1886i
尽人事听天命
展开
-
【数据结构】图解Kruskal算法+详细代码实现
它的基本思想是按照权值从小到大的顺序选择边,并保证所选的边不会构成环路,直到选取了n-1条边为止,此时形成的树即为最小生成树。综上所述,克鲁斯卡尔算法是一种有效的求取最小生成树的方法,特别适用于边数较少的图。在实际应用中,选择合适的算法对于提高计算效率和优化网络设计至关重要。原创 2024-06-10 23:45:04 · 381 阅读 · 0 评论 -
【数据结构】图之邻接矩阵代码实现与dfs、bfs
除了上述基本概念外,图还有一些存储结构,如邻接矩阵和邻接表,以及遍历算法,如深度优先搜索(DFS)和广度优先搜索(BFS)。此外,图论中的一些经典问题包括最短路径问题、最小生成树问题、网络流问题等,它们都有对应的算法来解决。综上所述,图是一种强大的数据结构,能够有效地模拟和解决现实世界中的许多问题,如社交网络分析、推荐系统、交通规划等。通过学习和掌握图的相关概念和算法,可以在多个领域内应用图的理论来优化问题解决方案。综上所述,图的存储结构根据图的类型和实际应用场景的不同而有所选择。原创 2024-06-10 21:52:31 · 650 阅读 · 2 评论 -
【数据结构】图解红黑树以及代码实现
此外,红黑树的本质是对概念模型2-3-4树的一种实现。2-3-4树是阶数为4的B树,也是平衡多路查找树的一种,它通过保持树的平衡来确保即使在最坏情况下也能保持 O(Log N) 的时间复杂度进行查找操作。这种情况不可能是刚插入cur节点而引起的,因为此时grandparent是黑色的,此时parent路径上比uncle路径上的黑色节点少一个,所以这种情况是发生在调整的过程中的。插入节点颜色是红色,此时如果他的父亲节点也是红色,那么就不满足红黑树的性质,此时就需要去进行分情况调整,主要情况在二中详细图示。原创 2024-05-27 16:15:51 · 782 阅读 · 0 评论 -
【数据结构】单链表+王道课后题
【代码】【数据结构】单链表+王道课后题。原创 2024-04-22 00:59:44 · 128 阅读 · 0 评论 -
【数据结构】顺序表+王道课后题
【代码】【数据结构】顺序表+王道课后题。原创 2024-04-22 00:59:00 · 121 阅读 · 0 评论 -
【数据结构】七大排序图解+代码实现
我们也可以进行优化,找一个是找要两个也是找,将数组整个分为三段[0,l -1](前已排序部分), [l, r](未排序部分), [r+1, n](后已排序部分)我们可以同时在未排序部分寻找未排序部分的最小值和最大值,最小值与l交换,最大值与r交换,这里要注意的时在将最小值与l交换后,需要判断我们寻找到的最大值是否指向l,如果指向l,在前面最小值与l交换中,l指向的位置已经被交换到了minIndex位置,此时我们需要将maxIndex的位置进行修改,确保最大值不变。依次重复上述步骤,直到j遍历完n-1遍。原创 2024-03-18 22:25:50 · 857 阅读 · 1 评论 -
【字符串匹配】BF与KMP算法
由于在kmp算法中,i指针是不回退的,所以我们在j匹配失败时需要让j回退到合适的位置上,而next数组就记录了当j此时匹配失败时回退到next[j]的位置继续进行匹配,那next数组是如何进行维护的呢。需要注意的是,BF算法的时间复杂度较高,为O((n-m+1)*m),其中n是主文本字符串的长度,m是模式字符串的长度。此外,在实际应用中,字符串匹配问题可能会有更多的变化和挑战,例如处理包含特殊字符的字符串,或者在不完全匹配的情况下找到最接近的匹配项。下面是使用C++实现BF算法的代码示例:。原创 2024-03-18 22:20:47 · 988 阅读 · 0 评论 -
【数据结构】图解二叉搜索树的新增、搜索、删除
通常的做法是找到该节点的右子树中的最小节点(或者左子树中的最大节点),用这个节点的值替换待删除节点的值,然后删除那个最小(或最大)节点。依旧往左发现往左为空,于是我们就可以将1插入到此处,但是要想插入到这里,我们需要记录父亲节点,所以在遍历的时候我们需要记录父亲节点位置。总的来说,二叉搜索树的删除操作是一个相对复杂的过程,需要根据不同的情况采取不同的策略,并且在整个过程中保持树的平衡和有序性。当前cur节点的值依旧比目标值9要小,于是我们又去他的右子树中寻找。有如下这样一颗二叉树,我们需要查询9所在节点。原创 2024-03-07 00:54:29 · 1064 阅读 · 0 评论 -
【排序】希尔排序
它的主要思想是将待排序的序列分割成若干个子序列,这些子序列的元素是相隔一定“增量”的。然后对每个子序列进行直接插入排序。当增量减至1时,整个序列会进行最后一次直接插入排序,此时整个序列变为一个子序列,排序完成。随着增量递减,子序列包含的元素越来越多,但此时大部分元素已经基本有序,插入排序依然高效。总之,希尔排序的效率很大程度上取决于增量序列的选择,不同的增量序列可能导致排序性能的显著差异。虽然到目前为止没有找到最佳的增量序列,但通过合理选择增量序列,希尔排序在大数据集上通常表现出比传统插入排序更好的性能。原创 2024-03-06 01:06:29 · 429 阅读 · 0 评论 -
【排序】详解归并排序
归并排序是一种稳定的排序算法,适用于大数据量时效率较高,且可以用于链表等数据结构的排序。然而,它的不足之处在于需要额外的存储空间来存放临时数组,并且对于小规模数据的排序效率不如某些简单的排序算法,如插入排序。此外,由于其递归的特性,归并排序在深度很大的情况下可能会导致调用栈溢出。归并排序的核心思想是分治法,即将大问题分解成小问题来解决,然后再将解决后的小问题的结果合并以解决原来的大问题。对于一个这样的数组,首先我们需要将这个数组不断的划分为两个子数组。然后将这些子数组逐个排序合并。原创 2024-03-05 20:44:26 · 465 阅读 · 0 评论 -
【排序】详解堆排序
具体实现如下:首先我们需要从最后一个孩子所在的子堆进行调整,最好一个孩子就是数组长度-1的位置,那么我们如何根据孩子节点的下标去求出父亲节点的下标呢,我们只需要让孩子节点的下标减去1的差然后除2就能得到父亲节点的下标,同样我们知道父亲节点的下标同样除2在加1就能求出孩子节点的下标。首先我们需要找到孩子节点中的最大值,然后拿他与父亲节点比较,如果他比父亲节点大,那么就进行交换,然后依次向下进行调整(调整孩子节点的子堆),如果比父亲节点小说明这个堆已经调整完成我们就可以结束向下。重复此操作将最大值交换到末尾。原创 2024-03-05 20:18:23 · 867 阅读 · 0 评论 -
【排序】详解冒泡排序
在每一轮的排序过程中,都会从数列的起始位置开始,对相邻的元素进行比较,如果它们的顺序不符合要求(例如,前一个元素大于后一个元素),则交换它们的位置。这样,每轮遍历后,至少会有一个元素被移动到其最终位置。如果一个数组本来就是有序或者经过小于n-1次就已经排好了序,那么j指针后续的遍历就是徒劳,所以我们可以根据j指针在遍历过程中是否有交换进行判断,如果没有交换说明已经排好序,这个时候就可直接返回。冒泡排序的过程可以形象地比喻为水中的气泡上升过程,较小的元素逐渐“冒”到数列的顶端,而较大的元素则沉到底部。原创 2024-03-05 19:24:14 · 468 阅读 · 0 评论 -
【排序】详解选择排序
图解依旧将数组分为已排序部分跟为排序部分,初识时定义一个指针指向已排序部分的下一个位置,然后定义一个指针指向未排序部分,依次遍历未排序部分寻找未排序部分的最小值,寻找到后与已排序部分的下一个位置进行交换依次重复。开始时i指向已排序部分的下一个位置,j指针在未排序部分寻找最小值此时minIndex指向了最小值,于是将他与i位置进行交换,之后i指向下一个位置,j依旧在剩余未排序部分去寻找最小值,重复上述步骤。原创 2024-03-05 19:06:49 · 514 阅读 · 0 评论 -
【排序】详解插入排序
在j从i-1遍历向0的过程中,拿arr[j]与存储的变量t进行比较,因为前部分都是已排序部分,所有在进行比较时会出现两种情况:1》arr[j] > t 说明此时j位置并不是t要插入的位置,这个时候我们可以让j+1的位置修改为arr[j],然后j--继续去比较 2》arr[j] < =t, 此时说明j位置就是t要插入的位置,我们可以结束j的遍历然后让j + 1位置的值更改为t。这个时候arr[j] > t,于是让arr[j+1]=arr[j]依旧是arr[j] > t,于是让arr[j+1]=arr[j]原创 2024-03-05 18:35:23 · 644 阅读 · 0 评论 -
【排序】基于快速选择算法的快排实现
此时进行将遍历指针指向的元素与基准元素进行比较依次重复此操作,当遍历指针指向的元素比基准元素小时执行:swap(arr[i++], arr[++s]) ,当与基准元素相等时只需要执行i++即可。总的来说,快速选择算法是一种基于快速排序的选择算法,它高效地解决了在不完全排序的数组中寻找特定顺序元素的问题,并因此在各种算法竞赛和实际应用场景中得到了广泛的使用。然后使用一个指针指向开始位置依次往后遍历,如果当前元素比基准元素大则将该元素放在末尾,也就是基准元素后面,如果比当前元素小则将他放在基准元素前面。原创 2024-03-04 00:31:30 · 529 阅读 · 0 评论 -
【二分】第k个缺失的数
第K个缺失的数。原创 2024-03-03 02:14:23 · 341 阅读 · 0 评论 -
【双指针】移动零
移动零。原创 2024-03-03 02:10:51 · 349 阅读 · 0 评论 -
【双指针】删除有序数组中重复元素,双指针原地修改数组
删除有序数组中重复元素。原创 2024-03-03 01:47:04 · 361 阅读 · 0 评论 -
【双指针】合并两个有序数组O(N)
合并两个有序数组。原创 2024-03-03 01:45:12 · 360 阅读 · 0 评论 -
【快速选择】解决TopK问题
TopK问题就是在一个数组中寻找出最小(大)的前K个数,或者寻找出第K大(小)的数常见TopK问题图示常见TopK问题链接最小的K个数_牛客题霸_牛客网给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是。题目来自【牛客题霸】寻找第K大_牛客题霸_牛客网. - 力扣(LeetCode)优先级队列是一种数据结构,它根据元素的优先级来决定元素的插入和删除顺序。基于优先级排序:每个元素在队列中都有一个优先级,优先级最高的元素会首先被移除。使用特定数据结构。原创 2024-03-02 01:40:19 · 1017 阅读 · 1 评论 -
【二分】二分模板+二分题目
- 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。. - 力扣(LeetCode). - 力扣(LeetCode)原创 2024-03-01 19:10:22 · 363 阅读 · 0 评论 -
【数据结构】七大排序代码实现
【代码】【数据结构】七大排序代码实现。原创 2023-10-23 22:52:50 · 159 阅读 · 1 评论 -
【C语言】数据在内存的存储
目录一、原码反码补码1、原码2、反码3、补码4、三者联系二、存储模式1、大端存储模式2、小端存储模式3、判断大小端的方法1.访问一字节2、联合体三、整形在内存的存储方式1、有符号2、无符号四、浮点型在内存的存储方式1、存储规则2、内存图编辑3、从内存中取出E的特殊处理1.E为全02.E为1全1引言:先来做一道题吧int main(){ int n = 9; ...原创 2022-05-12 22:12:45 · 285 阅读 · 16 评论 -
【C语言项目】通讯录与可视化界面实现
一、编译环境1、VS20222、Easyx库二、功能结构实现基本的增删改查更改,通过文件的形式存储录入的数据,在输出信息的时候打印出来三、主界面的实现1、原创 2022-05-11 23:34:40 · 6615 阅读 · 41 评论 -
【C语言】自定义类型(结构体、位段、枚举、联合体)与内存对齐
目录一、自定义类型种类1、结构体2、位段3、枚举4、联合体(共同体)二、结构体1、结构体的声明2、结构体变量的定义与初始化1.定义2.结构体变量的初始化3、结构体成员的访问1.变量访问(.)2.指针访问(->)4、结构体重命名1.结构体重命名2.结构体指针重命名5、结构体传参1.值传参2.址传参6、结构体内存对齐1.对齐数2.内存对齐的规则3.计算结构体大小训练4.内存对齐的意义三、...原创 2022-05-09 15:08:40 · 526 阅读 · 1 评论 -
c语言动态内存管理函数
前言:内存分静态区、栈区、堆区,一般在静态区存放全局变量与静态变量,栈区存放局部变量及函数的形参等,而堆区的空间是留给malloc,calloc,reallo这些函数开辟空间的一、malloc(动态内存开辟)与free函数(动态内存的释放)1.malloc函数原型:void* malloc(size_t size)作用:在堆区申请空间使用:比如要开辟10个整形空间int* p=(int*)malloc(10*sizeof(int));用整形指针区接受申请的空间的首地址,因为返回值是v原创 2022-04-13 01:04:08 · 116 阅读 · 0 评论 -
本题要求实现一个字符串查找的简单函数。(strstr函数模拟实现)
本题要求实现一个字符串查找的简单函数。函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。裁判测试程序样例:#include <stdio.h> #define MAXS 30 char *search(char *s, char *t); void ReadString( char s[] ); /* 裁判提供,细节不表 */ int main() { char s[MAXS], t[MAXS], *pos; ReadString(s原创 2022-04-10 15:48:56 · 2966 阅读 · 0 评论 -
本题要求实现一个函数,将两个字符串连接起来。(strcat)函数实现
函数接口定义:char *str_cat( char *s, char *t ); 函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。裁判测试程序样例:#include <stdio.h> #include <string.h> #define MAXS 10 char *str_cat( char *s, char *t ); int main() { char *p; char str1[MAXS+MAXS] = {'\原创 2022-04-10 14:23:29 · 5461 阅读 · 0 评论 -
c语言用Sleep函数与keybd_event在模拟器实现王者荣耀远征物理脚本
一、Sleep函数功能作用:是让执行挂起一段时间用法:1.引用头文件windows.h2.Sleep(n*1000)其中,你想挂起多少秒就把n换成数字即可二、keybd_event函数(也要使用头文件windows.h)函数原型:VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtraInfo)有四个参数,简单来讲第一个参数为按键虚拟值,第二个为扫描码一般直接用0就行,第三个为选项标志,如果是键入就0,如果是原创 2022-04-08 17:17:44 · 1196 阅读 · 0 评论 -
c语言qsort函数的用法与模拟实现
一、qsort函数说明首先他是一个库函数,在使用时需要包含stdlib.h这个头文件,其次他是一个基于快速排序算法的排序函数,任何类型的数据都可以实现排序,比如字符串排序,结构体排序及整形排序。二、函数原型void qsort(void* base,int num,int width,int(*cmp)(void* e1,void* e2))其中:base是一个待排序地址的起始位置的指针,使用时传入数组地址即可num是待排序元素的个数width是待排序的其中一个元素所占的字节大小原创 2022-04-05 22:04:00 · 1444 阅读 · 3 评论