2017-02-09 1 views
0

새 목록을 만들지 않고도 목록에 추가 할 수있는 SML 연산자가 있습니까?SML : 요소를 SML의 목록에 추가하는 방법은 무엇입니까?

[1,2,3]::1 

을하지만이 작업을 수행 할 수 있습니다 : 예

동안 나는이 작업을 수행하지 못할 내가 1과 목록을 만들 필요로 홀수

[1,2,3]@[1] 

. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+2

@ sepp2k에서 말한 것처럼 목록의 끝에 추가하는 것은 비용이 많이 듭니다. 목록을 작성하는 가장 느린 방법 중 하나는 목록의 길이가 이차원에 가깝기 때문에 요소를 하나씩 끝에 추가하는 것입니다. 이런 이유 때문에, SML 프로그래머는 역순으로 목록을 만드는 함수를 작성하는 경우가 있습니다 (뒤에서 추가하는 것이 더 자연스러운 경우에도 뒤에서보다는 오히려 앞에 붙임). 그리고 나서 결과 목록을'rev'를 통해 실행합니다. 원하는 목록을 얻으려면 'O (n)'이되도록 영리한 방법으로 구현됩니다. –

+0

추가 할 꼬리 포인터가 있습니까? O (1) – Har

+2

@Har 꼬리 포인터에 추가 (존재하지도 않는 경우)하면 원래 목록이 변경됩니다. SML 목록은 변경 가능하지 않으므로이 점에주의하십시오. – sepp2k

답변

3

목록을 작성해야합니다. [1,2,3,1]의 꼬리 꼬리는 [1]입니다. 따라서 메모리에 [1,2,3,1]이있는 경우 [1]도 메모리에 있습니다.

그래서 연산자가 [1,2,3] @:: 1 인 경우에도 여전히 그 중 하나가 포함 된 목록을 만들어야하므로 차이가 없습니다.

추 신 : xs @ [x]의 실제 문제는 목록을 만드는 것이 아니라 실행 시간이 O (n) (O (1)에있는 x :: xs과 반대 됨)입니다. 이것은 또한 불변의 단일 링크드리스트의 본질에 내재 된 문제이므로 도움을받을 수는 없지만 일반적으로 그러한 목록의 끝에 추가하지 않아야하는 이유입니다.

+0

1. 목록에 어떻게 추가 할 수 있습니까? 2. 추가 할 테일 포인터를 저장하지 않습니까? 3. x :: x는 정확히 무엇을합니까? 새 목록을 만들거나 헤드 포인터에 추가 하시겠습니까? – Har

+0

SML의 목록이 링크 된 구조 또는 배열로 구현되어 있습니까? – Har

+0

@Har SML 목록은 * 불변 *, 단독 연결 목록입니다. 그들은 정확히'datatype list '와 같습니다. a = Cons of'a * '목록 | ''대신'::'과''Nil' 대신에''단점 '이있는 닐을 사용합니다. 따라서 비어 있지 않은 목록에는 머리 값과 꼬리 인 다른 목록이 있습니다. 둘 다 변경할 수 없습니다. 'x :: xs'는'x'를 머리 값으로,'xs'를 꼬리로하여 새로운 목록을 만듭니다. – sepp2k

1

은 정수 목록에 을 추가하려고 시도합니다. 이는 정수를 추가 할 수 없으므로 불가능한 정수 값 1에 넣습니다.
1::[1,2,3] 그러나 목록 [1,2,3]이 추가 작업을 지원하므로 완전히 유효합니다. ::에 대한 평가 규칙은 t1 :: t1 list이 필요합니다. 여기서 t1은 유형 1의 값이고 t1 list는 유형 1의 목록입니다. 수행중인 작업은 t1 list :: t1입니다.
[1,2,3] @ [1]은 목록에 목록을 추가하기 때문에 유효합니다.

관련 문제