list<float>
でn個の最小要素を見つけるには、リストをソートしてn個の最小要素を選択します。しかし、ヒープを使ってより効率的に行うこともできます。私はF#のヒープのいくつかの実装を見つけましたが、この目的のためにそれらを使用する方法の例はありませんでした。私の2つの障害は次のとおりです。リスト内のn個の最小要素を効率的に見つける方法を教えてください。
1)リストからヒープを作成する方法が見つかりませんでした。私が見たすべての実装は、空のヒープを作成する方法を提供し、insert
メソッドを持っています。空のヒープを作成し、アイテムを1つずつ挿入する必要がありますか?それは遅く見えますが、それは目的を破るでしょう。
2)いいえ実装のようなnLargestまたはnSmallestメソッドを持っていない、例えば、このPythonコード:
from heapq import nlargest
lst = [9,1,6,4,2,8,3,7,5]
nlargest(3, lst) # Gives [9,8,7]
は、この問題を解決するための簡単な方法はありますか?バイナリヒープにアレイを再配置する方法
配列を持っているなら、O(N)の時間に配列をheapifyできますしかし、F# 'list'型はリンクリストのデータ構造です。heapifyは配列に対するインデックスによるO(1)ランダムアクセスに依存しているので、heapifyアルゴリズムはO(N^2)時間になります。あなたのリストを配列(1つのO(N)操作)に変換し、それを積み重ねて(2番目のO(N)操作)、3つの最小要素(3 O(log N)操作) 。または2)リストをソートして(O(N log N))、3つの最初の要素を取ります(3 O(1)操作)。あなたのリストが巨大であることを期待しない限り、私はそれについて心配しないでください:ちょうど並べます。 – rmunn
@rmunnありがとう。しかし、その場合には、どのように配列を整理して最小の要素を得るのですか? – Soldalma
ビジュアルデモとhttp://www.cs.toronto.edu/~krueger/cscB63h/w07/については、https://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/DemoHeapify.pdfを参照してください。いくつかの擬似コードについては講義/ tut02.txtを参照してください。簡単に言えば、配列で始まり、最後の要素から最初の要素まで、2つのヒープの子よりも小さいことを確認します。そうでない場合は、小さい方の子供と交換し、小さい方の子供でその過程を繰り返します。そして、配列の右端の半分にはヒープの子要素がないので、実際には 'array.Length/2'で始まり、インデックス0に行くことができます。アルゴリズム分析は、これがO(N)時間かかることを示している。 – rmunn