C++ CPPPreference';什么是复杂性?
我开始理解算法时间复杂性的符号,比如“大O”。然而,我不理解CPPPreference中关于不同算法复杂性的许多描述。它不涉及我最终学会的符号,比如“大O”和“大欧米茄”。。我应该如何解释这样的复杂性描述 最多进行C++ CPPPreference';什么是复杂性?,c++,C++,我开始理解算法时间复杂性的符号,比如“大O”。然而,我不理解CPPPreference中关于不同算法复杂性的许多描述。它不涉及我最终学会的符号,比如“大O”和“大欧米茄”。。我应该如何解释这样的复杂性描述 最多进行S*N比较,其中S=std::distance(S_first,S_last)和N=std::distance(first,last) 它的意思就是写什么。它将不再对长度为S和N的输入进行S比较。e、 g如果有长度为5和3的数组,则只进行15次比较: std::array<cha
S*N
比较,其中S=std::distance(S_first,S_last)
和N=std::distance(first,last)
它的意思就是写什么。它将不再对长度为
S
和N
的输入进行S
比较。e、 g如果有长度为5和3的数组,则只进行15次比较:
std::array<char, 3> a;
std::array<char, 5> b;
std::search(b.begin(), b.end(), a.begin(), a.end());
std::数组a;
std::数组b;
std::search(b.begin(),b.end(),a.begin(),a.end());
问题在于,大O表示法描述了复杂性的渐近上界,通常只是复杂性相对于单个变量的扩展方式。当有多个变量时,假设它们是独立的,它们都趋向于无穷大
它没有描述小值N的确切操作数,也没有提供任何方法来描述具有多种类型操作的函数,这些操作可能具有不同的运行时成本,如果您有多个但非独立的变量,它不会显示它们之间的关系,直到您自己减少表单
在本例中,您有两个变量,渐近复杂性取决于其中哪些变量是变化的,哪些变量占主导地位。因此,我们可以称之为O(S*N)
,但在这些示例中,我们可以做得更好:
S
保持不变,因此O(S*N)≃ O(N)as N→∞代码>
S=N/K
中的某个常数K。现在我感兴趣的是O(S*N)=O(N²/K)≃ O(N²)作为N→∞代码>
S*N
比较,其中S=std::distance(S_first,S_last)
和N=std::distance(first,last)
它的信息量比
O(S*N)
大得多,不仅因为它适用于所有S
和N
,而不仅仅是“足够大”的值。它说“最多S*N比较”,这与O(S*N)
的定义相同,哪个部分容易混淆<代码>标准::距离?当你阅读线性复杂度的O(N)时,N是什么?如果你有两个不同长度的序列,你如何决定哪一个是N?它说“最多S*N比较”,这意味着“O(S*N)
对于最坏的情况。”@Kos这不是一回事S*N
是O(S*N)
,但是O(S*N)
并不总是@hvd很幸运地找到一个例子,其中容器的两个元素之间的比较取决于容器的大小。如果任何一种方式,你都可以将其描述为O(S*N)
,那么大O符号就完全足够了。如果S
是常量,您应该将其衰减为O(N)
。如果S与N
成比例,则应将其写成O(N²)
。写O(S*N)
而不解释S和N是如何变化的是无济于事的,因为它隐含地意味着N
在增加,并且没有说明S
的行为。@Rocket-“最多N/2次交换…大约3次比较,每次调用1.5次交换”仍然是线性复杂度。它提供的信息比单独的O(N)
更多,因为你可以对每种类型的操作的成本进行推理(或基准测试),其中big-O只是给出任意大N的大致形状。因此,如果你用复杂度符号(如“big O”和“big Theta”)编写它,它不会包含所有给出的信息吗?但是,如果你一定要把它改写成复杂度符号,你会写什么呢?Big-O符号不是编码所有性能信息的灵丹妙药,它只是——而且非常具体地——一种描述函数的粗略形状的方式,因为它趋于极限。如果你知道你真的只需要比较4件事,把它写成O(N)
或O(4)
或其他什么都没用的东西。你只需要担心这4次行动对你来说是否足够快。