我经常遇到"洗牌"一个类似于使用sorted
函数的python列表,即返回列表的混乱副本而不改变原始函数。
我知道可以对列表进行浅层复制,然后shuffle
:
a = [random.randint(1, 1000) for _ in xrange(100)]
b = a[:]
random.shuffle(b)
我的函数式程序员想要一个不变的解决方案(并且适合单个可读行是一个很大的好处),所以我想使用sample
函数:
a = [random.randint(1, 1000) for _ in xrange(100)]
b = random.sample(a, len(a))
然而,在文档中没有任何地方可以找到线索,无论是时间和空间,渐近还是常数因素,这是否是一个好主意。
帖子What is the difference between random.sample and random.shuffle in Python似乎在问一个类似的更广泛的问题,但a)没有一个公认的答案,更重要的是,b)没有一个答案提供任何相关的优点是什么时间/空间条款。
所有4个答案除了最多投票的答案之外,特别谈论输出,而不是任何算法的复杂性。
最投票的答案包含两个函数的python源代码,并得出结论:
随机化主要由行
int(random() * n)
完成。因此,基础算法基本相同
我认为这表明输出是相同的,但就时间复杂性而言,它并没有真正解决问题,因为周围的代码有很大不同。
所以我的问题是:什么是时间/空间成本差异,最好是渐近和常数因素,在浅层副本random.shuffle
和random.sample(x, len(x))
之间?
NB 我认为标题稍微不准确,因为它没有明确表示我想要比较random.shuffle(x)
,其中x已经是浅拷贝了。这纯粹是因为需要简洁。