10

グラフをトラバースしていて、ノードが以前に見られたかどうかをすばやく判断したいとします。いくつかの前提条件が設定されています。

  1. ノードは整数値 1..N でマークされています
  2. グラフは、隣接リストを持つノードで実装されます
  3. 1..N のすべての整数値がグラフに出現し、サイズは N です。

純粋に機能的な方法でこれを行うためのアイデアはありますか?(ハッシュテーブルまたは配列は許可されていません)。

2 つの関数が動作するデータ構造が必要です。add (遭遇した整数を追加) および lookup (整数が追加されたかどうかをチェック)。どちらも、N回の繰り返しで償却されるO(n)時間かかることが望ましいです。

これは可能ですか?

4

4 に答える 4

9

Data.Setを使用できます。古いセットから新しいセットを作成して要素を追加し、新しいセットinsertを渡します。要素がセットのメンバーであるかどうかを調べるには、 を使用しmemberます。どちらの演算も O(log n) です。

おそらく、状態モナドを使用してセットの受け渡しをスレッド化することを検討できます。

于 2008-11-13T20:56:25.357 に答える
1

関数型言語での効率的な要素検索は非常に困難です。Data.Set(上記のように) は、O(log n) でルックアップ操作を提供する純粋に機能的な方法で構築できるバイナリ ツリーを使用して実装されます。HashTables (純粋に機能的ではない) には O(1) があります。

于 2009-05-17T08:45:25.683 に答える
0

Data.BitSet は O(n) かもしれないと思います。

于 2010-07-27T07:04:04.173 に答える
0

コードを IO モナドにラップすることを気にしない場合は、judy hashtablesを見てください。

于 2011-02-22T07:55:03.937 に答える