두 개의 큰 세트 간의 계산 세트 차이


14

두 개의 큰 정수 세트 와 있습니다. 각 세트에는 약 백만 개의 항목이 있으며 각 항목은 최대 10 자리 길이의 양의 정수입니다.

와 를 계산 가장 좋은 알고리즘은 무엇입니까 ? 다시 말해, 있지 않은 의 항목 목록을 어떻게 효율적으로 계산할 수 있습니까? 이러한 운영을 효율적으로하기 위해이 두 세트를 나타내는 가장 좋은 데이터 구조는 무엇입니까?

내가 얻을 수있는 가장 좋은 방법은이 두 세트를 정렬 된 목록으로 저장하고 모든 요소를 모든 요소와 선형 방식으로 비교하는 것입니다. 더 잘할 수 있을까요?B


다른 방식으로 저장하려는 경우 더 나은 결과를 얻을 수 있습니다.
Realz Slaw

또한 결과를 암시 적 데이터 구조로 얻으려는 경우; 두 세트를 쿼리하여 자체 쿼리 각각에 응답하는 구조를 만들 수 있습니다.
Realz Slaw

1
@ user917279 한 가지 중요한 점은 일반적으로 사전 처리 / 구성 시간, 쿼리 시간 및 메모리 사용량을 서로 상쇄 할 수 있다는 것입니다. 구조체를 거의 편집하지 않지만 많이 쿼리합니까? 다른 방법? 기억이 관심사인가? 이러한 질문은 실제적인 관점에서 대답 할 수 있으며 "올바른" "이론적"구성의 선택을 알려줍니다.
라파엘

1
@Raphael 더 많은 메모리를 사용하거나 준비에 더 많은 시간을 소비함으로써 복잡성 측면에서 유창하게 지속되는 세트보다 더 잘 할 수 있다고 제안하십니까? 가능하다고 생각하면 궁금합니다. 이 크기의 입력 세트에 대한 옵션으로 조회 테이블을 볼 수 없습니다.
smossen

1
@ user917279 동일한 두 개의 거대한 집합의 예를 고려할 경우 해시 구성을 사용하여 만든 모든 데이터 구조는 동일한 구조가 만들어 질 때 병합되므로 동일한 메모리 위치를 공유하므로 O (1)에서 동등성 테스트를 지원합니다. 합류 적으로 영구적 인 세트는 두 구조가 거의 같은 경우에도 해시 구성을 이용합니다. 복잡성은 내가 지금까지 주문한 세트에서 본 것 중 최고입니다.
smossen

답변:


9

특수한 데이터 구조에 세트를 기꺼이 저장하려는 경우 몇 가지 흥미로운 복잡성을 얻을 수 있습니다.

보자 나는=영형((||,||,|Δ|))

