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

若f(n) = O(n),g(n) = O(n),证明f(g(n)) = O(n)

要证明 f(g(n)) = O(n),我们需要证明存在一个正常数 c 和一个正整数 N,使得对于所有的 n>N,都有 f(g(n)) ≤ c*n 成立。

根据 f(n) = O(n) 的定义,存在正常数 c1 和正整数 N1,使得对于所有的 n>N1,都有 f(n) ≤ c1*n 成立。

同样地,根据 g(n) = O(n) 的定义,存在正常数 c2 和正整数 N2,使得对于所有的 n>N2,都有 g(n) ≤ c2*n 成立。

我们可以选择 c = c1 * c2,并且选择 N = max(N1, N2)。

对于所有的 n>N,我们有:

f(g(n)) ≤ c1 * g(n) (根据 f(n) = O(n)) ≤ c1 * (c2 * n) (根据 g(n) = O(n)) = (c1 * c2) * n = c * n

因此,我们证明了 f(g(n)) = O(n)。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《数据结构与算法》O(3N)=O(N)?

在学习算法效率的时候一般会把O(3N)≈O(N),N的常数倍都直接约等于O(N)。这也是约等于,不是完全相等。实际编程设计时特别是在一些效率要求较高的程序设计一定要考虑进去,不能约等于。...在高并发的请求下,O(3N)和O(N)是有着天壤之别的。 我在工作中遇到的一个实例,差点背了事故。...一个高并发的场景下(qps在5k左右),我写了一个O(3N)的程序,测试时逻辑没问题,结果没问题,没有对该场景进行高并发压测,就上线了。...上线之后不到十分钟我收到短信报警,多台机器CPU打满了,内存也在飙升(32C—124G的服务器)。此时的我吓坏了,意识到我刚刚发布了,肯定和我发布有关。...错误的把O(3N)=O(N)的算法上线了。把算法优化为O(N)之后,经过一番压力测试完全没问题。这次事件对我一个很大的启示是,高并发的场景下,O(3N)≠O(N),一定不能等于。

53640
  • 时间复杂度o(1), o(n), o(logn), o(nlogn)

    1、时间复杂度o(1), o(n), o(logn), o(nlogn)。算法时间复杂度的时候有说o(1), o(n), o(logn), o(nlogn),这是算法的时空复杂度的表示。...O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 2、时间复杂度为O(1)。...哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话) 3、时间复杂度为O(n)。 就代表数据量增大几倍,耗时也增大几倍。 比如常见的遍历算法。...再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。 比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。...对数函数,如果a^x =N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作x=logaN,读作以a为底N的对数,其中a叫做对数的底数,N叫做真数。 5、时间复杂度为O(nlogn)。

    1.4K10

    经典 O(n²)比较类排序算法

    排序算法 时间复杂度 是否基于比较 冒泡、插入、选择 O(n²) 是 快排、归并 O(nlog~n~) 是 桶、计数、基数 O(n) 否 十种常见的的排序算法可以分两大类: 比较类排序:通过比较来决定元素的相对次序...冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。 算法步骤 比较相邻的元素。.../** * 冒泡排序: 时间复杂度 O(n²),最坏时间复杂度 O(n²),最好时间复杂度 O(n),平均时间复杂度 O(n²) * 空间复杂度 O(1),稳定排序算法 */ public class...代码如下所示: /** * 插入排序:时间复杂度 O(n²),平均时间复杂度 O(n²),最好时间复杂度 O(n), * 最坏时间复杂度 O(n²),空间时间复杂度 O(1).稳定排序算法。...没错,是 O(n)。所以,对于插入排序来说,每次插入操作都相当于在数组中插入一个数据,循环执行 n 次插入操作,所以平均时间复杂度为 O(n²)。

    58020

    使用 Python 可视化 On

    常用的时间复杂度类 On) 表示输入大小和执行时间之间的线性关联。 定义 计算机科学中的算法复杂性是对资源(例如时间和空间利用率)的评估,这些资源是根据其输入大小操作算法所需的。...用于描述算法复杂性的主要表示法是大O表示法(On))。...其中“n”表示迭代次数。 在 On) 时间复杂度中,随着输入大小 'n' 的增加,执行时间成比例增长。随着“n”的增加,迭代次数和完成循环所需的时间将成比例增加。...循环中的任何任务或任务序列都可以在不考虑输入大小“n”的情况下执行。这里要注意的主要方面是循环执行“n”次迭代,导致线性时间复杂度。...假设算法表现出 On) 的时间复杂度,我们可以近似地认为,在绘制图表时,输入大小和执行持续时间之间将存在几乎直线的相关性。

    20910

    O(n)的算法居然超时了,此时的n究竟是多大?

    如果写出了一个O(n)的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 如果n的规模已经足够让O(n)的算法运行时间超过了1s,就应该考虑log(n)的解法了。...以下以C++代码为例: 测试硬件:2015年MacPro,CPU配置:2.7 GHz Dual-Core Intel Core i5 实现三个函数,时间复杂度分别是 O(n) , O(n^2), O(nlogn...O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 ?...O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 在推测一下O(nlogn)的话, 1s可以处理的数据规模是什么呢?...至于O(logn) 和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。

    1.2K30

    【转】算法中时间复杂度概括——o(1)、o(n)、o(logn)、o(nlogn)

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度。这里进行归纳一下它们代表的含义:这是算法的时空复杂度的表示。...O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。...再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。...再比如O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。...二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。 O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。

    1.2K10
    领券