코인 플립 비교기를 사용할 때 무작위 순열을 반환하는 "정렬"알고리즘이 있습니까?


9

표준 검색 알고리즘에 사용 된 비교기가 공정한 코인 플립으로 대체 될 때 실행 시간이 변경되는지, 그리고 또한 균일 한 순열 생성기를 작성하지 못하는 Microsoft의 눈에 띄는 오류 에 대해 질문 하는 사람은 이 질문 에서 영감을 얻었 습니다. :

비교기의 구현에 따라 비교 기반 정렬 알고리즘이 있습니까?

  1. 실제 비교자를 사용할 때 요소를 정렬 된 순서로 반환합니다 (즉, 비교는 표준 정렬 알고리즘에서 예상하는 것을 수행합니다)
  2. 비교기가 공정한 동전 뒤집기로 대체 될 때 (즉, x < y = truex와 y의 값에 관계없이 확률 1/2로 반환) 요소의 균일 한 무작위 순열을 반환합니다.

정렬 알고리즘의 코드는 동일해야합니다. 비교할 수있는 비교 "블랙 박스"내부의 코드 일뿐입니다.


이 질문 도 참조하십시오 .
Raphael

2
cstheory.stackexchange.com/questions/5321/… 흥미로운 질문도 참조하십시오 .
Yuval Filmus

1
임의 비교기가 제대로 작동하기를 원하십니까? 가능한 두 가지 방법이 있습니다. (1) 비교기가x<y그런 다음 x<y 항상 그리고 또한 y>x. (2) 동일하지만, 비교기가 더 결정하면x<yy<z그러면 커밋합니다. x<z (과 z>x). 두 경우 모두 제한되지 않은 각 쿼리는 여전히 완전히 무작위입니다.
Yuval Filmus

@YuvalFilmus 나는 무작위 게이트를 요소 쌍을 정렬하는 비교 교환 게이트로 교체하면 동일한 회로도 정렬해야한다는 점을 제외하고는 본질적으로 링크 된 질문에서 요구되는 것을 원합니다 .
Joe

1
멋진 시각화를 위해 여기 를 참조 하십시오 .
Raphael

답변:


3

입력 튜플에 대해 다음과 같은 결정 론적 (비교기없이) 알고리즘이 작동합니다. (a1,,an):

  1. 할 일 피셔 - 예이츠 셔플 일부 정적 쌍으로 비교를 사용하여 (예를 들어a1<a2)를 코인 플립으로 사용합니다 (수락 거부 샘플링 수행). 비교기가 출력되는 경우1 처음에는 결정적 인 경우 무한 거부 루프를 피하기 위해 거꾸로 사용하십시오.
  2. (옵션 속도 향상 : 한 쌍을 시도하십시오 n 시간, 어디서 n길이 또는 입력입니다. 두 출력이 다르면 (1)에서 얻은 순열을 반환합니다.
  3. 병합 정렬을 사용하여 배열을 정렬하십시오.

비교 자로 결정 론적 순서 관계가 주어지면이 알고리즘은 배열을 시간순으로 정렬합니다. O(nlogn) Fisher-Yates 셔플이 실행되기 때문에 O(n) 최대를 사용하여 O(logn)각 단계 및 병합 정렬에서 비 랜덤 "랜덤 비트"(예 : 비교기 호출)는 동일한 점으로 복잡합니다. 이 경우 (1)의 결과는 전혀 쓸모가 없지만 실제 정렬이 이루어 지므로 아무런 해가 없습니다.

비교기 (1)가 각 순열에 대해 동일한 확률로 배열을 순열하고 실제 (3)을 생략 해야하는 경우 (2) 또는 (2) 임의성을 결정하지 못한 경우) 실제 동전 뒤집기를 고려할 때 이것은 아닙니다 결과 분포는 (1) 때문에 모든 순열에 균일하게 분포 된 입력 순서에만 의존하므로 전체 알고리즘의 결과도 균일하게 분포되기 때문에 해가 발생합니다. 각 합격-거부 샘플링을 반복해야하는 횟수는 기하 분포 (확률로 거부)<12) 따라서 예상 값이 있습니다 <2. 각 반복은 최대 사용logn런타임 분석은 결정 론적 경우와 거의 동일하지만, 그래서 비트, 우리는 단지 얻을 것으로 예상 런타임 의를O(nlogn)비 종료의 가능성으로 ( 거의 확실하게 종료합니다 ).