그런 다음 설정 작업을 할 수 B , B , BΔ B 에, 각각 O ( 내가 로그인 | | + | B |,,AΔB시간을 예상했다. 따라서 본질적으로 두 세트의 최소 크기 또는 대칭 차이의 크기 중 작은 값을 얻습니다. 대칭 차이가 작은 경우 선형보다 낫습니다. 즉. 교차로가 큰 경우 실제로, 원하는 두 세트 차분 연산의 경우, 실제로 대칭 출력의 크기를 구성하기 때문에 실제로 출력에 민감합니다.O(Ilog|A|+|B|I)

자세한 내용 은 Olle Liljenzin (2013)의 Confluently Persistent Set and Maps 를 참조하십시오.


논문의 가두는 순서대로 검색 트리입니다. 분류되지 않은 데이터 구조로 계산하지 않습니다.
smossen

@ smossen 충분히 사실, 나는 그것을 편집했습니다.
Realz Slaw

6

집합이 정렬 된 링크 된 목록으로 표시되는 경우 선형 스캔이 가장 잘 수행하는 방법입니다. 실행 시간은 입니다.영형(||+||)

모든 요소를 B의 모든 요소와 쌍 으로 비교할 필요는 없습니다 . 결과적으로 O ( | A | × | B | ) 의 런타임이 발생 하며 이는 훨씬 더 나쁩니다. 대신,이 두 세트의 대칭 적 차이를 계산하기 위해 mergesort의 "병합"조작과 유사한 기술을 사용하여 두 세트에 공통적 인 값을 생략하도록 적절하게 수정할 수 있습니다.영형(||×||)

보다 구체적으로, 당신은 계산하기 위해 다음과 같은 재귀 알고리즘을 구축 할 수 있습니다 B를 가정 와 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 의 모든 요소를 ​​살펴 봐야 합니다. 비공식적 인 정당화 스케치 : 보지 않은 요소가 있으면 출력 할 수 없으므로 요소를 볼 수없는 유일한 경우는 AB 모두에 있음을 알고 있다면 , 그러나 그 가치를 보지 않았다면 어떻게 존재하는지 알 수 있습니까?


환상적인, 세트가 정렬 된 목록으로 저장되어야하는 제약 조건이 제거된다면 다른 옵션이 있습니까?
user917279

2

A와 B의 크기가 동일하고 분리되고 인터리브 된 경우 (예 : A의 홀수 및 B의 짝수) 선형 시간의 항목을 쌍으로 비교하는 것이 가장 좋습니다.

A와 B에 정확히 A 또는 B 중 하나 또는 둘 다에있는 항목 블록이 포함 된 경우 하위 선형 시간에서 집합 차이, 합집합 및 교집합을 계산할 수 있습니다. 예를 들어 A와 B가 정확히 하나의 항목이 다르면 차이를 O (log n)로 계산할 수 있습니다.

http://arxiv.org/abs/1301.3388


1
그는 세트가 주문되어 목록, 검색 트리 또는 다른 것으로 저장 될 수 있다고 말합니다. 데이터를리스트로 저장해야한다면, 선형 시간 (리스트에서 이미 알고리즘을 찾은)으로리스트를 스캔하는 것보다 더 나은 알고리즘이 없을 때 "AB를 계산하기위한 최상의 알고리즘"을 요구하는 것은 무의미합니다.
smossen

1
맙소사, 당신은 같은 종이를 링크로 I (I, 같은 당신은 오히려으로) ... 당신의 연결 다음 번 이름 : D
Realz 양배추

@smossen 환상적인, 내가 가진 지식 (?)에 관계없이 나는 그것들을 분류 된 목록으로 표현했지만 다른 제안들도 겸손히 환영합니다.
user917279

2

¯,


1010가능한 엔트리, 비트 벡터는 실용적이지 않다.
Raphael

1
R., 요점을 놓쳤다. 단일 long은 32 개의 요소 또는 1 byte, 8 개의 요소를 저장할 수 있습니다 . 따라서 1M 항목은 ~ 125K RAM에만 저장할 수 있습니다! 스토리지는 문제 구현 방식에 따라 다른 표현보다 훨씬 효율적일 수 있습니다.
vzn

따라서 OP가 관심을 갖는 세트에는 12MB 이상이 필요합니다. 현재 모든 캐시를 불고 희소 세트에는 끔찍합니다. 특히, 빈 세트를 작성하면 다른 모든 조작이 성립됩니다 (드문 드문 경우). Knuth는 TAoCP에서이 문제를 해결했습니다.
Raphael

12MB? 응? 포스터는 2 세트 밖에 없다고 말했다. 포스터는 그의 세트의 희소성 / 밀도를 명시하지 않았다. 이것은 내 대답에 지적되어 있습니다. 그가 희소 세트를 가지고 있다고 가정합니까? 정답이 하나도 없으며,이 접근법은 상황에 따라 유용한 대체 옵션 으로 지적됩니다 . 그것은이 문맥에서 드물게 사용되지 않습니다 ...
vzn

"각 세트에는 약 백만 개의 항목이 있으며 각 항목은 최대 10 자리 길이의 양의 정수입니다."라는 질문을 다시 읽어 보시기 바랍니다. 있다1010 다른 숫자가 발생할 수 있으며 106목록에있는 것들. 즉, 비트 벡터의 모든 항목 중 0.01 % 만 1임을 의미합니다. (내 12MB가 너무 낮았다는 것이 밝혀졌습니다.10101.15.)
라파엘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.