【问题标题】:change an algo to obtain optimal run time更改算法以获得最佳运行时间
【发布时间】:2021-11-26 20:41:42
【问题描述】:

我有一个逆分区算法

Reverse-Partition(A, p, q, r)
  pivot = A[q]
  j = r
  i = q
   while j ≥ p + 1 and i ≥ p
     if A[j] > pivot
      exchange A[j] with A[i]
      i = i − 1
   j = j − 1

我正在尝试编写一种比上述算法更快的算法以获得最佳运行时间

Fast-Reverse-Partition(A, p, q, r) 
BEGIN:

For(int i = r; i > (r-q); i--):
   swap A[i] and A[i-(r-q)]

END

在反向分区函数中,在给定的数组中,索引 q~r 中的所有元素都大于枢轴元素,索引 p~q 中的元素都小于枢轴,所以我认为使用以上一个我们可以获得相同的结果反向分区功能。
此函数的运行时间为 n = r-(r-q)+1 = q+1,因此它比反向分区函数更快。
这有意义吗?还是我的理解有误?

【问题讨论】:

  • 在进行这样的工作时,最好设置一个测试框架,您可以在其中不断验证您的算法在您对其进行更改时是否仍能完成它应该做的事情。

标签: arrays algorithm sorting quicksort partition


【解决方案1】:

您提供的第一个函数看起来像快速排序算法中的 partition 函数,尽管我不完全确定它是否正确。但我假设这就是您想要复制的内容。

首先,您的第二个代码 sn-p 在语义上不等同于第一个代码。第二个代码 sn -p 只是盲目地颠倒了子数组元素的顺序,即 NOT 分区子程序应该做什么。

分区子例程从给定的子数组中选择一个pivot 值并以这样的方式重新排列子数组的元素,以便所有小于pivot 的元素位于任何大于pivot 的元素之前.

关于“最佳运行时间”。随着时间的推移,人们发明了许多分区方案,其中大多数都试图优化以下之一:

  • 比较次数
  • 交换次数
  • 最坏情况下的行为(所有元素都相同,或严格相反的顺序)
  • 可读性

在了解特定的分区方案时,重要的是要了解它试图优化什么,以及它试图维护什么不变量(这可能非常具有挑战性!)。

我建议从彻底阅读wiki article 开始,它包含几个流行的分区方案以及相关的权衡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2011-12-21
    • 2020-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多