【发布时间】: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