【发布时间】:2016-08-20 07:15:10
【问题描述】:
This answer 通过比较它们的内容来确定两个字符串是否是排列。如果它们包含相同数量的每个字符,则它们显然是排列。这是在 O(N) 时间内完成的。
我不喜欢这个答案,因为它重新定义了 is_permutation 的设计目的。也就是说,is_permutation 的复杂性为:
至多 O(N2) 次应用谓词,或者如果序列已经相等,则恰好 N 次,其中
N=std::distance(first1, last1)
所以我不能提倡使用is_permutation,它比手工旋转算法慢几个数量级。但是标准的实施者肯定不会错过如此明显的改进吗?那么为什么是is_permutationO(N2)?
【问题讨论】:
-
看起来像是时间/空间的权衡——更快的解决方案需要一个由您正在排列的值索引的计数数组。如果这些值是字节,则它是一个包含 256 个条目的数组,如另一个答案所示。如果它们更大,则数组可能会大到无法接受。
-
为什么不先排序,然后比较呢?事实上,也许这就是
std:: is_permutation所做的? Nlog(N) 平均,但 N^2 在最坏的情况下? -
@Aaron: std::is_permutation 无法排序,因为它不知道如何对元素进行相互排序(因为它不认为这样的事情是有意义的!),它只知道如何测试它们是否相等。
-
@moonshadow 非常棒且引人入胜的评论,直到现在我还没有注意到
is_permutation不需要定义小于运算符。 -
"我不能提倡使用 is_permutation,因为它比手工旋转算法慢得多。" 除非你的手工旋转算法是 O(0),否则你可以请放心,
is_permutation不能以指数级速度变慢。
标签: c++ big-o permutation string-comparison standard-library