집합이 정렬 된 링크 된 목록으로 표시되는 경우 선형 스캔이 가장 잘 수행하는 방법입니다. 실행 시간은 입니다.O ( | A | + | B | )
모든 요소를 B의 모든 요소와 쌍 으로 비교할 필요는 없습니다 . 결과적으로 O ( | A | × | B | ) 의 런타임이 발생 하며 이는 훨씬 더 나쁩니다. 대신,이 두 세트의 대칭 적 차이를 계산하기 위해 mergesort의 "병합"조작과 유사한 기술을 사용하여 두 세트에 공통적 인 값을 생략하도록 적절하게 수정할 수 있습니다.ㅏ비O ( | A | × | B | )
보다 구체적으로, 당신은 계산하기 위해 다음과 같은 재귀 알고리즘을 구축 할 수 있습니다 ∖ B를 가정 와 B를 정렬 된 순서로 자신의 값을 연결리스트로 표시됩니다 :A ∖ Bㅏ비
difference(A, B):
if len(B)=0:
return A # return the leftover list
if len(A)=0:
return B # return the leftover list
if A[0] < B[0]:
return [A[0]] + difference(A[1:], B)
elsif A[0] = B[0]:
return difference(A[1:], B[1:]) # omit the common element
else:
return [B[0]] + difference(A, B[1:])
나는 이것을 의사 파이썬으로 표현했습니다. 파이썬을 읽을 수없는 경우, A[0]
연결리스트의 머리는 A
, A[1:]
리스트의 나머지이며, +
목록의 연결을 나타냅니다. 효율성상의 이유로 파이썬으로 작업하는 경우 위와 같이 정확하게 구현하고 싶지 않을 것입니다. 예를 들어 생성기를 사용하여 많은 임시 목록을 작성하지 않는 것이 좋습니다. 가장 간단한 형태로 아이디어를 보여줍니다. 이 의사 코드의 목적은 구체적인 구현을 제안하는 것이 아니라 알고리즘을 설명하기위한 것입니다.
세트가 정렬 된 목록으로 표시되고 출력을 정렬 된 목록으로 제공하려는 경우 더 잘 수행 할 수 없다고 생각합니다. 기본적으로 와 B 의 모든 요소를 살펴 봐야 합니다. 비공식적 인 정당화 스케치 : 보지 않은 요소가 있으면 출력 할 수 없으므로 요소를 볼 수없는 유일한 경우는 A 와 B 모두에 있음을 알고 있다면 , 그러나 그 가치를 보지 않았다면 어떻게 존재하는지 알 수 있습니까?ㅏ비ㅏ비