【发布时间】:2015-07-03 05:44:24
【问题描述】:
我想重复重新排列一个数组或std::vector,以便最小值是第一个元素,最大值是最后一个元素,arr[(0+lastIdx)/2] 是中位数,中位数之前的元素小于中位数,中位数之后的元素会更大。每次查询最小值、最大值和中值后,我都会对数据进行更改,我想再次快速查询这三个值。
每次我想重新排列数组时,数组都是一个大小相同的不同数组。
使用std::nth_element 我可以在正确的位置获得中位数,然后我可以迭代数组以获得最小值和最大值。对于单个数组,这实现了 O(n) 复杂度,显然这无法改进。 (除了O(n)前面的复杂度常数)
我需要对数组进行操作,首先我重新排列数组,然后再做一些其他的事情,这会使排列后的数组再次完全未排列,但不会插入新值。然后,我一遍又一遍地重复这个过程。
【问题讨论】:
-
所以基本上......你想对一个数组进行排序。
-
@DavidGrinberg 不,他不想排序,因为它可以比排序更快地完成(排序可以在
O(n log n)中完成,找到最小值/最大值/中值可以在@987654325 中完成@甚至更快(不知道如何) -
@FalconUA,我认为
O(n)可能只是最佳复杂度,我只是想知道我是否可以获得更好的常数因子。 -
所有重排都会发生在同一个数组中(添加或删除一些元素)?多久一次?
-
如果只是洗牌,那么最小值、最大值和中值不会改变,这可以简化问题。