Performance 最昂贵的分拣操作

Performance 最昂贵的分拣操作,performance,sorting,Performance,Sorting,任何排序算法中最昂贵的操作是什么?是交换操作还是比较操作 我以为这是交换,但我的朋友认为这是比较。我能证明这种比较的唯一方法是成本更高的操作,即每个元素都需要比较,但不是每个元素都需要交换(即,如果元素已经处于正确位置,则不必交换)。因此,总的来说,从更大的角度来看,便宜的比较要多于少数昂贵的互换。但我不确定答案。有什么想法吗?假设所有操作都在RAM中完成,交换操作在原子上比比较操作快。(这很明显,2次读取然后执行一个cpu操作,而不是2次读取、2次写入以及其间的所有操作,包括注册表操作) 这显

任何排序算法中最昂贵的操作是什么?是交换操作还是比较操作


我以为这是交换,但我的朋友认为这是比较。我能证明这种比较的唯一方法是成本更高的操作,即每个元素都需要比较,但不是每个元素都需要交换(即,如果元素已经处于正确位置,则不必交换)。因此,总的来说,从更大的角度来看,便宜的比较要多于少数昂贵的互换。但我不确定答案。有什么想法吗?

假设所有操作都在RAM中完成,交换操作在原子上比比较操作快。(这很明显,2次读取然后执行一个cpu操作,而不是2次读取、2次写入以及其间的所有操作,包括注册表操作)

这显然取决于您的排序算法,有些因为元素较少而进行比较的次数较少,但交换的次数相对较多

以快速排序为例,它只做很少的比较,然后交换几乎所有的东西,还有一个更简单的算法,比如冒泡排序,它将所有元素相互比较,然后交换的次数更少。这还取决于基本数组,如果所有内容都已接近排序,则气泡排序不会交换任何内容,但仍会比较所有内容,而heapsort(例如)仍将“交换”所有内容

最后,(交换操作的平均次数)(交换操作的时间成本)/(补偿操作的平均次数)(补偿操作的时间成本)对于一个算法来说是很难估计的,并且对所有算法进行外推要多得多


我个人认为,任何排序算法的交换成本总的来说总是高于比较成本,但我不能用任何证据(这只是个人见解)来支持这一说法。

假设所有操作都在RAM中完成,交换操作在原子上比比较操作快。(这很明显,2次读取然后执行一个cpu操作,而不是2次读取、2次写入以及其间的所有操作,包括注册表操作)

这显然取决于您的排序算法,有些因为元素较少而进行比较的次数较少,但交换的次数相对较多

以快速排序为例,它只做很少的比较,然后交换几乎所有的东西,还有一个更简单的算法,比如冒泡排序,它将所有元素相互比较,然后交换的次数更少。这还取决于基本数组,如果所有内容都已接近排序,则气泡排序不会交换任何内容,但仍会比较所有内容,而heapsort(例如)仍将“交换”所有内容

最后,(交换操作的平均次数)(交换操作的时间成本)/(补偿操作的平均次数)(补偿操作的时间成本)对于一个算法来说是很难估计的,并且对所有算法进行外推要多得多


我个人认为,任何排序算法的交换成本总的来说总是高于比较成本,但我不能用任何证据来支持这一说法(这只是个人见解)。

这取决于具体情况。对于基于磁盘的数据,主要因素是将磁盘页放入内存所需的I/O。一旦页面存在,CPU就相对免费。对于小键(INT),交换可能比比较昂贵。对于非常小的元素大小,内存(缓存)区域可能成为主导(从wildplasser继续)。。。这意味着对于磁盘(或虚拟内存)上的列表来说,交换成本更高。但是,如果列表存在于缓存内存中,那么交换和比较的开销大致相同(顺序不变),并且所有交换或所有比较的累积开销取决于您使用的算法。对于基于磁盘的数据,主要因素是将磁盘页放入内存所需的I/O。一旦页面存在,CPU就相对免费。对于小键(INT),交换可能比比较昂贵。对于非常小的元素大小,内存(缓存)区域可能成为主导(从wildplasser继续)。。。这意味着对于磁盘(或虚拟内存)上的列表来说,交换成本更高。但是如果列表存在于高速缓存中,那么交换和比较的费用大致(顺序常数)相似,并且所有交换或所有比较的累计费用取决于您使用的算法。我不太理解当所有东西都在RAM中时,交换的明显部分更便宜:(在一台非常简化的计算机中(不包括页面文件等概念,因为它增加了大量的随机性)如果您的数组位于ram中,为了比较两个值,您必须将这两个值都加载到注册表中,然后使用ALU比较这两个值。对于交换,您必须在注册表中记住这两个ram地址,然后将这两个值放在其他注册表中,然后使用第一个值的地址写入ram以写入第二个值等uld向您解释为什么它需要更长的时间,但我必须向您解释其他概念,如周期、微码等。采取上述预防措施,这是一个简化的系统,更先进的使用流水线,增加了另一层的复杂性。如果您真的想知道关于这个主题的一切,我建议您阅读和学习about计算结构/计算机设计,因为在考虑操作成本时,这才是真正重要的。如果你已经有了一些组件,这将更容易解释。(同样,我在1评论中的示例有轻微缺陷,但总体思路是:在ram中读写比只读和使用ALU需要更多的时间)@阿德里安克:是我遗漏了什么,还是你的解释没有证明比较比交换更便宜?怀疑你写的东西可能不是你想要的?(如果不是,那么我必须承认我和布加奥在一起,虽然解释很有道理,但我没有遵循你的结论!)我不太明白交换的明显部分