如何用STL对数组进行k-shuffle?

时间:2016-02-08 17:40:42

标签: c++ stl shuffle

我正在测试一种算法,该算法对k排序的数组进行排序(每个元素最多都是k位置,远离其正确的排序位置)。

我很难生成测试数据 - 我无法通过k位置随机交换元素,因为我可能最终交换元素两次。我可以跟踪我交换的元素但是我需要O(N)空间。我也可以使用大小为k + 1的随机堆,但这听起来很傻。

STL中是否有任何内容可以帮助我解决这个问题?这似乎是一个常见的问题,但我的简短研究只发现了总洗牌的算法(我认为STL实现了Fisher-Yates)。

1 个答案:

答案 0 :(得分:1)

由于准备随机测试数据不需要超高效,因此数据可能通常是无关紧要的。您可以将测试值作为提供正确位置范围的元素或对的正确位置。例如,对的数组:

  1. 1,1
  2. 2,4
  3. 2,4
  4. 2,4
  5. 5,6
  6. 5,6
  7. 7,7-
    ...
  8. 将随机生成器的状态存储在某处。

    选择两个随机元素,其位置不超过其他的原始位置(或范围)的k个位置并交换。重复N次,测试数据就绪。

    如果您需要稍后获得相同的序列,则恢复随机生成器状态并重复算法。