时间、空间复杂度O(n)该如何计算?(C语言)

文章介绍了计算时间、空间复杂度的重要性,以及如何使用大O记法进行简化,特别提到了二分查找的时间复杂度为O(logN)。通过举例说明了如何分析代码的时间复杂度,强调在最坏情况下分析,并指出在空间复杂度计算时,递归情况需考虑。

🖊作者 : Djx_hmbb
📘专栏 : C语言
今日分享 : 所有的努力都在慢慢变得清晰
请添加图片描述

一、理解时间、空间复杂度:为什么要计算时间、空间复杂度?

答:可以判断你的代码是否更高效,更简便。比如,如果你和小王同时设计出一款程序,公司肯定选择更优,更高效的,这时就会用到时间复杂度和空间复杂度了。
时间复杂度: [运行该算法的运行时间]
空间复杂度: [是一个数字表达式->运行过程中临时占用存储空间的大小=变量的个数,即由申请的额外空间来确定]

二、计算时间、空间复杂度的方法(别名:大O趋近法,即O(n)):

  • 1.用常数1代替所有的加法常数;
  • 2.在修改后的运行次数函数中,只保留最高阶项;
  • 3.如果最高阶项存在且系数不为1,则去掉常数;
  • 4.一般算时间复杂度,都是看最慢情况;
  • 5.二分查找/折纸:O(logN)。
    注意: 这里的logN是指:log2N,而非log10N。因为计算机无法写出这种格式,所以简写成logN,有些书上还会写成lgN。

三、举例理解:

1.用常数1代替所有的加法常数。

eg:

main()
{
	int num = 100;
	for(int i = 0 ; i<num ; i++)
	{printf("%d ",num);
	}
	return 0;
}

这里的时间复杂度为:O(1)

2.在修改后的运行次数函数中,只保留最高阶项

注意:这里的修改是指,自己化简过后的式子中,只保留最高阶项
eg1:
在这里插入图片描述
这里的时间复杂度为:O(n^2)
eg2:自己化简过后的式子中,只保留最高阶项
在这里插入图片描述
这里的时间复杂度为:O(n^2)

3.如果最高阶项存在且系数不为1,则去掉该系数

在这里插入图片描述
这里的时间复杂度为:O(n^2)

4.一般算时间复杂度,都是看最慢情况;

在这里插入图片描述
这里的时间复杂度为:O(n)

5.二分查找/折纸:O(logN)

注: 这里的log没有下标,在前面有讲解过哦~

在这里插入图片描述
这里的时间复杂度为:O(log2N)

四、总结:

  • O(logN)很少用到
  • 时间复杂度用到的更多
  • 空间复杂度的计算中:普通的函数调用不用看参数,但是递归要看!!!

感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!

家人们,点个请添加图片描述再走呗~

### 计算希尔排序的时间复杂度空间复杂度 #### 时间复杂度计算方法 时间复杂度主要用于评估算法运行速度,它描述了随着输入规模 \(n\) 的增长,算法所需操作数量的增长趋势。对于希尔排序而言,其时间复杂度受增量序列的选择影响较大[^2]。 - **最佳情况**:如果选择了合适的增量序列(如Hibbard增量),希尔排序可以达到接近 \(O(n^{1.3})\)时间复杂度。 - **最坏情况**:当增量序列设计不合理时,希尔排序可能退化到类似于简单插入排序的情况,此时时间复杂度为 \(O(n^2)\)[^2]。 具体计算过程如下: 1. 初始设定步长 `gap` 为数组长度的一半,并逐步缩小至 1。 2. 每次以当前步长对子序列进行插入排序。 3. 插入排序的操作次数由子序列的数量以及各子序列内部元素的关系决定。 最终的时间复杂度综合考虑了所有步长下的插入排序开销总和。 --- #### 空间复杂度计算方法 空间复杂度用于衡量算法运行过程中所需的额外存储空间大小。希尔排序属于就地排序算法,在排序过程中不需要额外分配大量内存资源[^1]。 - 主要使用的辅助变量包括临时交换变量 (`temp`) 和循环控制变量 (`i`, `j`, `gap`)。 - 这些变量占用的空间不随输入规模 \(n\) 成比例增加,因此希尔排序的空间复杂度为 \(O(1)\)[^4]。 --- ### 结合C语言实现的具体分析 以下是一个完整的C语言实现示例,附带对其时间复杂度空间复杂度的解释: ```c #include <stdio.h> // 希尔排序函数定义 void shellSort(int arr[], int n) { int gap, i, j; int temp; // 设置初始步长并逐步缩减 for (gap = n / 2; gap > 0; gap /= 2) { // 遍历每个子序列 for (i = gap; i < n; i++) { temp = arr[i]; // 存储当前值 j = i; // 将大于目标值的元素右移一位 while (j >= gap && arr[j - gap] > temp) { arr[j] = arr[j - gap]; j -= gap; } arr[j] = temp; // 插入正确位置 } } } int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr) / sizeof(arr[0]); // 调用希尔排序 shellSort(arr, n); // 输出结果 printf("排序后的数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` #### 分析 - **时间复杂度**:该实现中的外层循环负责设置步长 `gap`,内层嵌套循环完成子序列的插入排序。总体时间复杂度取决于步长变化规律及每次插入排序的实际工作量。 - **空间复杂度**:除了原始数组本身之外,仅需少量固定变量作为支持,故空间复杂度保持恒定为 \(O(1)\)[^4]。 --- ### 总结 通过对希尔排序的研究发现,尽管其确切时间复杂度难以精确表达,但在合理选择增量序列的情况下可获得较好的性能表现;而其空间需求始终保持较低水平,适合应用于大规模数据集上的高效排序场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D. Star.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值