有没有办法区分排序算法和可执行文件?我在大学编程邮件列表中发现了这个问题,如下所示:假设我有许多可执行文件,它们使用不同的算法对数据数组进行排序。我知道用什么算法来编写那些可执行文件,但我不知道在哪个可执行文件中使用了哪种算法。使用的算法是:
答案 0 :(得分:3)
您可以通过为它们提供越来越大的输入来检查它们的渐近行为,但是许多列出的算法属于相同的复杂性类,因此您无法区分,例如合并排序和基于此的快速排序单独
要打破其中的一些退化,您还可以查看不同可执行文件的内存使用情况,继续使用合并排序和快速排序示例,您会看到合并排序需要额外的O(n)空间,而快速排序会只需要O(log n)额外空间(堆栈大小)来执行排序。
你可能能够推断出一些东西,例如为它们提供退化输入,例如兆字节的零或兆字节的反向字符串。但是,除了有根据的猜测,你将无法做更多的事情。
(下面的优秀评论。将其设为社区维基,随时可以编辑。)
答案 1 :(得分:1)
更改数据类型和输入的数据量并比较执行时间。
更改数据的性质(重复小数字(几个数字),与广泛分布的数据没有重复)可帮助您确定排序算法是否是基于比较的(基数/桶排序与基于比较的排序)。例如,排序1000000个1位数的数字对于桶排序是超快的,因为它主要是从数字位数开始缩放,但是对于主要根据数据集大小缩放的基于比较的排序来说更慢。
您还可以定制数据以使某些算法比其他算法更好地执行,例如使用各种算法的最佳案例场景和最坏情况场景,并查找执行时间最显着变化的.exe。
例如,要区分插入排序和选择排序,请使用几乎排序的结果集,如(2, 3, ...98, 99, 1
)。插入排序将执行一次插入移位,然后下一次检查将注意到列表已排序。这几乎不需要时间。选择sort必须在每个索引处交换,因为最小值始终位于最终索引处,这将花费很长时间。
答案 2 :(得分:1)
在CMD中使用以下命令,您将找到我们可以订购它们的每个代码的处理时间。 回声%时间% 文件名.exe echo%time%