首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2023CSP初赛备考复习 || 时间复杂度

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。

也就是说,为解决一个具体的问题,执行一系列程序指令,能够对一定规范的输入,在有限时间内获得所要求的输出。

例如如下问题:

题目描述

求前N项和

1+2+3+ …… +N 的值。

输入格式

输入

N

输出格式

输出

输入样例

输出样例

参考程序

需要如下程序指令完成

上述程序执行,涉及到输入,循环,输出等基本程序指令,主要时间耗费在for循环,且执行时间是随循环中N变化而变化的函数,分析算法执行时间通常使用算法的时间复杂度来衡量

算法的时间复杂度

算法的时间复杂度是一个函数,它定性描述该算法的运行时间,常用大O符号表述,它可以被认为是渐进,不考虑常数

对于足够大的输入规模,我们往往不需要花费很大力气计算太精确的结果,通常指关系增长级量,即算法的渐进效率

比如:

我们关心for循环的时间复杂度,而 int sum=0 忽略

因此时间复杂度为O(n),而不是O(n+1)

举例说明

1.O(1)

O(1)的时间复杂度可以这样理解:代码按顺序一行一行执行,没有任何的循环

比如:

无论有多少个这样的代码块,只要不出现循环,就可以被认为是O(1),没有O(2),O(3)

1个和几个都是O(1),不考虑常数

2.O(n)

O(n)的时间复杂度是与数据规模成线性的,比如:

循环体内循环了n次,这样的时间复杂度就是O(n)的,如果有多个这样的循环,只要不是循环嵌套,我们也认为是O(n)的,因为时间复杂的不考虑常数

3.O(n^2)

O(n^2)的时间复杂度很容易理解,就是循环里嵌套了一层循环,比如:

4.O(logn)

O(logn)的时间复杂度我们常常认为在数据规模为n下,代码执行的次数x满足c^x=n(c是一个较小的常数),比如:

for循环中i每次*2,执行次数为logn次

常见的O(logn)的算法还有二分查找

5.O(nlogn)

O(nlogn)的时间复杂度就是在一个循环中嵌套了一个O(logn)的算法,比如:

6.O(2^n)

O(2^n)的时间复杂度常见于搜索,递归中,比如在用递归求斐波那契数的时候:

O(2^n)的时间复杂度是一个很不理想的时间复杂度,因此我们常常会使用一些技巧去尽可能地优化。

常用算法的时间复杂度

排序

1冒泡排序

正常冒泡排序需要一趟交换找到最大的,时间复杂度为O(n),进行n-1躺排序,所以平均时间复杂度为O(N^2)

插入排序和选择排序的平均时间复杂度类似

最好: O(n)

如果其中一趟,没有任何交换,说明已经排好序了,可以提前推出

如果给出序列本身就是已经排好序的,一趟比较就排好序了,所以是 O(n)

平均: O(n^2)

最坏: O(N^2)

2插入排序

插入排序的思想为:从未排序的序列中取出一个,插入到前面已经排好序的合适位置

最好: O(n)

如果数列本身是排好序的,每次取出数据都是放到最后一个,进行取放各n次结束

所以最好时间复杂度为:O(n)

平均: O(n^2)

最坏: O(N^2)

3选择排序

每次从未排序的序列中,找一个最小的,放如已排序序列

每次找最小的时间复杂度为O(n),需要找n次,因此,平均时间复杂度为O(n^2)

序列中数据大小排序,对选择排序没有优化空间,因此最好时间复杂度也为O(n^2)

最好: O(n^2)

平均: O(n^2)

最坏: O(N^2)

4 快速排序

找到基准数,分成2各区间,再2个区间继续找基准数,二分下去

最好: O(nlogn)

平均: O(nlogn)

最坏: O(N^2)

5 归并排序

先中间分成2个区间,再子区间继续分,分到最底层逐渐合并回来

最好: O(nlogn)

平均: O(nlogn)

最坏: O(nlogn)

6 堆排序

使用完全二叉树的数据结构

最好: O(nlogn)

平均: O(nlogn)

最坏: O(nlogn)

7 基数排序

从低位到高位逐位排序

最好: O(d(n+rd))

平均: O(d(r+n))

最坏: O(d(r+n))

一般计算排序时间复杂度在 O(n)~O(nlogn)之间

8 希尔排序

最好: O(n)

平均: O(n^1.3)

最坏: O(n^2)

上述排序的稳定性:

冒泡排序,插入排序,归并排序,基数排序是稳定的,其余是不稳定的

分治时间复杂度-主定理

https://www.cnblogs.com/myeln/articles/16412060.html

复赛中评估时间复杂度

在一般在算法竞赛或者笔试题的时间限制是1秒,基本程序指令规模一般在10^8以内

对应相应时间复杂度可以接受的数据规模如下

O(n)算法能解决的数据范围在 n≤10^8

O(nlogn) 算法能解决的数据范围在 n≤10^6

O(n^2) 算法能解决的数据范围在 n≤5000

O(n^3) 算法能解决的数据范围在 n≤300

O(logn) 算法能解决的数据范围在 n

O(2^n) 算法能解决的数据范围在 n≤25

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O_j5ad4uE2WJhxqT3ZHzKj1A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券