【问题标题】:When is it worth to sort an array? [closed]什么时候值得对数组进行排序? [关闭]
【发布时间】:2014-01-16 19:58:24
【问题描述】:

几年前,在一次求职面试中,有人问我:什么时候值得对数组进行排序?我记得不能正确回答,最近我上了一个算法课程,我得出的结论是,提供更“学术”的回答可能会让我得到那份工作......无论如何,这是不可能修复过去的,到目前为止,我正在尝试正式回答自己,目前,这就是我所在的位置:

给定一个数组,搜索的时间为

  • O(n) 如果未排序
  • O(log(n)) 如果已排序

考虑到 O(n*log(n)) 中的快速排序排序

什么时候值得对数组进行排序?这当然取决于我们要搜索数组的次数。

  • 在有序数组中搜索 x 次的成本 = O(n*log(n)) + [O(log(n)) * x]
  • 在未排序的数组中搜索 x 次的成本 = O(n) * x

x 的值是多少?

【问题讨论】:

  • 这听起来像是一道作业题
  • 排序数据还有另一个隐藏的好处。由于现代处理器的分支预测,您的代码实际上可能运行得更快。
  • @TomHeard 我明白,但相信我不是,实际上我几年前就完成了大学。对我来说,问题是我有几次想知道这个问题,而且我总是迷失在大 o 符号运算中。
  • Landau 表示法在这种情况下对您没有帮助。突然之间,常量和实际运行时间很重要。
  • 您总是可以尝试n*log(n) + (x*log(n)) = n*x 并求解 x,这将是成本相等的地方。但这又不是很准确,因为它忽略了常量。

标签: arrays algorithm sorting big-o


【解决方案1】:

我个人会回答,如果以下任何一项为真,则值得对数组进行排序:

  • 我们计划经常要求数组中的最大值(将成本从 O(n) 降低到 O(1)),
  • 我们计划经常要求数组中的最小值(将成本从 O(n) 降低到 O(1)),
  • 我们通常会在数组中寻找给定值(将成本从 O(n) 降低到 O(log(n))。

如果可以在 O(n) 中对数组进行排序(例如,数据满足计数排序的条件),我们将从搜索操作中开始获得收益(因此总时间,包括排序所需的时间,将在 k 次操作之后,k = constantOfSortingOperation / (n/log(n))(对数组进行排序所用的时间除以从搜索排序器数组)。

如果我们以 O(nlogn) 对数组进行排序,则使用 for ex。在 k = (constant*nlogn)/ (n/logn) 之后,我们将从搜索操作中开始获得 HeapSort 或 QuickSort(其中隐藏在 big-O 符号中的常数很小)。 constant/nlogn 基本上是如果我们不花时间在排序上,而是在搜索上,我们可以搜索多少次未排序的数组。 n/logn 是与在未排序数组中搜索相比,我们从排序器数组中的单个搜索中获得的收益。因此,如果我们认为我们的常数很小(远小于 n),我们开始获得(= x,或多或少)后的时间大约为 n*logn * logn / n = (log(n))^ 2.

如果我们计算从获得最大/最小值中获得的收益,我们会从更快地对数组进行排序开始获得收益。

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多