从my previous question开始,可以证明标准允许我们将空范围传递给标准算法吗?
第24.1 / 7段将“空范围”定义为范围[i,i)
(其中i
有效),而i
似乎是“可到达的”,但我我不确定这是否有资格证明。
特别是,在查看排序功能时会遇到麻烦。例如,std::sort
:
复杂性:
O(N log(N))
(其中N
==last
-first
)比较
由于log(0)
通常被认为是未定义的,而且我不知道0*undefined
是什么,这里会出现问题吗?
(是的,好吧,我有点迂腐。当然,没有自尊的 stdlib 实现会导致实际问题,传递给std::sort
的空范围但我想知道这里的标准措辞是否存在漏洞。)
答案 0 :(得分:10)
Big-O表示法是根据函数的限制来定义的。当且仅当 {{1}时,实际运行时间g(N)
为非负实数O(f(N))
的算法为lim N→∞ g(N)/f(N)
所有值g(N)/f(N)
大于某个常量C
的{{1}}小于某些正实数N
(k
和C
的确切值并不重要;您必须能够找到任何 k
和C
才能使其生效。 (谢谢你的纠正,杰西!)
您会注意到实际元素数量与big-O分析无关。 Big-O分析没有说明算法对少量元素的行为;因此,在k
定义f(N)
并不重要。更重要的是,实际运行时行为由不同的函数N=0
控制,即使g(N)
也可以在N=0
定义是未定义的。
答案 1 :(得分:6)
我似乎没有很多的问题空间。在§24.1/ 6中,我们被告知:
迭代器j被称为可以从迭代器i到达,当且仅当表达式++ i的应用程序的有限序列使得i == j时才会出现。
和$ 24.1 / 7:
当且仅当j可从i到达时,范围[i,j]才有效。
由于0
是有限的,[i, i)
是有效范围。 §24.1/ 7继续说:
将库中的函数应用于无效范围的结果是 未定义。
这并不是说有效范围保证定义的结果(合理的,因为还有其他要求,比如比较函数),但当然似乎暗示范围是空的,本身,不应该导致UB或类似的东西。然而,特别是,该标准使空范围只是另一个有效范围;空的和非空的有效范围之间没有真正的区别,因此适用于非空有效范围的情况同样适用于空的有效范围。
答案 2 :(得分:3)
除了@bdonlan给出的相关答案之外,还要注意f(n) = n * log(n)
确实有明确定义的限制,因为n
变为零,即0
。这是因为对数的偏差比任何多项式都慢,特别是慢于n
。一切都很好: - )