숫자에 대한 기본 연산에 일정한 시간이 걸린다고 어떻게 가정 할 수 있습니까?


73

일반적으로 알고리즘에서는 숫자의 비교, 덧셈 또는 뺄셈에 신경 쓰지 않습니다 . 시간 에서 실행한다고 가정 합니다. 예를 들어, 비교 기반 정렬이 이라고 말할 때 이것을 가정 하지만, 숫자가 레지스터에 맞지 않을 때는 일반적으로 숫자를 배열로 나타내므로 기본 연산에는 요소 당 추가 계산이 필요합니다.O(1)O(nlogn)

에서 두 숫자 (또는 다른 기본 산술 함수)를 비교할 수 있다는 증거가 있습니까? 그렇지 않다면 왜 우리는 비교 기반 정렬이 입니까?O ( N 로그 없음을 )O(1)O(nlogn)


나는 SO 질문에 대답 할 때이 문제가 발생했으며 조만간 big-int를 다루어야하기 때문에 알고리즘이 이 아니라는 것을 깨달았 으며 의사 다항식 시간 알고리즘이 아니기 때문에 였습니다.PO(n)P


3
숫자를 비교하는 복잡성을 계산하려는 경우 입력의 비트 크기로 복잡도 범위를 작성해야합니다. 따라서 주어진 비트 숫자 입력의 비트의 크기는 및 수행 될 수있는 소팅 시간. w N = N w O ( N w 로그 N ) = O이 ( N 로그 N )N wn=NwO(NwlogN)=O(nlogn)
Sasho Nikolov

2
복잡성 연구에는 기본적으로 두 가지 "영역"또는 "정규"가 있습니다. 일반적으로 연산은 "고정 너비"연산에 대해 가정되는데, 부동 소수점 (예 : 2-4 바이트)을 포함하여 고정 너비 숫자 표현을 가진 대부분의 컴퓨터 언어에 대한 합리적인 근사값입니다 (예 : IEEE 표준 참조). 숫자가 임의의 크기를 가지고 있고 연산의 복잡성에 대해 더 신중하고 정확한 연구가있는 "임의 정밀도 산술" 전자의 맥락은 응용 분석에 더 많고 후자는 이론 / 추상 분석에 더 많이있다. O(1)
vzn

답변:


75

생계 알고리즘을 연구하는 나와 같은 사람들에게 21 세기 표준 계산 모델은 정수 RAM 입니다. 이 모델은 실제 컴퓨터의 동작을 튜링 머신 모델보다 정확하게 반영하기위한 것입니다. 실제 컴퓨터는 병렬 하드웨어를 사용하여 일정한 시간에 여러 비트 정수를 처리합니다. 하지 임의의 정수,하지만 (워드 크기는 시간이 지남에 따라 지속적으로 증가하기 때문에)하지 크기 고정 하거나, 정수를.

모델은 단어 크기 라는 단일 매개 변수 에 의존 합니다 . 각 메모리 주소에는 단일 비트 정수 또는 word가 있습니다. 이 모델에서 입력 크기 은 입력 의 단어 수이고 알고리즘의 실행 시간은 words에 대한 작업 수입니다 . 단어에 대한 표준 산술 연산 (더하기, 빼기, 곱하기, 정수 나누기, 나머지, 비교) 및 부울 연산 (비트 및 / 또는 xor, 시프트, 회전) 은 정의에 따라 시간 이 필요합니다 .w n O ( 1 )wwnO(1)

공식적으로, 단어 크기 는w 이 모델에서 알고리즘을 분석하기위한 상수가 아닙니다 . 모델을 직감과 일치시키기 위해서는 필요합니다. 그렇지 않으면 정수 을 한 단어로 저장할 수도 없습니다 . 그럼에도 불구하고 대부분의 비 숫자 알고리즘의 경우 실행 시간은 실제로 와 독립적입니다 . 왜냐하면 이러한 알고리즘은 입력의 기본 이진 표현에 신경 쓰지 않기 때문입니다. Mergesort와 heapsort는 모두 시간에 실행됩니다. 최악의 경우, 3 중식의 중간 값이 시간에 실행됩니다 . 주목할만한 예외 중 하나는 시간에 실행되는 이진 기수 정렬 입니다.n w O ( n log n ) O ( n 2 ) O ( n w )wlog2nnwO(nlogn)O(n2)O(nw)

