【问题标题】:Why is worst case of is_permutation O(n^2)?为什么最坏的情况是 is_permutation O(n^2)?
【发布时间】:2021-06-12 21:28:39
【问题描述】:

C++ 文档说is_permutation 的最坏情况时间复杂度是 O(N^2):

最多 O(N^2) 次应用谓词,或者如果序列已经相等,则恰好 N 次,其中 N=std::distance(first1, last1)。但是,如果 ForwardIt1 和 ForwardIt2 满足 LegacyRandomAccessIterator 和 std::distance(first1, last1) != std::distance(first2, last2) 的要求,则不会应用谓词。

但是,IMO 在最坏的情况下应该是 O(NlogN) - 我们不能只对O(NlogN) 中的两个序列进行排序然后比较它们吗?我错过了什么?

【问题讨论】:

  • 使用 operator== 比较元素:后面的类型不必定义运算符 <
  • 如果您进行了排序,那么您将修改数据,这可能很糟糕。也有可能是数据集无法排序。
  • @molbdnilo 我不认为元素的可复制性是必需的。也可以使用元素的索引。

标签: c++ algorithm permutation


【解决方案1】:

is_permutation 不要求范围是可排序的。它只使用bool-valued 比较谓词。

此外,范围是不可变的,因此即使可以对它们进行排序,排序也意味着在其中一个范围上创建索引。这会将O(N) 内存成本添加到索引生成的O(NlogN) 成本中。

【讨论】: