2013-04-19 2 views
0

У меня есть список кортежей формы [(A,B),(B,A),(D,C),(E,F),(C,D),(F,E)]. Как мне вернуть список, который равен [(A,B),(C,D),(E,F)]? Единственные решения, которые я нашел, - удалить повторяющиеся кортежи, и единственными решениями, которые я могу себе представить, являются наивные решения O (n^2). Есть ли способ сделать это эффективно?Возвратите уникальные кортежи из списка кортежей в Haskell

+0

Если вы можете использовать сторонние библиотеки, кажется, есть «набор» тип данных доступны: HTTP: //www.haskell. org/ghc/docs/6.12.1/html/libraries/container-0.3.0.0/Data-Set.html – millimoose

+1

Если вам разрешено сортировать список заранее, можно создать «O (n log n)). –

+0

Мне разрешено сортировать этот список. –

ответ

5

Если тип компонентов ваших пар в классе Ord, вы можете сделать это в O (N журнал N) Время:

import Data.List (sort, group) 

sortPair  :: Ord a => (a, a) -> (a, a) 
sortPair (x, y) 
    | x <= y  = (x, y) 
    | otherwise = (y, x) 

uniques :: Ord a => [(a, a)] -> [(a, a)] 
uniques = map head . group . sort . map sortPair 

Таким образом, если мы определим

data T = A | B | C | D | E | F deriving (Eq, Ord, Show) 

у нас есть, для примера:

> uniques [(A,B),(B,A),(D,C),(E,F),(C,D),(F,E)] 
[(A,B),(C,D),(E,F)] 
Смежные вопросы