Algorithm 生成';几乎分类';或';k排序';列表
我想生成一些测试数据来测试一个函数,该函数将“k个排序”列表(每个元素最多有k个位置偏离其正确排序位置的列表)合并到一个完全排序的列表中。我有一个有效的方法,但我不确定它的随机性有多好,我觉得应该有一个更简单/更优雅的方法来做到这一点。我目前的做法是:Algorithm 生成';几乎分类';或';k排序';列表,algorithm,Algorithm,我想生成一些测试数据来测试一个函数,该函数将“k个排序”列表(每个元素最多有k个位置偏离其正确排序位置的列表)合并到一个完全排序的列表中。我有一个有效的方法,但我不确定它的随机性有多好,我觉得应该有一个更简单/更优雅的方法来做到这一点。我目前的做法是: 生成n个随机元素与整数索引配对 对随机元素进行排序 将每个元素的成对索引设置为其排序位置 向后遍历元素,将每个元素与列表中后面1到k个位置之间的随机距离的元素交换。仅当目标元素的成对索引是其当前索引时,才与目标元素交换(这样可以避免交换已经不合适
正如我所说,这是可行的,但我对替代/更好的方法感兴趣。步骤1:随机排列长度为k的不相交段。(例如1到K,K+1到2k…) 步骤2:通过交换再次有条件地排列(它们不会打破k排序的假设(1+t yo k+t,k+1+t到1+2k+t…),其中t是介于1和k之间的数字(最好是k/2)
可能用不同的t重复步骤2多次。如果我理解这个问题,您需要一个算法来随机选择单个
k
-长度排序列表n
,从所有k
-长度排序列表n
的宇宙U
中统一选择。(然后将运行此算法m
次,以生成m
列表作为输入测试数据。)
第一步是数一数。U的大小是多少
下一步是枚举它们。在整数(1,2,…,|U |)和k
之间创建任何一对一映射F
-长度n
的排序列表
然后随机选择一个介于1和|U |
之间的整数x
,然后应用F(x)
来获取列表。我认为您可以用随机整数填充数组,然后使用自定义停止条件对其运行快速排序
如果在特定的快速排序递归中,start
和end
索引之间的距离小于k
,则只需返回,而不必继续重复
由于快速排序的工作方式,start..end
间隔中的每个数字都属于该区域的某个位置;最坏的情况是array[start]
可能真的属于array[end]
(反之亦然)以真正排序的顺序。因此,确保开始
和结束
之间的距离不超过k
就足够了。您可以生成一个随机数数组,然后像中一样进行h排序,但当h小于k时,不需要最后的五个排序步骤,您是否要求输出为完全排序(0-sorted)还是仅仅k-sorted?输出是k-sorted(用作合并k-sorted列表的算法的测试输入)。我刚刚意识到我的输入和输出混淆了。您将创建多个列表,每个列表都是k-sorted的。您正在测试的算法将这些列表合并到一个列表中。这就是(单个,大型)合并列表将是0排序的还是k排序的?我要测试的算法旨在生成一个完全排序的列表,但这对于这个问题来说并不重要。我只想为它生成适当的k排序测试输入。这只是描述有限集上的一致选择是什么,它不会产生一个有用的算法但是这意味着在中间范围内的值将小于<代码> k< /代码>……我不认为这将是非常均匀的。