설정 우리에게 기존의 로그에서 선정 된 RAM 모델을 제공합니다. 그러나 일부 정수 RAM 알고리즘은 Andersson 등 의 선형 시간 정수 정렬 알고리즘과 같이 더 큰 단어 크기를 위해 설계되었습니다 . 요구되는 .w = Ω ( log 2 + ε n )w=Θ(logn)w=Ω(log2+εn)

실제로 발생하는 많은 알고리즘의 경우 단어 크기 는 문제가되지 않으며 훨씬 더 균일 한 RAM 모델로 대체 할 수 있습니다. 유일한 큰 어려움은 중첩 곱셈에서 비롯되며 매우 큰 정수를 매우 빠르게 빌드하는 데 사용할 수 있습니다 . 상수 시간 에 임의의 정수에 대해 산술을 수행 할 수 있다면 , PSPACE의 모든 문제를 다항식 시간으로 해결할 수 있습니다 .w

업데이트 : 또한 다중 테이프 Turing 기계 (또는 "비트 RAM")를 사용하는 Fürer의 정수 곱셈 알고리즘 및 이론적으로 분석되는 대부분의 기하학적 알고리즘과 같은 "표준 모델"에는 예외가 있음을 언급해야 합니다. 깨끗하지만 이상적인 "실제 RAM"모델 .

그렇습니다, 이것은 벌레의 깡통입니다.


3
나는 단지 투표하기로되어 있지만 자신의 의견을 막을 수는 없습니다 : 이것이 최선의 답변입니다. 요령은 (1) 산술 연산은 정의에 따라 일정한 시간 이며 이론상 어떤 모델을 선택할 수 있기 때문에 괜찮습니다. (2) 특정 모델을 선택 해야 할 몇 가지 이유 가 있어야 하며,이 답변은 그 기능을 설명합니다.
rgrig

나는 (그리고 난 그냥 투표를하기로되어 있어요), rgig에 동의하지만, 약간의 문제는이 경우 입력 크기가 입력 번호, 예를 들어 관련이없는 것입니다 내 가장 큰 번호가 입력 , 나는 계산 모델을 선택하는 경우 내가 좋아하는 방식으로, 이것은 의사 다항식 시간 알고리즘이 가되게합니다. 맞습니까? m PnmP

1
입력이 비트 이상의 숫자로 구성된 경우 모델에 맞추 려면 실제와 같이 비트 청크 로 분할해야 합니다. 예를 들어, 입력 값 이 과 사이 의 정수 로 구성된 경우 실제 입력 크기는 입니다. 따라서 이 클 때 입력 크기에서 시간 과 같은 의사 다항식 실행 시간은 여전히 ​​기하 급수적입니다 . w N 0 M N log w M = ( N lg M ) / ( lg w ) O ( N M ) MwwN0MNlogwM=(NlgM)/(lgw)O(NM)M
JeffE

Real RAM 모델에서 비밀리에 "Order Type RAM"알고리즘이 아닌 알고리즘이 분석 되었습니까? 나는 그것에 대해 많이 생각해 본 적이 없지만 그렇지 않은 예를 빨리 떠 올릴 수는 없습니다.
Louis

1
@Louis : 예, 로트 : Voronoi 다이어그램, Euclidean 최단 경로, 재귀 절단, 단순한 파티션 트리 등 .... 그러나 가장 좋은 예는 실제 RAM 모델 에서 시간에 실행되는 Gaussian 제거입니다. 단가 정수 정수 RAM이지만 정수 RAM에 시간이 필요합니다O ( N 4 )O(n3)O(n4)
JeffE

24

상황에 따라 다릅니다. 알고리즘의 비트 레벨 복잡성 을 처리 할 때 두 개의 비트 숫자 의 추가 가 이라고 말하지 않고 이라고 말합니다 . 곱셈 등에 대해서도 비슷합니다 .O ( 1 ) O ( N )nO(1)O(n)


참조 기사에서 : "두 가지 다른 방법으로 측정 할 수 있습니다 : 하나는 테스트되거나 곱해진 정수와 다른 하나는이 정수의 이진수 (비트)와 관련이 있습니다."그러나 이것은 사실이 아닙니다. 항상 입력 크기로 측정해야합니다.

