给定一个线性列表,ATS中是否有一个库函数随机地对列表进行洗牌以产生它的排列:
fun{a:t@ype}
list_vt_permute{n:int}(xs: list_vt(a, n)): list_vt(a, n)
如果可能的话,我希望list_vt_permute
的实现不会调用malloc / free。
答案 0 :(得分:0)
是的,在prelude / list_vt.sats中声明了这样一个函数,该函数基于prelude / array.sats中声明的函数array_permute
。
请注意,list_vt_permute
调用list_vt_permute$randint
来生成随机数,它实际上实现了Fisher-Yates算法来执行随机混洗。函数list_vt_permute
是O(n)-time,它需要为临时使用分配内存。
对于不需要malloc / free的list_vt_permute
版本,它可以像mergesort一样实现,需要O(n * log(n)) - 完成时间。