【发布时间】:2013-10-30 03:04:40
【问题描述】:
我有一个大小为n 的vector<unsigned int> vec。 vec 中的每个元素都在[0, m] 范围内,没有重复,我要对vec 进行排序。如果允许您使用 O(m) 空间,是否有可能比 O(n log n) 时间做得更好?在平均情况下m 比n 大得多,在最坏情况下m == n。
理想情况下,我想要 O(n) 的东西。
我觉得有一种桶排序方式可以做到这一点:
unsigned int aux[m];aux[vec[i]] = i;- 以某种方式提取排列并置换
vec。
我不知道怎么做 3。
在我的应用程序中,m 大约为 16k。然而,这种类型在内部循环中,占我运行时的很大一部分。
【问题讨论】:
-
这个问题可能会更好:programmers.stackexchange.com
-
m比n大多少?
-
m比n大多少,比n log n大多少?因为如果是这样的话,O(n log n)仍然会比 linearO(m)快 -
@DavidRodríguez-dribeas O(m) 空间,而不是时间。 O(m) 时间是一个简单的桶排序。
-
@Adam:如果你真的是指
O(n)时间,那就做不到了。要查找O(m)空间中存在哪些元素,您需要的不仅仅是O(n)
标签: c++ algorithm sorting big-o time-complexity