2011-03-13 8 views
0

올바른 순서로 목록에 항목을 추가하는 함수를 작성하고 싶습니다. 1[2, 3]입니다. 나는 haskell에 익숙하지 않고 Ord을 사용하지 않고 그것을하는 방법에 대한 도움이 필요하다.목록에 요소 추가

+2

목록이 Ord없이 "올바른 순서"인지 어떻게 알 수 있습니까? – kennytm

+1

당신이 이것을 설정하기 전에, 당신이 원하는 것을 더 명확하게해야합니까? 'louie 1 [2,3]와 louie 2 [1,3]는 모두 [1,2,3]라고 가정합니다. 그러나 예를 들어'louie 1 [3,2]'또는'louie 2 [3,1]'또는'louie 6 [5,3,17,2]'는 무엇입니까? – applicative

답변

1

요소를 정렬 된 목록에 삽입하는 기능을 작성하는 것은 어렵지 않습니다.

insert :: Ord a => a -> [a] -> [a] 

insert x [] = [x] 

insert x (y:ys) 
    | x > y  = y : insert x ys 
    | otherwise = x : y : ys 

그러나이 경우에는 사용하기에 효율적이지 않을 수 있습니다. 목록의 문제점은 이런 종류의 삽입 문제로 반복적으로 척추의 큰 부분의 새로운 복사본을 만드는 것입니다. 올바른 위치를 찾을 때까지 목록에서 선형으로 스캔해야합니다. 올바른 위치를 검색하는 가장 빠른 방법은 아닙니다.

Data.Set 또는 Data.IntSet에있는 것과 같은 데이터 구조를 사용하는 것이 더 나을 것입니다. 일반적으로 O (log n)은 삽입보다 많습니다. 왜냐하면 목록보다 더 많은 공유를 허용하는 나무 나 다른 데이터 구조를 사용하고 올바른 위치를 빠르게 찾을 수 있기 때문입니다.

+0

큰 n (목록 ​​/ 집합 크기)에 대해 O (log n)이 O (n)보다 훨씬 낫습니다. 이는 제안한대로 목록을 사용하면 얻을 수있는 것입니다. – chrisdb

+0

[a]를 반환해야합니까? 대답을 자세히 설명해 주시겠습니까? –

2

Ord을 사용하지 않으면 질문에 의미가 없습니다. 오드를 사용

원하는 기능 insert

이 삽입 기능은 다음에 여전히보다 작거나 같은 마지막 위치에있는 목록에 요소 요소 및 목록을 소요하고 삽입입니다 요소.

+0

전달 된 목록이 순서대로입니다. – Louie

+1

@Louie 다음 문서의 다음 문장이 적용됩니다. "특히 호출 전에 목록이 정렬되어 있으면 결과도 정렬됩니다." –