1
11
这可能是因为冒泡排序是数组的一种算法,但您使用的是链表:在一个数组中交换两个项目(这是C使用的)是O(1)时间,不需要额外的空间,但在链表中交换两个项目(这是Haskell使用的)是O(n)时间和O(n)空间(这是堆空间,而不是堆空间)。但是,我在跟踪您的代码时遇到了一些问题(您确定这是相同的算法吗?)而且您的累加器可能处理交换的时间复杂性。但是,即使这样,您也要分配一个新的累加器列表;这肯定会分配额外的空间,我认为这可能仍然是导致haskell性能下降的原因之一。
还有,你为什么有
|
2
6
因为冒泡排序的内存位置属性非常差,所以我认为您的实现很可能是内存带宽限制的,尽管我没有做任何测试。
土生土长的哈斯克尔
您还通过一对链表(通常称为“拉链”)模拟可变数组。这是相当有效的,只要你在一个移动的焦点周围进行局部修改,这在大多数情况下都是如此。但是,在每次传球结束时,您需要将焦点移回开始位置(这是
所以,我认为你的基准并不令人惊讶。
如果您想在haskell中编写一个快速的BubbleSort,那么接下来的方法是直接在
|
3
5
您可以在haskell中更直接地表达算法,而不需要反向调用:
在这里,局部冒泡函数执行冒泡值的任务,合并函数处理重建新的冒泡列表和交换标志。BubbleSort中的case表达式是haskell中的一个直接表达式,“在列表中冒泡一次,如果我们交换了任何东西,就再做一次”。 这个版本比原来的快35%。 P.S.:代码和驱动程序主文件如下: http://bitbucket.org/mtnviewmark/haskell-playground/src/tip/cafe/ |
4
2
我注意到你通过了
正如其他人提到的,这与C和Haskell中的算法不同,因为数据结构不同——Haskell使用了一个不可变的Unicode字符链接列表。你的目的是什么?
我想(1)不是这样的,因为您也在C中使用冒泡排序。如果(2),则应使用
不管是什么情况,在C语言中看到不可变的链表递归冒泡类型的Unicode字符串的性能是很有趣的。 |
Hatsune Miku · 比较或if语句是否更快[已关闭] 1 年前 |
Black Swan · 无法解压缩的值太多(应为2)错误 1 年前 |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
Balfar · 处理NumPy阵列上的循环最有效的方法是什么? 2 年前 |
Daniel · C#轻松存储快速访问的大型位矩阵 6 年前 |
halbe · 优化音频DSP程序的numpy计算 6 年前 |
Afsara · 是否有任何方法不能优化我们的应用程序? 6 年前 |