Joe가 지적한대로 : (1)의 첫 번째 비트에 대한 테스트가 마음에 들지 않으면 (3)을 수행 한 다음 (1)을 사용하십시오. an<a1 항상 0결정적인 경우에 배열이 이미 정렬되어 있기 때문입니다. 또한 난수의 상한이 동일한 순열을 생성하므로 루프 범위의 상한에서 난수를 빼야합니다. 그러나 몸값의 경우 항상 셔플을 수행해야하므로 (2)는 금지되어 있습니다.


(1)과 (3)에 대해 동일한 호출을 비교기에 사용할 수 있지만 결과가 균일하게 분포되어 있음을 증명하는 것이 가능하다면 적어도 훨씬 더 어려워집니다.


The following algorithm is has no distinct phases to shuffle and sort, but is asymptotically slower. It's essentially insertion sort with binary search. I will use a=(a1,,an) to denote the input and bk=(bk,1,,bk,k) to denote the result after the k-th round:

  1. Set b1,1=a1
  2. If a2<a1 then b2=(a2,a1) and (c,d):=(2,1) else b2=(a1,a2) and (c,d):=(1,2). In either case ad<ac will always be 0 (i.e. false) for a nonrandom comparator.
  3. To obtain bk for k3 obtain bk1 first.
  4. Let l=log2k and k=2l, i.e. k is the least power of 2 not smaller than k.
  5. Let i0=0. For every j{1,,l} let
    ij={ij1+2ljij1+2lj>k1ad<acij1ij1+2lj>k1¬(ad<ac)ij1+2ljij1+2ljk1bk1,ij1+2lj<akij1ij1+2ljk1¬(bk1,ij1+2lj<ak)
  6. If il>k repeat (5.) else bk=(bk1,1,,bk1,il1,ak,bk1,il,,bk1,k1)
  7. Output bn

Random case: 5 + the if clause of 6 is essentially acceptance-rejection sampling. The rest of the algorithm is a naive shuffle: shuffle the first k1 elements and add the k-th element to each position with equal probability. If we used the normal insertion sort, we would get a binomial distribution instead.

Note that this algorithm is inefficient in both modes compared to the Fisher-Yates shuffle and merge sort as inserting an element to an arbitrary position is expensive if using an array and binary search needs linear time if using a list. But perhaps a modification of heap sort or tree sort in a similar way could lead to a faster algorithm.


@ 조 현재 모양의 게시물에 유효한 모든 포인트를 하나의 주석에 넣고 나머지를 삭제할 수 있습니까?
frafl

I was hoping for an algorithm that doesn't do different steps depending on which comparator is used. Can you avoid an infinite rejection-loop without probing the comparator? I think you could avoid rejection by performing step (3) first...
Joe

What if you do the sorting step, then do the shuffle, but use a sequence of comparisons which depend on the index i, so that in the deterministic case, you get the index of the element (no swap), and it remains sorted, but in the random case you perform the standard shuffle with rejection sampling.
Joe

First comment: Note that I don't throw away that first sample bit, it's "dual use". I thought about inverting every 2nd bit, but that would not prevent the endless loop. In fact some irregular pattern is needed and even may reject a lot more entries. Of course I could XOR the two most recent bits instead of the first and the most recent, but that's not really different.
frafl

Second Comment: The order (1) vs. (3) is only important if you use step (2), because in the random case you have to assure that the shuffle is done with probability 1 otherwise the uniform distribution will be violated. Why should it depend on i? In this case an<a1 will always answer 0, which is all we need.
frafl

4

No, this is impossible unless n2. The probability that a permutation is generated by your algorithm using a random comparator is dyadic, i.e. of the form A/2B, whereas the probability should be 1/n!. When n>2, there is no way to write 1/n! in the form A/2B.


1
그러나 런타임에 결정 론적 경계가 필요한 경우에만 문제가되지 않습니다. 예상 런타임 만 유한해야하는 경우에는 문제가되지 않습니다.
frafl

1
Are you aware of any reasonable sorting algorithm which doesn't terminate in polynomial time?
Yuval Filmus

2
You mix the deterministic and random case. The algorithm may terminate in deterministic polynomal time if called with a deterministic order relation and in expected polynomial time if called with a coin as comparator.
frafl

@YuvalFilmus 왜 의사 결정 트리가 있어야합니까? 2케이 이파리?
Joe

If you're doing up to k comparisons in total, then the probability of any event is going to be of the form A/2k. It's not about the number of leaves. The only way out is, as frafl suggests, having an unbounded number of comparisons.
Yuval Filmus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.