我想尽可能高效地创建一个“几乎排序”的数组(为了探索列表中随机细微变化的效果,我希望能够大量调用这个例程)。
我有Ruby代码可以做我想要的:
sortme = [ 'X','A','B','W','S','J','7','9','Q','E' ]
n = sortme.length
correctly_sorted = sortme.sort
# ["7", "9", "A", "B", "E", "J", "Q", "S", "W", "X"]
# Specific to this case, I'd like the disorder to be strongest at the
# start of the array. In general, I would like to be able to control
# it, in relation to the sorted positions.
sort_adjust = Array.new( n ) { |i| i + ( rand() * 50 ) / (i+10) }
adjust_indexes = (0...n).sort_by { |i| sort_adjust[i] }
# e.g. [0, 2, 1, 3, 4, 5, 6, 7, 9, 8]
almost_sorted = adjust_indexes.map { |i| correctly_sorted[i] }
# Example output
# ["7", "A", "9", "B", "E", "J", "Q", "S", "X", "W"]
我的解决方案执行两个sort
,一个map
,并调用rand()
N次以填充临时数组。有什么方法可以减少Array
的方法调用次数,并使其更有效率?或者可能减少我拨打rand()
的次数,但仍然可以控制项目的控制?
答案 0 :(得分:3)
如何应用标准且高效的array shuffling algorithm,但为其添加随机化?
基本算法为每个位置选择随机位置n> = j> = i来交换值。相反,决定以概率p进行交换。对于p = 1,您有标准的混洗算法(其中所有排列都可能出现),对于p = 0,数组将保持排序。
答案 1 :(得分:1)
多么简洁的问题!以下是我作为一个有趣的解决方案:
获取已排序的数组,并将其输入图表。该图应该“大部分”是线性的,但偶尔会插入一些分支。也就是说,当你遍历数组时翻转硬币,当你达到给定的阈值时,不是在列表中插入值并向前移动,而是将值插入列表中但保持不变。
["7", "9", "A", "B", "E", "J", "Q", "S", "W", "X"]
例如,成为
/ -- A -- \
7 -- 9 E -- J -- Q -- S -- W -- X
\ -- B -- /
(当我们达到9时,我们跳过列表一次跳过。如果我们跳过它三次,我们最终会得到A,B和E处于同一“级别”)
然后,要获得“排序排序”数组,请在图表上执行topological sort!好哇!
答案 2 :(得分:1)
好吧,考虑到两件事:
我将数组分成2/3部分,对一部分进行排序,并将部分连接成一个数组。
arr2.sort!排序到位,几乎与:arr2 = arr2.sort
相同
almost_sorted_array = arr1.concat arr2
arr = 10.times.collect {(rand(100))}
# => [43, 87, 42, 65, 59, 35, 90, 43, 21, 28] # 10 random numbers
arr1, arr2 = arr[0..3], arr[4..10] # split array into 2 parts
#=> [[43, 87, 42, 65], [59, 35, 90, 43, 21, 28]]
arr2.sort! # sort in place, almost the same as: `arr2 = arr2.sort`
# => [21, 28, 35, 43, 59, 90] # 2nd part is sorted
almost_sorted_array = arr1.concat arr2 #concatenating 2 arrays
#=> [43, 87, 42, 65, 21, 28, 35, 43, 59, 90]
以下是您可以如何开始的示例。您可以使用某种方法将数组拆分为2个或更多部分,对所需的部分进行排序,并连接结果。
您有包含1000个元素的数组。您可以将数组拆分为100个部分 然后你必须选择要排序的部分。例如(s - sort,d - 不排序):
[S,d,S,S,d,S,d,S,d,S,d,S,S,S,d,S,S,S,d,S,S ...] < / p>
零件尺寸,零件数量以及零件是否分类会影响结果 对于小型数组或者如果您希望将数组排除在只有少数元素之外,此解决方案并不好。