- 博客(24)
- 收藏
- 关注
原创 【数据结构】计数排序
综上,各步骤的时间复杂度相加为:O(N)+O(N)+O(range)+O(N)=O(3N+range)=O(N+range)遍历待排数组a,统计每个元素出现的次数,将对应计数数组tmp位置的值+1该步骤需要遍历n个元素,所以时间复杂度为O(N)将计数数组tmp对应位置的数据进行--操作,将tmp元素放入原数组a,所以时间复杂度为O(N)但是,数据只会映射100~108这个范围的空间,前面的空间没有用到,也就浪费了。计数排序算法的时间复杂度严格来说为O(N+range),也可取两个中较大的一个。
2025-03-04 17:52:36
646
原创 【数据结构】空间复杂度
这就像程序运行时,会在系统中展开庞大的运行架构,占用大量的内存、CPU 等资源,其运行时占据的 “空间” 和要比程序本身所占用的大得多,也有可能会随着业务的发展和数据量的增加不断扩展。此外,程序运行时所占用的内存还受到很多与算法本身无关的因素影响,不同的计算机硬件环境(如内存架构、字长等)和软件环境(如操作系统的内存管理机制、编译器的优化程度等)会导致同一算法在不同环境下的实际内存占用有所不同。n个int型变量的数组,占用的空间大小是4nbit,4n的大小是属于线性阶的,那么它的空间复杂度为O(N)
2025-01-26 22:33:48
1755
3
原创 【数据结构】快排之三路划分
在之前快排是排完序把key放在中间,左边比key值小,右边比key大,跟key相等的值在哪里并没有规定,跟key相等的值可以在左边,也可以在右边。因为假如cur没有遇见比key大的值,right没有--,那么cur与right在相同位置时,并不能确定right所指向的值是否小于key。但是,有些场景下hoae和lomuto(前后指针法)还是适应的不是很好,就是当数组中有大量重复数据时,该场景下性能是有些退化的。cur指向的值与left位置的值进行交换,然后left++,cur++核心思想是把数组中的数据。
2024-11-13 17:54:23
514
原创 【数据结构】比较顺序表和链表的区别(优缺点),细讲CPU高速缓存命中率
顺序表链表的比较 ,主存和本地二级存储,寄存器和三级缓存,顺序表缓存命中率,链表缓存命中率
2024-06-24 17:49:50
1618
7
原创 【数据结构】时间复杂度
时间复杂度的概念,大O渐进表示法,计算时间复杂度步骤,常见时间复杂度举例,最好,最坏和平均情况的时间复杂度,时间复杂度优劣对比
2024-06-20 16:12:10
3700
6
原创 【C语言】位段(结构体实现位段)
位段的定义,声明,内存分配,在内存中的存储方式,位段的优点,位段的跨平台问题,位段的应用,位段使用的注意事项
2024-06-03 20:32:21
1717
14
原创 【C语言】static关键字用法
代码2:运行结果可知,被static修饰过后的i,它的值是有累加效果的,在头一次进入test函数后,创建了i后,出函数是不会被销毁的。如果一个函数被static修饰,外部链接属性就变成了内部链接属性,其它源文件(.c)就不能再使用该函数,只能在自己所在的源文件内部使用。使用建议:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。使用建议:一个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用static来修饰。外部链接属性就变成了内部链接属性,
2024-05-07 18:23:18
982
30
原创 【C语言】函数
本来可以不用函数的声明,函数的定义利用函数的外部链接属性也可以实现,但分开写可以把函数的实现这个模块变成静态库,静态库是二进制的,是看不懂的。我们可以把函数想象成小型的一个加工厂,工厂得输入原材料,经过工厂加工才能生产出产品,函数也是一样的,函数一般会输入一些值(可以是0个,也可以是多个),经过函数内的计算,得出结果。因为C语言编译器对源代码进行编译的时候,是从第一行往下扫描的,当遇见Add函数调用的时候,并没有发现前面有Add的定义,就会报出上述的警告。同时库函数的质量和执行效率上都更有保证。
2024-05-06 22:34:58
1497
7
原创 【C语言】字符串函数
只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会让对应的错误码,存放在errno中。打印的时候,先打印传给perror的字符串,然后打印一个冒号,紧接着打印一个空格,最后打印错误码对应的错误信息。如果source指向的字符串的长度小于num的时候,只会将字符串中到\0的内容追加到destination指向的字符串末尾。因为\0是字符串结束的标志,此处追加5个字符,world在56789的位置,如果追加上一个\0,那么[10]的位置就是\0。
2024-04-29 14:10:22
2219
21
原创 【C语言】进制转换
2进制和10进制是类似的,只不过2进制的每一位的权重,从右向左分别是:2^0,2^1,2^2 .......如:2进制的01101011,换成16进制为:0x6b (十六进制位的数字,以0x开头)如:二进制的01101011,换成8进制为:0153。我们知道,数值是由不同的进制表示的,可以用二进制、八进制、十进制、十六进制表示。可以先将10进制转换为2进制,2进制再转换为16进制。先将该进制转换为2进制,再转换为我们想要的进制。分别是:10^0,10^1,10^2。2进制的数字每⼀位都是由0~1组成。
2024-04-26 15:28:45
446
9
原创 【C语言】动态内存管理
原因:free的意思是把空间的使用权限还给了操作系统,但是p还记得malloc时候的地址,还指向那块不属于自己的空间,所以一旦free完之后,p就是野指针了,所以把p置空,p=NULL,避免出现问题。当我们申请的内存空间空间过大或者过小的时候,为了合理使用内存,我们可以使用realloc函数,用来对动态开辟的内存的大小做出灵活的调整。calloc函数开辟空间的时候,它开辟好空间之后会把内容初始化为0,然后再把这块空间的。当是情况2的时候,在堆空间上找一块新的连续可用的空间,旧的空间释放掉,
2024-04-25 15:43:39
953
12
原创 【C语言】数组(一维数组和二维数组)
变长数组的意思是数组大小是可以使用变量来指定,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是数组的大小是可变的。当使用数组的类型的时候,数组的类型是必须加上元素个数的,它的元素个数也是类型的一部分,如果不加元素个数,就会报错。例如:int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};指定的是数组中存放数据的类型,可以是:char,short,int,float等,也可以是自定义类型。arr[0][4]和[1][0](即两个5)地址一样。
2024-04-24 00:00:18
1106
7
原创 【C语言】分支语句和循环语句
只有在 switch 语句中使用break ,才能在跳出 switch 语句,如果某一个 case 语句的后边没有 break 语句,代码就会继续往下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。控制语句用于控制程序的执行流程,以实现程序的各种结构方式,(c语言支持3种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,c语言有九种控制语句。例如多分支语句那里,只能执行其中的一条(即只能执行语句1,或者语句2,或者语句3)。
2024-04-20 12:42:17
890
10
原创 2023年11月19日
多数人的成功,在于持之以恒。坚持两字,说容易,写容易,坚持下来不容易!苟有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。
2023-11-19 12:06:36
132
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人