은 O (N)이며, 각 요소를 확인하는 데 사용하는 방법에 기초하여, 솔루션 (N은^2) O이다. 중복 문제에 대한 "표준"효율적인 솔루션은 중복을 확인하기 전에 목록을 정렬하는 것입니다. 여기서 우리는 요소를 보존 할 필요가 있으므로 좀 더주의해야합니다.
import Data.List
import Data.Ord
rmdupSorted :: Eq b => [(a,b)] -> [(a,b)]
rmdupSorted ([email protected](_,xb):[email protected]((_,yb):_)) | xb == yb = rmdupSorted xs
| otherwise = x : rmdupSorted xs
rmdupSorted xs = xs -- 0 or 1 elements
rmdup :: Ord a => [a] -> [a]
rmdup = map snd . sort . rmdupSorted . sortBy (comparing snd) . zip [0..]
main = print $ rmdup [1,2,3,4,5,4,6,1,7]
sortBy
기능은 rmdup
함수가 어떤 요소의 모든 중복 항목을 제거하지만 마지막으로 발생하는 일에 대한 것입니다하는 안정적 종류이라고 가정. sortBy
이 안정적이지 않으면 rmdup
은 지정되지 않은 항목을 모두 제거합니다 (즉, rmdup [1,2,1]
은 [2,1]
대신 [1,2]
을 반환 할 수 있음).
복잡성은 이제 O (n log n)입니다.
이제 OP가 요청한대로 라이브러리 함수없이 위 코드를 다시 작성해야합니다. 나는 이것을 독자에게 연습으로 남겨 둘 것이다. :-P
출처
2014-04-21 09:04:25
chi
이렇게하면 최대 하나의 요소 만 제거됩니다. 당신은 아마''x'elem' acc''의 경우''accms'를 의미 할 것입니다. – raymonad
이것은 정확히 내가 찾고 있었지만 @ raymonad의 의견과 관련하여 답을 편집하십시오. –
오른쪽! 죄송합니다. 원본 코드에서만 코드를 테스트했습니다.) – chris