1
@SaeedAmiri : 사용되는 인코딩에 따라 다릅니다. 예를 들어, 기사에서 입력이 단항 인코딩을 사용하여 지정된 정수 경우 시험 분할에는 만 필요합니다 . 이것은 입력 크기의 다항식입니다! 이것은 시험 분할에 의한 인수 분해가 있다는 것을 의미합니까 ? 아니요, 알고리즘은 의사 다항식 입니다. 공통 이진 인코딩을 사용하면 입력 크기에 따라 지수 알고리즘을 다시 얻을 수 있습니다. 언급 한 바와 같이, 이는 입력 의 비트 수가 인코딩을 변경함에 따라 기하 급수적으로 작아 지기 때문에 발생합니다 . θ ( n은 1 / 2 ) P의 Nnθ(n1/2)Pn
Massimo Cafaro

그런데 의사 다항식 알고리즘은 실제 인스턴스에서 매개 변수의 크기 차수가 합리적으로 낮은 경우 실제로 유용 할 수 있습니다. 가장 유명한 예는 배낭 문제를 해결하기위한 의사 다항식 알고리즘 일 것입니다.
Massimo Cafaro

먼저 참조 된 위키 페이지가 참조가 없기 때문에 좋지 않다는 것을 언급해야합니다. 또한 의사 다항식 시간 알고리즘에 대해 이야기하고 있다고 생각하는 이유를 알지 못합니다. 입력 크기가 일반적으로 Buttleneck이기 때문일 수 있습니다 이 경우? 그러나 나는 그들에 대해 이야기하지 않고 , 정렬과 같은 입력 크기를 가정하더라도 에있는 문제에 대해 주로 이야기하고 있습니다 . 어쨌든 우리는 부정 행위를 할 수 없으며 NPC 문제가 있다고 말하면 안됩니다. 분류가 라고 말하면 비교를 무시한다는 공식적인 증거가 있습니다. P O (PPO(nlogn)

나는 의사 다항식 알고리즘을 논의하여 입력의 크기에주의를 기울여 오해의 소지가 있음을 보여줍니다. 또 다른 예가 있습니다. 과 같이 입력으로 자연수가 주어지며 알고리즘은 반복에 대해 시간 연산을 수행 하는 루프를 실행합니다 . 입력 크기의 함수로 측정 된이 간단한 루프 알고리즘의 복잡도는 입니다. 이후 입력의 크기는, 알고리즘은 입력 크기 지수이다! 이것에 대해 생각하다. 이제 "컨텍스트에 따라 다릅니다"라는 의미를 이해할 수 있습니다. O ( 1 ) n O ( n ) = O ( 2 l g n ) l g nnO(1)nO(n)=O(2lgn)lgn
Massimo Cafaro

16

언급 된 질문에 대답하기 위해 : 알고리즘 전문가는 RAM 모델을 사용하여 상당히 자주 수행합니다. 정렬을 위해 많은 경우 사람들은 더 간단한 비교 모델을 분석하기도합니다 . 링크 된 답변에서 조금 더 설명하겠습니다.

왜 그렇게하는지 에 대한 암묵적인 질문에 대답하기 위해 :이 모델은 숫자가 모두 "작고"실제 기계에서는 레지스터에 맞는 특정 유형의 조합 알고리즘에 대해 상당히 좋은 예측력을 가지고 있다고 말하고 싶습니다.

수치 알고리즘에 대한 암시 적 후속 조치에 대한 답변 : 아니요, 기존 RAM 모델은 표준이 아닙니다. 가우시안 제거조차도 약간의주의가 필요할 수 있습니다. 일반적으로, 순위 계산를 들어, 슈워츠 보조 정리 입력합니다 (예를 들어, 제 5 여기 ). 또 다른 표준 예는 Ellipsoid Algorithm의 분석으로, 분석에 약간의주의 가 필요합니다 .

그리고 마지막으로, 사람들은 최근에도 문자열 정렬에 대해 생각 했습니다.

업데이트 : 이 질문의 문제는 "우리"와 "가정"이 정확하게 지정되지 않았다는 것입니다. 나는 RAM 모델에서 일하는 사람들이 수치 알고리즘이나 복잡성 이론을 수행하고 있지 않다고 말합니다 (분할의 복잡성을 결정하는 것이 유명한 결과 였습니다 ).


흠, 그것은 흥미로운 답변 인 것 같습니다 ....

질문에 완전히 대답하지 못하는 이유가 있습니까?
Louis

7

나는 이것에 대한 어떤 연구도 찾을 수 없었지만 코젠은 "알고리즘의 설계 및 분석"에 대한 소개에서 모델은 "중간 데이터에 대한 실험적 관찰을보다 정확하게 (로그 비용 모델보다) 반영한다"고 말했다. 크기는 곱하기에 실제로 한 단위 시간이 걸리기 때문입니다. " 그는 또한 모델이 어떻게 남용 될 수 있는지에 대한 예 로써이 논문에 대한 참조를 제공합니다 .O(1)O(1)

이것은 절대적으로 합법적 인 평가 (가 파이썬을 안 이상 때문에)이 아니라 여기에 실행 몇 가지 숫자를의 python -mtimeit "$a * $b"를위한 $a에서 와 . (파이썬 구문이 정수 리터럴을 받아들이지 않고 평가 코드를 약간 전환해야하기 때문에 66에서 멈췄습니다. : p)10{1,2,...,66}$b = 2*$a

각 숫자는 평균 10,000,000 개의 루프이며 각 루프에서 3 번의 실행에 가장 좋은 시간이 걸립니다. 나는 오류 표시 줄이나 무언가를 할 것이지만 더 많은 노력이 필요합니다. : p 어쨌든 그것은 까지 꽤 일정 해 보입니다. 가 43 이기 때문에 약간 놀랍습니다. 이 평가는 특히 가짜이며 C에서 수행해야합니다.1050log10(sys.maxint)


이 특별한 경우에 직장 경험이있을 수도 있습니다 (그러나 확실하지 않습니다 :). 예를 들어 이것을 보아 인 것처럼 보이지만 실제적인 문제이기도합니다. 또한 정렬이 라는 용지를 ? O(n)O(nlognlogm)

7

당신은 맞습니다, 일반적으로 우리는 그것들이 라고 가정 할 수 없습니다 .O(1)

엄밀히 말하면, 비교를 사용하여 N 개의 숫자로 배열을 정렬하고 가장 큰 숫자는 M이면 최악의 경우 각 비교 에는 비트 레벨에서 비교 가 포함될 수 있습니다 . 그리고 알고리즘이 비교를 수행하면 총 복잡도는 입니다.O ( N 로그 N ) O ( N 로그 N 로그 M )O(logM)O(NlogN)O(NlogNlogM)

그러나 Dougal의 실험에서 볼 수 있듯이 단일 레지스터에는 저장할 수없는 매우 큰 값에 대해서만 차이가 있음을 알 수 있습니다.M


O ( 로그 n ) mO(logm) 아닌 , 집합에서 가장 큰 숫자는 입니다. O(logn)m

예, 그러나 정렬 할 N 개의 다른 숫자가 있으면 가장 큰 크기는 비트입니다. O(logN)
Erel Segal-Halevi

아니 당신이 입력의 수 내가 가지고에 관련된 원하는 또한 경우, 입력의 수와 관련이 아니에요 입력 번호와 가장 큰 하나는n n nnnnn

네 말이 맞아, 나는 내 대답을 수정했다.
Erel Segal-Halevi

4

우리는 일반적으로 32 비트 정수 또는 64 비트 정수 또는 IEEE 754 부동 소수점 숫자와 관련하여 작업을 수행하기 때문에 일반적으로 O (1) 산술 연산을 가정한다고 말합니다. O (1)은 아마도 이런 종류의 산술에 대한 근사치 일 것입니다.

그러나 일반적으로 사실이 아닙니다. 일반적으로 더하기, 빼기, 곱하기 및 나누기를 수행하는 알고리즘이 필요합니다. Boolos, Burgess 및 Jefferies의 Computability and Logic 은 적어도 제 4 판 사본에서 몇 가지 다른 공식 시스템, 재귀 함수 및 주판 기계 측면에서 그 증거를 이해하는 방법으로 오릅니다.

왜이 두 가지 연산이 O (1)이 아닌지에 대한 설명을 쉽게하기 위해 Church Numerals와의 뺄셈 및 나눗셈에 대한 람다 미적분학 용어를 볼 수 있습니다. 덧셈과 곱셈과 지수를 찾기는 조금 어렵지만, 교회 숫자 자체의 형태를 고려하면 거기에 있습니다.

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