Fisher-Yates 셔플 알고리즘의 복잡성


15

이 질문은 주어진 배열의 무작위 셔플을 반환하는 Fisher-Yates 알고리즘과 관련이 있습니다. 위키 백과 페이지 의 복잡도가 O (n)의 것을 말한다, 그러나 나는 (N N 로그) O라고 생각합니다.

각 반복 i에서 임의의 정수는 1과 i 사이에서 선택됩니다. 단순히 메모리에 정수를 쓰는 것은 O (log i)이며 n 개의 반복이 있기 때문에 총계는

O (log 1) + O (log 2) + ... + O (log n) = O (n log n)

순진한 알고리즘이 아닙니다. 여기에 뭔가 빠졌습니까?

참고 : 순진 알고리즘은 (0,1) 간격으로 각 요소에 임의의 숫자를 할당 한 다음 할당 된 숫자와 관련하여 배열을 정렬하는 것입니다.

답변:


24

나는 대부분의 알고리즘이 작동하는 것처럼 비트 번호 를 읽고 쓰는 비용이 일정하다고 가정합니다. P와 PSPACE를 실수로 쫓아 내고 쓰러 뜨리지 않는 한 사소한 죄 입니다.O(logn)


4
그것이 실제로는 "사소한 죄"이지만, 이것이 명시 적으로 언급되지 않은 것은 TCS 교육학의 주요 죄라고 생각합니다! 모든 CS 학생은 스스로 이것을 발견하고, 모든 사람이 이것을 알고 있지만 아무도 그것에 대해 이야기하지 않는다는 말을들을 때까지 중요한 것이 잘못되었다고 생각합니다. 또한 몇 년 전 누군가가 O (log n) 모델을 악용하여 오메가 (n ^ 3)라고 추측 된 유명한 문제에 대한 하위 큐브 시간 알고리즘을 제공했을 때 브로 하하가 없었습니까? 그 문제가 해결 되었습니까?
randomwalker

2
나는 당신이 말하는 brouhaha를 모른다. 그것을 언급하지 않는 한, 당신은 확실히 맞습니다. 내가 처음 제프 에릭슨의 게시물을 읽은 후, 나는 지금 그것을 단지 : 차기 내 형상 클래스의 P를 증명하는 지점 = PSPACE 만들기
수레 쉬 벤 카트

1
답변 해주셔서 감사합니다. 나는 그것이 그렇게 큰 일인지 몰랐다. 링크는 좋은 독서를 제공합니다.
Tomer Vromen

1
결론 : 항상 모델을 명시 적으로 만드십시오.
Jukka Suomela

2
비트 연산을 일정 시간으로 유지 하는 주된 이유 는 (다항식 시간) 모든 O ( log n ) 비트 피연산자 쌍에 대해 상수 시간 액세스 조회 테이블을 프로그래밍 할 수 있기 때문입니다. "현대"전산 모델. 그것에 대해 "진정한"것은 없습니다 ... 저는이 속성을 일반성을 잃지 않고 단순히 가정 할 수있는 것으로 생각합니다. 영형(로그)영형(로그)
Ryan Williams

17

표준 계산 모델에서는 O (log n) 비트 정수에 대한 산술 연산을 일정한 시간에 실행할 수 있다고 가정합니다. 이러한 연산은 일반적으로 하드웨어로 처리되기 때문입니다. 따라서 Fisher-Yates 알고리즘에서 "정수 i를 메모리에 쓰는 데"는 O (1) 시간 만 걸립니다.

물론 비트 연산 측면에서 알고리즘을 분석하는 것은 완벽하게 의미가 있지만 비트 비용 모델은 실제 동작을 예측하기가 어렵습니다. 단순 루프조차도 for i = 1 to n: print(i)O (n log n) 비트 연산이 필요합니다.


루프와 좋은 점. 그 눈치 채지 못했던 ...
Tomer Vromen

8

이것은 "[Fisher-Yates algorithm]이 순진한 알고리즘보다 낫지 않습니다. 여기에 뭔가 빠졌습니까?" 질문에 물어 봤습니다

실수를 사용하는 "순진한"알고리즘에서 몇 비트의 정확도를 사용합니까? 비트 복잡도를 세는 경우 (피셔-예이츠에서하는 것처럼) 알고리즘이 실수에 k 개의 임의 비트를 사용하는 경우 두 k를 비교하기 때문에 실행 시간은 Ω (kn log n)이됩니다. 비트 실수는 Ω (k) 시간이 걸립니다. 그러나 두 요소가 동일한 실수로 매핑되는 것을 방지하려면 k는 Ω (log n) 이상이어야합니다. 즉, 알고리즘은 Ω (n log 2 n) 시간이 걸리므로 Fisher-Yates가 로그 계수 n.

