Algorithm 生成';几乎分类';或';k排序';列表

Algorithm 生成';几乎分类';或';k排序';列表,algorithm,Algorithm,我想生成一些测试数据来测试一个函数,该函数将“k个排序”列表(每个元素最多有k个位置偏离其正确排序位置的列表)合并到一个完全排序的列表中。我有一个有效的方法,但我不确定它的随机性有多好,我觉得应该有一个更简单/更优雅的方法来做到这一点。我目前的做法是: 生成n个随机元素与整数索引配对 对随机元素进行排序 将每个元素的成对索引设置为其排序位置 向后遍历元素,将每个元素与列表中后面1到k个位置之间的随机距离的元素交换。仅当目标元素的成对索引是其当前索引时,才与目标元素交换(这样可以避免交换已经不合适

我想生成一些测试数据来测试一个函数,该函数将“k个排序”列表(每个元素最多有k个位置偏离其正确排序位置的列表)合并到一个完全排序的列表中。我有一个有效的方法,但我不确定它的随机性有多好,我觉得应该有一个更简单/更优雅的方法来做到这一点。我目前的做法是:

  • 生成n个随机元素与整数索引配对
  • 对随机元素进行排序
  • 将每个元素的成对索引设置为其排序位置
  • 向后遍历元素,将每个元素与列表中后面1到k个位置之间的随机距离的元素交换。仅当目标元素的成对索引是其当前索引时,才与目标元素交换(这样可以避免交换已经不合适的元素,并将其移动到远离其应该位置的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< /代码>……我不认为这将是非常均匀的。