O(N)で、OCamlの中でlist
のためにそれを行うにはどのように、代わりに交換して、O(n)の中array
をシャッフルするOCamlでO(n)のリストをシャッフルするには?
ハードではないでしょうか?
要件:
ない配列や場所での使用
O(N)で、OCamlの中でlist
のためにそれを行うにはどのように、代わりに交換して、O(n)の中array
をシャッフルするOCamlでO(n)のリストをシャッフルするには?
ハードではないでしょうか?
要件:
ない配列や場所での使用
リストは不変であり、ログがしばしばあります面接の質問としてこれを考えてみましょう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
はい、私もそう思っていました。興味深いのは、私がクイックソートを書くつもりで、この質問が私にポップアップしたことです。 'quicksort'のために、まずリストをシャッフルしてから、パーティションを作成します。この場合、コード内のランダムな値をどのようにソートするのですか? –
並べ替えを使用してシャッフルすると、すべての並べ替えが等しくなる可能性があることに注意してください。これを見てください:http://okmij.org/ftp/Haskell/perfect-shuffle.txt – sepp2k
タグが等しい場合、偏差が発生するようです。 63ビットのタグでは、これは小さな偏差です。 (私がOlegからメッセージを出したときにそれが出てきました。彼は素晴らしいです) –
あなたはカードのリフルシャッフルを模倣できます。
カードのデッキのリフルシャッフルをする意味:
をインターリーブ二つの部分
「2002年のPersi Diaconisによるリッフルシャッフル解析の数学的展開」によれば、k = 3/2 log_2(n)+ cを選択する。確かに、均一性と結果の間の総変動距離は0に指数関数的に速く低下します。これは、cをインクリメントするたびにほぼ半分になります。あなたはc = 10を選ぶことができます。
スペースO(1)(Lを破壊する場合)、時間O(n log n)。しかし、ジェフリースコフィールドの解はO(n)個のランダムビットしか必要としないが、Θ(n)個の空間しか必要としないが、ランダムジェネレータへのO(n log n)コールがある。
List.rev_appendはテール再帰的です – Isaac
格安トリック:リストをリストにコピーし、シャッフル、コピーバック... O(n)にする必要があります。 – phimuemue
@phimuemueいいえ、配列を持たないか、もちろん、代わりにこれをインタビューの質問とみなしてください。 –
リストのすべての可能な並べ替えが同様に可能でなければならないなどの要件がありますか? – phimuemue