【问题标题】:Order of Complexity of standard lib functions标准库函数的复杂度顺序
【发布时间】:2011-03-11 10:43:57
【问题描述】:

对不起,如果这是一个愚蠢的问题,但是......

这段代码的复杂度顺序是O(n):

char buf[] = "hello world";
size_t length = strlen(buf);

for(size_t i = 0; i < length; i++)
{
    //do stuff
}

这段代码是O(n^2):

char buf[] = "hello world";
for(size_t i = 0; i < strlen(buf); i++)
{
    //do stuff
}

因为 strlen 是 O(n)。

但是谁说strlen是O(n),标准里有定义吗,一定是O(n)吗?

我如何确定知道任何标准函数的复杂度顺序是多少?

【问题讨论】:

    标签: c++ complexity-theory


    【解决方案1】:

    是的,it has to be at least O(n) by design - 它接收第一个字符的地址,并且必须通过扫描字符串来找到空字符,它只能通过推进和检查每个字符来做到这一点。

    【讨论】:

      【解决方案2】:

      标准中定义了某些功能的复杂性。其他的,包括那些从 C 继承的,没有。对于那些,除了实施质量之外,您不能依靠其他任何东西来将其保持在最低水平。

      【讨论】:

      • 这是否意味着任何代码使用具有未知复杂性顺序的函数的复杂性顺序本身是不可知的?
      • @Bagpuss:是的,除非另有说明,否则任何代码都是黑盒子。
      • 这取决于您正在查看的复杂性界限 - 对于 strlen,最坏情况下限是线性的 - 但如果不知道实现,您就无法知道上限。然而,鉴于线性算法有点明显,常识表明它是以这种方式实现的。
      • 我们非常依赖实施来做正确的事情。在标准中指定复杂性很重要的情况是在同一数据结构上的不同操作的复杂性之间进行权衡。以list::splice 对list&lt;&gt;::size() 的效果为例。
      【解决方案3】:

      是的,strlen 是 O(n),但是在这个特定的示例中(使用字符串文字),一个好的优化器可以将 strlen(buf) 替换为 sizeof(buf)。有些编译器会这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-11
        • 2013-10-31
        • 2013-07-06
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多