2011-07-03 11 views
3

OcamlのMapモジュールにはあま​​り慣れていません。Ocamlのマップでキーを見つける簡単な方法

私はintからstringへの単純なマップm: string Map.Make(Int).tを持っている、と私はすべての(:string)結合がユニークであることを知っています。私はfunciton find_from_string_to_int: string -> string Map.Make(Int).t -> intを書いてみたいと思います。どうもありがとうございました!

答えて

3

これはまれな操作である場合は、最も簡単な方法は、マップSMap.foldのすべて(キー、値)のバインディング折り重なることです:あなたが探しているもの、これは一般的な操作である場合

# module SMap = Map.Make(String);; 
# let reverse v t = 
    SMap.fold (fun k v' acc -> if v = v' then Some k else acc) t None;; 
val reverse : 'a -> 'a SMap.t -> SMap.key option = <fun> 

をforは双方向マップ(双方向で照会できるマップ)です。最も簡単な方法は、マップのペアを持ち歩くことです:int IMap.t * string SMap.t(両方向のアクセスは対数で、上のreverseはマップのサイズで線形です)。また、専用のデータ構造を実装することもできますが、それはおそらく複雑さを増やす価値はありません。

PS:reverseは、値が見つかると早期に終了するように最適化することができますが、それがあまり一般的でない場合は、とにかく重要ではありません。

+0

ありがとうございました – SoftTimur

関連する問題