【发布时间】:2019-01-01 15:28:28
【问题描述】:
这里的答案有一些基本的统计数据,表明打包的链表可以通过合并排序执行非常快的排序:
What's the fastest algorithm for sorting a linked list?
我想知道是否有任何技术(有点像垃圾收集之类的后台作业)可以优化地重组链表以在运行时变得更紧凑。
【问题讨论】:
标签: performance sorting caching memory linked-list
这里的答案有一些基本的统计数据,表明打包的链表可以通过合并排序执行非常快的排序:
What's the fastest algorithm for sorting a linked list?
我想知道是否有任何技术(有点像垃圾收集之类的后台作业)可以优化地重组链表以在运行时变得更紧凑。
【问题讨论】:
标签: performance sorting caching memory linked-list
您是想节省空间还是时间?您总是可以分配一个新的“打包”列表并将碎片列表复制/排序到新的“打包”列表中。
我想知道先前答案中的结果,认为打包列表上的合并排序正在对先前测试中已经排序的列表进行操作。在我的测试中,我从一个大(大于缓存)打包链表开始,其中的值是伪随机整数,产生一个排序打包列表,其中节点是伪随机排序的,我称之为“分散”(非缓存友好)链表。然后,我用另一组伪随机数填充该列表,以测试该“分散”链表上的合并排序。
最快的链表排序(假设接近随机数据)是自下而上的合并排序,它使用指向列表的小(25 到 32)个指针(或引用)数组。基本算法的维基文章:
https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists
这里的问题是合并排序使用的是“分散的”链表,它对缓存不友好。
如上一个答案中所述,但与结果相冲突,将链表复制到数组中应该更快,然后使用快速排序或合并排序对数组进行排序(这些数组排序方法中的任何一种都会被缓存友好),然后从现在排序的数组创建一个新的排序打包列表。这假设空间不是分配数组或打包列表的问题。
其他替代方法是创建一个指向节点的指针数组以对列表中的数据进行适当的排序(不重新链接节点),或者创建一个指向节点的指针数组,对指针数组进行排序,然后重新链接列表节点根据指针。这里的问题再次是这些方法将使用“分散的”链表,它不是缓存友好的。
【讨论】: