我正在测试一种算法,该算法对k排序的数组进行排序(每个元素最多都是k位置,远离其正确的排序位置)。
我很难生成测试数据 - 我无法通过k位置随机交换元素,因为我可能最终交换元素两次。我可以跟踪我交换的元素但是我需要O(N)空间。我也可以使用大小为k + 1的随机堆,但这听起来很傻。
STL中是否有任何内容可以帮助我解决这个问题?这似乎是一个常见的问题,但我的简短研究只发现了总洗牌的算法(我认为STL实现了Fisher-Yates)。
答案 0 :(得分:1)
由于准备随机测试数据不需要超高效,因此数据可能通常是无关紧要的。您可以将测试值作为提供正确位置范围的元素或对的正确位置。例如,对的数组:
将随机生成器的状态存储在某处。
选择两个随机元素,其位置不超过其他的原始位置(或范围)的k个位置并交换。重复N次,测试数据就绪。
如果您需要稍后获得相同的序列,则恢复随机生成器状态并重复算法。