无需排序的有序列表,O(n)
如果你想要整数排序,我在另一个问题中得到了很多帮助,最终找到了这个答案。你可以使用指数变量来实现,从而避免任何排序。结果是O(n):
根据Alok的回答和Dan Dyer的评论,使用指数分布来计算一组增量会得到一个整数序列的均匀分布。
所以,你只需要开始生成数字,然后在最后进行缩放。将增量加1可以确保你不会重复一个值。
import random,sys,math
def genSortedInts(mini,maxi,vals):
running = 0
deltas = [random.expovariate(1.0) for i in range(0,vals+1)]
floats = []
for d in deltas:
running += d
floats.append(running)
upper = floats.pop()
valRange = maxi-mini-(vals-1)
ints = [mini+int(f/upper*valRange)+id for id,f in enumerate(floats)]
return ints
if __name__ == "__main__":
vals = 10
maxi = 80
mini = 0
print(genSortedInts(mini,maxi,vals))
请注意使用
random.expovariate(1.0)
,这是一个
Python指数分布随机数生成器(非常有用!)。在这里,它被称为平均值为1.0的函数(arg为1/mean),但由于脚本针对序列中的最后一个数字进行归一化,因此平均值本身并不重要。
输出(公平骰子掷出)10个值,最高到80:
[3, 5, 10, 16, 25, 37, 41, 45, 57, 70]