Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果存在像基数排序这样的线性时间排序算法,我们什么时候需要使用比较排序?_Algorithm_Sorting_Comparison - Fatal编程技术网

Algorithm 如果存在像基数排序这样的线性时间排序算法,我们什么时候需要使用比较排序?

Algorithm 如果存在像基数排序这样的线性时间排序算法,我们什么时候需要使用比较排序?,algorithm,sorting,comparison,Algorithm,Sorting,Comparison,既然所有比较排序算法都至少需要n lg n时间,那么当我们可以将快速排序列表中的项表示为位,并使用基数排序之类的线性排序时,为什么还要使用类似于快速排序的方法呢?基数排序往往表现出较差的缓存局部性,例如,请参阅对受缓存影响的不同排序算法的分析(与快速排序和合并排序相比,跳到结论部分讨论基数排序的缓存局部性较差)。快速排序和合并排序对数据进行分区,这样经过几次迭代后,分区将适合几行缓存,而基数排序则会不断对数据进行洗牌。此外,基数排序要么需要为其存储桶使用链接数据结构(表现出较差的缓存性能),要么

既然所有比较排序算法都至少需要n lg n时间,那么当我们可以将快速排序列表中的项表示为位,并使用基数排序之类的线性排序时,为什么还要使用类似于快速排序的方法呢?

基数排序往往表现出较差的缓存局部性,例如,请参阅对受缓存影响的不同排序算法的分析(与快速排序和合并排序相比,跳到结论部分讨论基数排序的缓存局部性较差)。快速排序和合并排序对数据进行分区,这样经过几次迭代后,分区将适合几行缓存,而基数排序则会不断对数据进行洗牌。此外,基数排序要么需要为其存储桶使用链接数据结构(表现出较差的缓存性能),要么需要在大型阵列上使用链接数据结构(这会浪费内存)


此外,根据基数排序的基数大小,其常量因子可能大于quicksort/mergesort的日志因子。在极端情况下,使用基数为2的64位整数,基数排序的常数因子为64(每位一次),而quicksort/mergesort的日志因子不太可能那么大(因为这意味着要对2^64个元素进行排序)

基数排序往往会显示出较差的缓存位置,例如,请参阅对受缓存影响的不同排序算法的分析(与快速排序和合并排序相比,跳到结论部分讨论基数排序的缓存局部性较差)。快速排序和合并排序对数据进行分区,这样经过几次迭代后,分区将适合几行缓存,而基数排序则会不断对数据进行洗牌。此外,基数排序要么需要为其存储桶使用链接数据结构(表现出较差的缓存性能),要么需要在大型阵列上使用链接数据结构(这会浪费内存)


此外,根据基数排序的基数大小,其常量因子可能大于quicksort/mergesort的日志因子。在极端情况下,使用基数为2的64位整数,基数排序的常数因子为64(每位一次),而quicksort/mergesort的日志因子不太可能那么大(因为这意味着要对2^64个元素进行排序)

基数排序往往会显示出较差的缓存位置,例如,请参阅对受缓存影响的不同排序算法的分析(与快速排序和合并排序相比,跳到结论部分讨论基数排序的缓存局部性较差)。快速排序和合并排序对数据进行分区,这样经过几次迭代后,分区将适合几行缓存,而基数排序则会不断对数据进行洗牌。此外,基数排序要么需要为其存储桶使用链接数据结构(表现出较差的缓存性能),要么需要在大型阵列上使用链接数据结构(这会浪费内存)


此外,根据基数排序的基数大小,其常量因子可能大于quicksort/mergesort的日志因子。在极端情况下,使用基数为2的64位整数,基数排序的常数因子为64(每位一次),而quicksort/mergesort的日志因子不太可能那么大(因为这意味着要对2^64个元素进行排序)

基数排序往往会显示出较差的缓存位置,例如,请参阅对受缓存影响的不同排序算法的分析(与快速排序和合并排序相比,跳到结论部分讨论基数排序的缓存局部性较差)。快速排序和合并排序对数据进行分区,这样经过几次迭代后,分区将适合几行缓存,而基数排序则会不断对数据进行洗牌。此外,基数排序要么需要为其存储桶使用链接数据结构(表现出较差的缓存性能),要么需要在大型阵列上使用链接数据结构(这会浪费内存)


此外,根据基数排序的基数大小,其常量因子可能大于quicksort/mergesort的日志因子。在极端情况下,使用64位整数的基数为2,基数排序的常数因子为64(每位一次),而quicksort/mergesort的日志因子不太可能那么大(因为这意味着要对2^64个元素进行排序)

使用SIMD内核对短数组进行排序的mergesort的现代实现可能非常、非常快。描述一个这样的实现。这里的主要优点是SIMD内核可以在每个时钟周期内进行多次比较和交换,获得并利用每个时钟周期内要排序的阵列的若干信息位

快速排序需要一个测试、一个存储和每次迭代中两个指针中的一个的增量,这形成了一个巨大的依赖链。这并不好,因为这意味着您每隔几个时钟周期就会获得一点关于阵列的信息

基数排序与快速排序有相同的问题(每个过程都是一个巨大的依赖链,从一个较大的、均匀分布的集合中访问并增加一个指针)。但是,在均匀分布的输入上,使用五位或六位键正确实现的MSD基数排序可以在输入上一次完成快速排序需要五次或六次完成的工作。我最近没有对这些东西进行计时,但是一个好的MSD基数排序可能仍然是对
int
s或
long
s的大型数组进行排序的最佳方法


如果您的输入分布不均匀,并且与输入中的键数量相比,可能的键的范围很大,那么这些关于基数排序的东西都不会让您在夜间感到温暖。

使用SIMD内核对短数组进行排序的mergesort的现代实现可能非常、非常快。描述一个这样的实现。这里的主要优点是SIMD内核可以在每个时钟周期内进行多次比较和交换,从而获得和利用多个位