산술 및 비교 연산 의 를 세고 비트 복잡성을 무시하는 경우 Fisher-Yates는 Θ (n)이고 알고리즘은 Θ (n log n)이며 여전히 log n의 요소입니다.


나는 "순진"알고리즘이 ... 그 암시 K을 한 것으로 의심
토 메르 Vromen에게

1
"순진한"알고리즘은 다음과 같이 선형 시간으로 깨끗하게 구현 될 수 있습니다. 각 요소에 1과 n ^ 3 사이의 임의의 정수를 할당 한 다음 기수 정렬을 통해 O (n) 시간으로 숫자를 정렬하십시오. (확률이 높으면 두 요소가 같은 난수를 얻지 못합니다. 중복이 있으면 재귀 적으로
다시 섞습니다

@JeffE : 감사합니다! 그것은 매우 깨끗하며 Fisher-Yates와 같은 복잡성을 가지고 있습니다. 이것을 게시 한 후 실제로 "순진한"알고리즘이 더 나빠서는 안된다고 생각했습니다 ... O (nklog n)이 필요하지 않고 n k 비트 숫자를 O (nk)로 정렬 할 수 있다는 사실을 놓쳤습니다. 그러나 Knuth-Fisher-Yates가 상수에서 여전히 더 낫습니다. 정확히 (log n!) 임의의 비트 (1에서 n까지의 정수, 1에서 n-1 등)가 필요합니다. 3n log n)이며 일정한 여분의 메모리로만 수행 할 수 있습니다.
ShreevatsaR

6

이 문제에 대한 정수에는 특별한 것이 없습니다.

예를 들어, 해시 함수가 해시를 계산하기 위해 전체 값을 읽어야하는 경우 해시 테이블 (모든 종류의 값 저장)은 액세스하는 데 O (1) 시간이 아닙니다. n 개의 고유 한 요소는 표현이 얼마나 영리한 지에 관계없이 평균적으로 n 개의 비트를 나타내야하며, 전체 입력을 읽는 해시 함수는 계산하는 데 시간이 오래 걸립니다. 실제로 그들은 적갈색보다 빠르지 만, 무증상으로는 더 나을 수 없습니다.

randomwalker가 언급 한 brouhaha는 POPL 2008 논문 ( http://portal.acm.org/citation.cfm?doid=1328438.1328460 )에 관한 것입니다. http://blog.computationalcomplexity.org/2009/05/shaving- logs-with-unit-cost.html

그 포스트에서 Lance Fortnow는 학생이 두 요소의 모든 log n 비트를 읽어야 만한다면 정렬에 실제로 n log ^ 2 n 시간이 필요하다고 불평하는 방법을 설명합니다.


블로그 게시물의 저자를 얻지 못했습니다. 그는 분류가 실제로 O (n log ^ 2 n)라고 불평하지만 종이가 견고하다고 말합니다.
Tomer Vromen

이 논문은 산술 연산에 단위 시간이 걸리는 모델이 있다는 점에서 견고합니다 (즉, 거짓이 아님).이 모델에서는 논문의 알고리즘이 o (n ^ 3) 연산을 가장 먼저 수행합니다.
Dave Doty

비트 측면에서 입력 자체의 크기는 O (n log n)이므로 O (n log ^ 2 n) 이의 제기를받지 못했습니다. BTW, 보조 노트로, 복잡성 블로그에 대한 의견의 품질 수준은 .... 훨씬 더 높은 다음이었다
arnab

4

Wikipedia 페이지는 복잡도가 O (n)이라고 말하지만 O (n log n)라고 생각합니다.

실제로 O (n log n)는 정렬이 O (n log n) 인 모델에서이 문제의 하한입니다. 모든 순열이 똑같이 가능하면 랜덤 스트림에서 순열에 대한 함수로서의 알고리즘이 예상되어야합니다. n이 있습니다! 순열은 의사 결정 트리 모델과 같이 길이가 적어도 O (log n!) = O (n log n) 인 분기가 있습니다.

1ϵ영형(ϵ)


3

TCS에서는 명시 적으로 언급되지 않은 경우 Turing Machine의 복잡성을 고려합니다. 이것은 이론적 인 목적에는 적합하지만 하드웨어에서 다른 머신 모델 (유한 근사)을 구현하기 때문에 결과는 실제로 도움이되지 않습니다. 따라서 해당 모델에서 복잡성을 요구하는 것은 실현 가능한 질문입니다. 예를 들어, 우리는 일반적으로 레지스터 머신 (실제 CPU와 유사)이 일정한 시간에 두 레지스터에서 원자 연산을 수행 할 수 있다고 가정합니다. 이것이 여기서 채택되었을 수 있습니다.

요컨대, 기사 작성자는 TM의 관점에서 RM의 관점에서 생각합니다. 둘 다 맞아

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