깨지기 쉬운 객체 목록 병합


19

배경 : 차오 쑤 몇 시간 전에 다음과 같은 질문을 게시 : " 이 정렬 네트워크에 감소하지 않는 알고리즘 등 각 요소가 비교되어 정렬 공지의 비교 있습니까 ? 시간을O(logn) ." 우리는이 문제에 약간 얽매어있는 것 같습니다. 2009 년 Valentin Polishchuk과 같은 문제에 대해 논의했지만 아무데도 갈 수 없었습니다.

신선한 아이디어를 얻으려면 비슷한 맛을 지니고 있으며 사소한 것이 아닌 가장 간단한 질문을 시도했습니다. 따라서 다음 질문입니다.


질문 : 각각 요소가있는 두 개의 정렬 된 목록이 제공 됩니다. 각 요소가 O ( 1 ) 번만 비교되도록 목록 을 병합 할 수 있습니까 ?nO(1)

당연히, 출력은 모든 요소 를 포함하는 정렬 된 목록이어야합니다 .2n

[이것은 사소한 것으로 판명되었습니다. 대답은 "아니오"입니다.]


질문 2 : 두 개의 정렬 된 목록이 제공되며 각각 요소가 있습니다. 소량의 요소버릴 수있는 경우 각 요소가 O ( 1 ) 회만 비교되도록 목록 을 병합 할 수 있습니까 ?nO(1)

보다 상세하게, 출력은 정렬 된 목록이 포함되어야 요소와,이 "휴지통"은 포함하는 T ( N ) 요소. T ( n ) 값을 얼마나 작게 만들 수 있습니까? T ( n ) = n을 얻는 것은 간단합니다. T ( n ) = n / 100 과 같은 것은 간단한 방법으로 수행 할 수 있어야합니다. 그러나 T ( n ) = o ( n2nT(n)T(n)T(n)T(n)=nT(n)=n/100 ?T(n)=o(n)


노트:

  • 여기서는 비교 모델을 사용합니다. 결정 론적 알고리즘만으로 최악의 보증에 관심이 있습니다.

  • 참고 것을 모두 리스트는 정확히이 요소를. n 개의 요소가있는 목록과 1 개의 요소가있는 목록이 있다면 그 대답은 분명히 "아니오"입니다. 그러나 두 목록이 모두 길면 "로드 밸런싱"을 수행 할 있는 것 같습니다 .nn1

  • 이번에는 모든 종류의 알고리즘이 유효합니다. 알고리즘이 정렬 네트워크를 빌딩 블록으로 사용하는 경우 완벽하게 좋습니다.

  • 시작점으로 여기에 각 요소를 최대 200 회 비교하는 간단한 알고리즘이 있습니다. 표준 병합 알고리즘 만 사용하고 목록 헤드의 카운터는 유지하십시오. 200에 도달하면 요소를 버리십시오. 이제 버린 각 요소에 대해 출력 배열에 200 개의 요소를 성공적으로 배치했습니다. 따라서 을 달성했습니다 .T(n)=n/100


8
당신은 "우리가 n 개의 원소를 가진리스트와 1 개의 원소를 가진리스트를 가지고 있다면, 대답은 분명히 아니오"라고 말했다. 각 목록에 n 개의 요소가있는 경우가 더 일반적인 문제가 아닙니까? 예를 들어, 첫 번째 요소를 제외한 두 번째 목록의 모든 요소가 첫 번째 목록의 모든 요소보다 훨씬 크다고 약속해도 첫 번째 문제로 축소되지 않습니까?
Robin Kothari

@Robin : 맞습니다. 그래서 사소한 질문을하지 못했습니다. 감사합니다. 모든 요소를 정렬 해야한다고 주장 하면 하한이 있는 것으로 보입니다 . 질문을 조금만 보강하겠습니다 ...Ω(logn)
Jukka Suomela

그리고 누군가 질문 2에서 겉보기에 이상한 정의의 요점이 무엇인지 궁금해하는 경우 매우 작게 만들 수 있다면 병합 정렬과 같은 것을 사용 하여 원래 문제 를 거의 풀고 작은 부분에 대해 걱정할 수 있습니다. 나중에 휴지통에있는 요소들 T(n)
Jukka Suomela

답변:


5

아니요, 그러한 알고리즘은 존재할 수 없습니다.

요소 당 비교가 허용 된다고 가정하십시오 .t

2t2t+1t+1

nn/2tn/2t

to(n)

참고로, 모든 요소가 다른 목록의 주변 부분 크기의 대략적인 로그와 비교되는 알고리즘에 의해이 범위를 일치시키는 것이 가능합니다. 이것이 관심이 있다면 세부 사항을 해결하려고 노력할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.