###やりたいこと
[("apple", 1); ("grape", 1) ; ("apple", 2); ("grape", 3); ("melon", 3); ("banana", 3)]
(=List)
というリストをキーが同じものをまとめて
[("apple", [1;2]) ; ("grape", [1;3]) ; ("melon", [3]) ; ("banana", [3])]
というリストにしたい
以下に思考の殴り書きのような形で,思いついたことを書かせていただきます.
###考えた方法
ocaml
1# let synthe pair1 pair2 = 2 if (fst (pair1)) = (fst (pair2)) then (fst (pair1), [snd (pair1) ; snd (pair2)]) 3 else (fst (pair1), [snd (pair1)]);; 4val trya : 'a * 'b -> 'a * 'b -> 'a * 'b list = <fun> 5# synthe ("app",1) ("app", 2);; 6- : string * int list = ("app", [1; 2]) 7# synthe ("app",1) ("apple", 2);; 8- : string * int list = ("app", [1])
h::restでListの先頭を取ってrest中の全要素について上記のsyntheを行い,
再帰でrestについてh::restとし,同様に行う
つまり
ocaml
1match List with 2 |[] -> [] 3 | h::rest -> (syntheで作ったもの)::(この関数名) (restなどの引数)
を改善したようにする.
###問題点
このままでは合成したものの残りかすが出現してしまう.
例えば
上の例では("apple", [1;2]) と ("apple", [2])の二つが出来てしまう
また,「h::restでListの先頭を取ってrest中の全要素について上記のsyntheを行い」の部分の具体的な実装が分からない
###考えた方法2
Listを辞書順にソートし,となり合ったものの第一項を見て一緒ならまとめる,異なるならば注目する組を移す
[("apple", 1); ("grape", 1) ; ("apple", 2); ("grape", 3); ("melon", 3); ("banana", 3)]
→[●("apple", 1); ("apple", 2) ;("grape", 1) ; ("grape", 3); ("melon", 3); ("banana", 3)]
→[●("apple", [1;2]) ;("grape", 1) ; ("grape", 3); ("melon", 3); ("banana", 3)]
→[("apple", [1;2]) ; ●("grape", [1]) ; ("grape", 3); ("melon", 3); ("banana", 3)]
...
→[("apple", [1;2]) ; ("grape", [1]) ; ("grape", [3]); ("melon", [3]); ●("banana", [3])]
のような動き(●は注目してる組)
###問題点2
シンプルなリストのソートは出来るが,組のリストのソートはList.sortでは無理だった.
###お聞きしたいこと
・上記の考え方の補強となる考え方
・同じことができる他のアルゴリズム
宜しくお願いいたします.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/18 12:01
2021/05/18 13:14
2021/05/18 13:31
2021/05/18 13:45
2021/05/21 02:45