크기의 크기 $ m $의 임의의 서브 세트를 효율적으로 선택하는 $ n $
-
29-09-2020 - |
문제
이것은 내 질문의 십자가입니다 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 $ 항목.