如何在OCaml中将O(n)中的列表混洗?

Jac*_*ale 7 ocaml functional-programming

array在O(n)中进行交换并不难,并进行交换,

如何list在OCaml中使用O(n)?


需求:

  1. 没有数组或就地使用

  2. 将此视为面试问题

Jef*_*eld 10

列表是不可改变的,而且往往有一个为log N代价不可变数据的工作.如果你愿意支付这笔费用,那么就有一个明显的n log n方法:用随机值标记每个列表元素,根据随机值排序,删除随机值.这是我在生产代码中随机播放列表的方式.

以下是我销售的iOS应用程序的随机播放代码:

let shuffle d =
    let nd = List.map (fun c -> (Random.bits (), c)) d in
    let sond = List.sort compare nd in
    List.map snd sond
Run Code Online (Sandbox Code Playgroud)

  • 当标签相等时,似乎会出现偏差.使用63位标签时,这是一个小偏差.(当它出来的时候,我从奥列格那里读到了这个消息.他太棒了.) (3认同)