基准测试和排列算法的快速分析

我决定用英语写这篇小型评论,希望开始一个新趋势,我希望这会改善相互交流(别介意!这只是一个年轻的大都会主义者的全球化思想)。

图片 我敦促您以英语回复此帖子,即使您在使用该语言时遇到一些困难。 我现在不在写诗,我想我们可以避免英语技能的尴尬。 但是我要谈论一些诗意的问题 -当然,关于组合,尤其是关于生成对象。 我的意思是排列。 让我们从所有童话故事开始的话开始:从前在哈布拉哈伯上(或曾经,我不知道,也许曾经)发表过有关生成超置换的有趣手稿。 该主题使一些habrauser不得不编写一些代码(请参阅注释),我也是如此。 实际上,这一事件使我再次陷入了算法加速和测试的古老问题。

我对数学语言和公式不够熟练,所以我现在只打印三种不同的算法,这些算法由我在C89中进行编码:

  1. Johnson-Trotter算法
  2. Naryana算法
  3. Mrrl (A. Astrelin)开发的此枢纽算法

上面提到的所有算法都不是递归的。

我认为我的Johnson-Trotter算法版本不是最好的。 不过,我还是赶紧向您展示它在n = 10时产生的结果

控制台输出的时间(意味着printf)
真正的1m19.410s
用户0m31.899s
sys 0m36.253s

没有控制台输出的时间
真正的0m2.241s
用户0m2.236s
sys 0分0.004秒

的Mrrl代码版本

带控制台输出
真正的1m11.565s
用户0m27.429s
SYS 0分32.997秒

没有控制台输出
真正的0m0.489s
用户0m0.486s
sys 0分0.002秒

最后一种类似Naryana的算法给出了这样的结果

带控制台输出
真实1m10.223s
用户0m8.617s
sys 0m38.165s

没有控制台输出
真正的0m0.453s
用户0m0.449s
sys 0分0.004秒

感谢您的阅读。 我用这个网站进行拼写检查。 当然,您绝对有权问我,标题中承诺的快速分析在哪里?! 目前,我无法简单回答哪个算法( 不要惊慌!这个词是世界语这个普通词 !)更快。 如果可能的话,也许应该调整这三个代码脚本,并在许多情况下进行测试。 快速浏览伪代码(主要阅读描述)后,我已经对第一和第三种算法进行了编码。 第二种算法(如果我没记错的话)是较早版本在Habrahabr上发布的算法的严格版本。

Source: https://habr.com/ru/post/zh-CN433118/


All Articles