algorithm - 大 O(常数)时间复杂度
问题描述
为什么每个语句的以下代码都引用大 O 常量(这里我使用 1 作为约定)?
我的意思是,如果数组大小变大,时间复杂度可能会变大,对吗?而且总数会越来越大,不会影响复杂度吗?
伪代码:
def find_sum(given_array)
total = 0 # refers to O(1)
for each i in given array: #O(1)
total+=i #O(1)
return total #O(1)
解决方案
TL;DR:因为大 O 表示法用于量化算法,关于它如何随着输入的增加而表现。
我的意思是,如果数组大小变大,时间复杂度可能会变大,对吗?而且总数会越来越大,不会影响复杂度吗?
您将算法所花费的时间误认为是时间复杂度。
让我们首先澄清Big O
当前上下文中的符号是什么。从(来源)可以阅读:
大 O 表示法是一种数学表示法,用于描述当参数趋于特定值或无穷大时函数的限制行为。(..)在计算机科学中,大 O 表示法用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长来对算法进行分类。
非正式地,在计算机科学的时间复杂性和空间复杂性理论中,人们可以将Big O
符号视为算法的一种分类,它们分别具有关于时间和空间的某种最坏情况。例如,O(n)
:
如果算法的时间/空间复杂度为 O(n),则称该算法采用线性时间/空间或 O(n) 时间/空间。非正式地,这意味着运行时间/空间最多随着输入(source)的大小线性增加。
所以对于这段代码:
def find_sum(given_array)
total = 0
for each i in given array:
total+=i
return total
复杂性是O(n)
因为随着输入的增加,复杂性会线性增长,而不是恒定的。更准确地说Θ(n)
。
IMO 找出复杂性不是很准确,例如:
def find_sum(given_array)
total = 0 # refers to O(1)
for each i in given array: #O(1)
total+=i #O(1)
return total #O(1)
由于该Big O
符号表示一组具有一定渐近上限的函数;正如人们可以从源代码中读取的那样:
大 O 符号根据其增长率来表征函数:具有相同增长率的不同函数可以使用相同的
O
符号表示。
更准确的是:
def find_sum(given_array)
total = 0 # takes c1 time
for each i in given array:
total+=i # takes c2 time
return total # takes c3 time
所以时间复杂度是c1 + n * c2 + c3
,可以简化为 n。由于这个函数的下界和上界是一样的,我们可以Θ(n)
用O(n)
.
推荐阅读
- visual-studio - 使用 vsperfmon 获取在 IIS 中运行的 REST 服务的代码覆盖率
- mysql - SELECT JOIN 与条件 (OR) 交叉
- r - 对行中的单元格进行排序以匹配 R 中的相应列标题
- javascript - 有一种方法可以在 v3 中重新获取 fullcalendar 吗?
- asp.net-core - 异常时 Serilog 更改日志级别
- php - Symfony4 上的 Gandi + SwiftMailer
- xml - 存在 xmlns 属性时如何使用 XSLT?
- c - 在 mac os x 上是否有 clang 识别的常量?
- android - 移动网络提供商阻止对 api 的 volley 请求
- reactjs - 如何在“react app 2”中设置 SCSS 文件(ViewEncapsulated 方式),如 Angular 组件特定的 SCSS?