何时对数组进行排序?

时间:2013-12-29 22:47:16

标签: arrays algorithm sorting big-o

多年前,在一次求职面试中,我被问到:什么时候排序阵列值得?我记得不能正确回答,最近我做了一个算法课程,我得出结论,提供更“学术化”的反应可能会让我得到那份工作......无论如何,不​​可能修复过去到目前为止,我正试图正式回答它,目前,这就是我所在的地方:

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

  • O(n)如果没有排序
  • O(log(n))如果已排序

考虑在O(n * log(n))

中快速排序

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

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

x的价值是什么?

1 个答案:

答案 0 :(得分:2)

我个人会回答,如果满足以下任何条件,则值得对数组进行排序:

  • 我们计划经常要求数组中的最大值(从O(n)到O(1)的削减成本),
  • 我们计划经常要求数组中的最小值(从O(n)到O(1)的削减成本),
  • 我们经常在数组中寻找一个给定的值(从O(n)到O(log(n))的削减成本。

如果可以在O(n)中对数组进行排序(例如,数据满足排序计数的标准),我们将从搜索操作开始获取(因此总时间,包括排序所需的时间,将k次操作后,小于搜索未排序数组所花费的时间,其中<​​strong> k = constantOfSortingOperation /(n / log(n))(排序数据除以搜索的增益所花费的时间分拣机阵列)。

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

如果我们包括从获得最大/最小值的增益计算,我们开始从更快地排序数组获得。