【问题标题】:what is more expensive: compare or accessing an index of array什么更昂贵:比较或访问数组的索引
【发布时间】:2016-08-31 18:51:45
【问题描述】:

基本上我在 youtube 上看到了我的视频,该视频显示了排序算法的可视化,他们提供了程序,以便我们可以使用它.. 程序计算了两个主要内容(比较、数组访问).. 我想看看哪一个(合并和快速)排序是最快的..

100个随机数

快速排序:
比较 1000
数组访问 1400

归并排序:
比较 540
数组访问 1900

所以快速排序使用较少的数组访问,而合并排序使用较少的比较,并且差异随着索引的数量而增加..那么其中哪一个对计算机来说更难做?

【问题讨论】:

  • 对其进行基准测试。顺便问一下,你看的是哪个视频?
  • 这是什么语言?不可知论者?
  • 你可以尝试用10000000个随机数来做,然后在任务管理器中检查你的cpu并比较cpu。
  • 我忘了这是什么视频,但他们制作的程序和源代码在这里panthema.net/2013/sound-of-sorting它是用c++制作的..它最多只能排序到2048

标签: arrays sorting quicksort mergesort


【解决方案1】:

排序性能取决于许多条件,我认为回答您的确切问题不会带来有用的答案(您可以自己轻松地对其进行基准测试)。

  1. 对少量元素进行排序通常不是时间紧迫的,基准测试对较大的列表有意义。
  2. 此外,对整数数组进行排序的情况也很少见,对对象列表进行排序并比较它们的一个或多个属性更为常见。
  3. 如果您追求性能,请考虑多线程。
  4. MergeSort 是稳定的(相等的元素保持它们的相对位置),QuickSort 不是,因此您在比较不同的结果。

在您的示例中,快速排序算法在大多数情况下可能更快。如果比较更复杂,例如string 而不是 int 或多个字段,MergeSort 将变得越来越有效,因为它需要更少(昂贵)的比较。如果要对排序进行并行化,MergeSort 是因为算法本身就注定的。

【讨论】:

    【解决方案2】:

    数字已关闭。 100 个随机数的实际运行结果。请注意,快速排序比较计数受实现影响,Hoare 使用的比较少于 Lomuto。

    快速排序(Hoare 分区方案)

    pivot reads      87   (average)
    compares        401   (average)
    array accesses  854   (average)
    

    归并排序:

    compares        307  (average)
    array accesses 1400  (best, average, worst)
    

    由于正在对数字进行排序,我假设它们适合寄存器,这减少了数组访问。

    对于快速排序,比较是针对一个枢轴值进行的,每个快速排序的递归实例应该只读取一次并放置在寄存器中,然后对每个比较的值读取一次。优化编译器可能会将用于比较的值保留在寄存器中,以便交换已经在寄存器中具有两个值,并且只需要执行两次写入。

    对于合并排序,比较对数组访问的开销几乎为零,因为比较后的值将被读入寄存器,进行比较,然后从寄存器中写入,而不是再次从内存中读取。

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 2019-04-03
      • 2013-03-22
      • 2015-03-09
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多