【发布时间】:2017-03-04 07:06:48
【问题描述】:
我想生成数据来测试排序算法。这完成了两件事:
- 查找错误。如果实际上排序正确,则可以轻松检查输出
- 分析代码并找出哪些情况下哪些部分需要更长的时间。
我刚才问了How do you test speed of sorting algorithm?这个问题,但是这个问题特别关注生成数据。
我在想
- 已排序
- 反向排序
- 随机
- 排序,然后在随机选择的元素中进行
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