【问题标题】:Complexity of algorithms other than asymptotic (Big-O - notation)渐近算法以外的算法的复杂性(Big-O - 表示法)
【发布时间】:2016-07-01 10:43:03
【问题描述】:

除了渐近复杂度(Big-O notation)之外,用于评估算法的最常用的概念是什么?

示例

假设我有以下算法调用函数 func,复杂度为 O(1)。那么这个算法将具有复杂度 O(N1 x N2)。但是,如果我事先知道 N1 是有限的 [1,5],那么最坏情况的复杂度将是 O(5 x N2),根据定义,它也是 O(N2)。

for i in range(N1):
    for j in range(N2):
        func(i,j)

如果我可以使用函数 func2 遇到此算法的不同实现,同样复杂度为 O(1),但现在使用不同的外部循环范围 N3。该算法预计为 O(N3 x N2)。但是,如果我知道 N3 的范围是 [10,50],那么最坏情况的复杂度将是 O(50 x N2),也就是 O(N2)。

for i in range(N3):
    for j in range(N2):
        func2(i,j)

问题

所以,这是一个简单的证明渐近符号是有用的,但对于一些更具体的情况可能不是最合适的比较方法。如何比较这两种算法?最常用的方法有哪些?仅使用算法所需的迭代次数是技术上严格的指标吗?

有什么推荐的参考吗?

【问题讨论】:

    标签: python algorithm performance complexity-theory


    【解决方案1】:

    你的问题很大。阅读算法复杂性和指标。

    您的问题是,即使您不使用 Big-O(还有许多其他 small-o Big-omega、small-omega、theta 等),您也无法像看起来那样轻松地比较算法你要!主要原因是你必须首先明确定义你要测量的内容,这并不容易。通常,您不需要详细信息。为什么?因为我们知道我们总是可以线性加速任何算法(粗略地说,特殊情况在这里不相关)。所以乘法常数是不相关的。

    现在,您想要的是(无论是最坏情况、最佳情况还是平均情况)更多与精确复杂性相关的运行时间预测函数。但即使在那里,也有许多陷阱和陷阱。您可能认为具有精确复杂度(例如 3n+45)的两种算法在同一平台上运行速度一样快,但这可能是错误的!如果您没有准确定义您的计数,那么这可能是错误的。一个人可能会使用 3n 次乘法和其他 3n 次加法(或更微妙的混合),并且乘法和加法的运行时间通常不一样。最糟糕的是,由于架构可能使用管道、预测和其他运行时优化,这可能会极大地改变运行时间。甚至环境平台也可能引入严重的偏差,想想虚拟内存、缓存、各种编译器优化等等。

    所以,答案是:这取决于您要预测什么...这就是为什么有这么多复杂性度量的原因。

    【讨论】:

    • 我完全同意你的看法。你有什么具体的推荐信吗?
    • 也许 Knuth 的著作是一个最好的起点?他讨论了许多这些方面......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多