1

これが私が持っている3つのデータセットの簡略化されたバージョンです:

Set A = [1, 1, 2, 2, 1, 2, 2, 1]
Set B = [2, 2, 1, 2, 2, 1, 1, 3]
Set C = [8, 4, 4, 4, 4, 9, 8, 4]

Haskellには、データセット間の不特定のパターンを見つけるための組み込み機能がありますか?プログラムを2つ以上のデータセットで実行し、類似しているデータセット(この場合はセットAとB)を報告してもらいたいです。

4

1 に答える 1

5

結果として生じる交差点を見つけることについて話しているのではない場合。

2つのリストごとに、それらの共通部分をとるintersect関数fromを使用できます。Data.List

したがって、アイデアは、すべてのリストの共通部分を計算して並べ替えることです。

> snd . last . sort $ [ (length $ intersect x y, (x,y)) | let list = [[1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3],[8,4,4,4,4,9,8,4]], x <- list, y <- list, x /= y ]
([1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3])

結果として生じる交差点の作成に興味がある場合は、次のようなものを使用できます。

import Data.List (sort, subsequences)

intersectCons :: (Ord a) => [a] -> [a] -> [a]
intersectCons x y = snd . last . sort $
  [ (length x1, x1) | x1 <- subsequences x
                    , x2 <- subsequences y
                    , x1 == x2 ]

例えば:

> intersectCons [1, 1, 2, 2, 1, 2, 2, 1] [2, 2, 1, 2, 2, 1, 1, 3]
[2,2,1,2,2,1]

また、最も類似したリストのペアを見つけるために使用できます。

> snd . last . sort $ [ (length $ intersectCons x y, (x,y)) | let list = [[1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3],[8,4,4,4,4,9,8,4]], x <- list, y <- list, x /= y ]
([2,2,1,2,2,1,1,3],[1,1,2,2,1,2,2,1])

実際、リストの1つのペアだけでなく、「類似」しているすべてのペアを取得したい場合はsnd . last . sort $、それらすべてを削除して取得できます。

于 2012-03-27T06:14:04.917 に答える