문제

이것은 내 질문의 십자가입니다 href="http : //math.stackexchange. com "> math.se .

$ n $ 항목 목록이 있으며 $ m $ 을 무작위로 선택하고 싶습니다. 효율적으로 (시간 복잡성 측면에서) 설정하십시오. 또한 가능한 확률로 모든 가능한 하위 집합을 선택하도록 원합니다. 명백한 해결책은 $ 1 $ 에서 $ n $ 로 선택하고 해당 요소를 선택하는 것입니다. 그런 다음 $ m $ 시간을 반복하여 선택한 요소를 선택하고 이미 선택한 이벤트를 계산하지 않습니다. 이것은 $ m $ 접근 $ m> n / 2 $ 대신 $ (nm) $ - 칭찬을 설정하고 칭찬을 반환하는 것이 의미가 있습니다.

$ m $ $ n / 2 $ 에 가깝게, 내가 생각하는 더 나은 솔루션 $ n $ 요소를 고려하고 해당 요소를 선택하거나 삭제할 때마다 삭제하거나 폐기 할 확률을 업데이트 할 때마다 그 요소를 선택하거나 버리십시오. 선택한 vs 이전에 삭제 된 요소. 특히 알고리즘은 다음과 같이됩니다 (Python) :

def randomSubset(n,m):
  L = []
  for i in range(n):
    if uniform(0,1)<m/(n-i): L,m = L+[i],m-1
  return L
.

그러나 나는 이것이 동일한 확률로 각각의 하위 집합이 선택 될 수 없다고 염려하고있다.

두 가지 질문이 있습니다. 첫째,이 알고리즘은 동등한 확률로 하위 집합을 선택합니까 (그렇다면, 그것이하는 증거를 원하고, 그렇지 않은 증거를 좋아하지 않으면 그렇지 않은 경우). 둘째, 더 광범위하게 나는이 문제에 좋은 솔루션이 무엇인지 알고 싶습니다. 분명히 $ m << n $ 이면 첫 번째 방법은 두 번째 방법 (실제로 작동하는 경우)을 일부 시점에서 가장 낫습니다. 먼저. 또한 일반적으로 완전히 다른 접근법이 가장 좋을 수 있습니다.

도움이 되었습니까?

해결책

요소 $ 1 $ $ m $ -subset에 속한 확률입니다. SPAN 클래스="수학 컨테이너"> $ n $ --Element 세트는 $ m / n $ 입니다. 그러므로 확률 $ m / n $ 으로 하위 집합에서 $ 1 $ 을 포함해야합니다.

하위 집합에서 $ 1 $ 을 넣으면 $ (m-1) $ 선택하는 것으로 남아 있습니다. - $ (n-1) $ -Element 세트의

하위 집합에서 $ 1 $ 을 넣지 않은 경우 $ M $ < / span> - $ (n-1) $ -Element 세트의

이것은 $ m $ > $ m-| l | $와 함께 $ m-| l | $를 대체해야 함을 의미합니다. .

결과 알고리즘은

와 다소 유사합니다.

몇 가지 유사점이있는 세 번째 접근법은 $ 1, \ ldots, n $ 의 임의의 순열을 생성하고 첫 번째 $ m $ 항목.

이러한 모든 접근 방식의 단점은 $ \ theta (n) $ 에 대해 실행됩니다. $ m \ ll \ sqrt {n} $ (예상) 시간 $ \ tilde \ theta (m) $ 을 실행합니다.

$ \ theta (n) $ 실행 시간을 다음과 같이 향상시킬 수 있습니다. 우리는 $ m $ indices $ m $ -Subset을 생성합니다. -container "> $ i_1, \ ldots, i_m $ , 여기서 $ i_j \ in \ {1, \ ldots, n- (j-1) \} $ < / span>. $ j $ 'th 하위 집합의 $ i_j $ 'th 가장 작은 숫자가됩니다. SPAN 클래스="수학 용기"> $ \ {1, \ ldots, n \} $ 숫자가 아직 선택되지 않았습니다.

알고리즘의 설명을 완료하려면 다음과 같은 문제를 해결해야합니다. $ s \ subeteq \ {1, \ ldots, n \} $ $ i $ , $ i $ 'th 가장 작은 요소를 찾습니다. -container "> $ \ overline {s} $ . 우리는 $ s $ 은 다음 유형의 쿼리 유형을 효율적으로 답변 할 수있는 구조 (예 : 자체 균형 조정 이진 트리)를 구조에 저장한다고 가정 할 수 있습니다. 주어진 $ x $ , $ s $ . 그런 다음 $ i $ 'TH에서 가장 작은 숫자를 찾을 수 있습니다. $ \ overline {s} $ \ span> 이진을 사용하여 검색.

전반적 으로이 알고리즘은 $ M $ < "$ m $에 대해 $ \ tilde \ theta (m) $ 에서 실행됩니다. / span>은 $ n $ 에서 $ M \ LL \ SQRT {n} $ m \ ll \ sqrt {n} $ 우리는 귀하의 첫 번째 접근 방식을 사용하여

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top