【问题标题】:Generating data to test sorting algorithm生成数据以测试排序算法
【发布时间】:2017-03-04 07:06:48
【问题描述】:

我想生成数据来测试排序算法。这完成了两件事:

  1. 查找错误。如果实际上排序正确,则可以轻松检查输出
  2. 分析代码并找出哪些情况下哪些部分需要更长的时间。

我刚才问了How do you test speed of sorting algorithm?这个问题,但是这个问题特别关注生成数据。

我在想

  1. 已排序
  2. 反向排序
  3. 随机
  4. 排序,然后在随机选择的元素中进行 n 反转,看看更改 n 如何影响运行时间

有什么建议吗?是否存在任何可以使这更容易的框架?我认为 JUnit 可能很有用。

comp sci se 上的这个问题中,一个答案听起来像是添加反转并计算它们并没有多大意义:

反转次数可能适用于某些情况,但有时 不足的。 [3] 中给出的一个例子是序列

$$\langle \lfloor n/2 \rfloor + 1, \lfloor n/2 \rfloor + 2, \ldots, n, 1, \ldots, \lfloor n/2 \rfloor \rangle$$

具有二次反转数,但仅包含两个 上升运行。它几乎已排序,但这不是由 倒置。

我的数学不是特别强,不明白这个例子如何说明计算反转次数有什么问题?只是学术吗?说“倒数的二次数”有什么意义?

【问题讨论】:

  • 我的不科学观察:需要排序的真实数据通常是(此处未按特定顺序列出):a)有效随机(因为生成数据的顺序基于不同的key),b) 已经排序,c) 已经以相反的顺序排序,或 d) 大部分排序时(相对)少数项目不合适。而且,需要排序的真实数据总是有很多重复的键 - N 的数量可能比 K 多几个数量级。
  • @500-InternalServerError 你好像有经验,请问出自哪里?是否有任何在线免费样本数据来源?
  • 还可以尝试使用一些倒置进行反向排序。要将数据添加到现有的排序文件中,请尝试使用 90% 的排序,最后使用 10% 的随机记录。

标签: algorithm sorting language-agnostic profiling


【解决方案1】:

使用整数数学,$$...$$ 序列可以表示一个数组:

    1      2      n/2              n    indices
n/2+1, n/2+2, ...,  n, 1, 2, ... n/2    array values

如前所述,只有两个升序。

根据反转的定义,如果 a[i] > a[j] 且 i

反转计数和排序时间复杂度之间的关系取决于排序算法。在示例数组上使用冒泡排序将具有时间复杂度 O(n^2)。在数组上使用通用合并排序将是 O(n log(n)),具有接近最佳情况的比较计数。使用自然归并排序会找到两个排序的运行,并为 O(n) 的时间复杂度执行一次归并。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多