C++ CPPPreference';什么是复杂性?

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

我开始理解算法时间复杂性的符号,比如“大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<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次行动对你来说是否足够快。