[theory] O (1 / n) 알고리즘이 있습니까?

O (1 / n) 알고리즘이 있습니까?

아니면 O (1)보다 작은 것이 있습니까?



답변

이 질문은 생각보다 어리석지 않습니다. 이론적으로, O (1 / n ) 과 같은 것은 Big O 표기법 의 수학적 정의를 취할 때 완전히 합리적입니다 .

이제 g ( x )를 1 / x로 쉽게 대체 할 수 있습니다 . 위의 정의는 여전히 일부 f에 대한 것 입니다.

점근 적 런타임 성장을 추정하기 위해 이것은 실행 가능성이 낮습니다. 입력이 증가함에 따라 의미있는 알고리즘이 더 빨라질 수 없습니다. 물론이를 수행하기 위해 임의의 알고리즘을 구성 할 수 있습니다 (예 : 다음 알고리즘).

def get_faster(list):
    how_long = (1 / len(list)) * 100000
    sleep(how_long)

분명히,이 함수는 입력 크기가 커질수록 시간이 덜 걸립니다. 적어도 하드웨어에 의해 시행되는 제한 (수의 정밀도, sleep기다릴 수있는 최소 시간 , 인수 처리 시간 등)이 될 때까지 :이 제한은 상수 하한이므로 실제로 위 함수는 여전히 런타임 O (1)을 갖습니다 .

그러나 거기에 있는 런타임 (적어도 부분적) 줄일 수 있습니다 사실 실제 알고리즘 입력 크기가 증가합니다. 그러나이 알고리즘은 O (1) 미만의 런타임 동작을 나타내지 않습니다 . 여전히 그들은 흥미 롭습니다. 예를 들어 Horspool 의 매우 간단한 텍스트 검색 알고리즘을 사용 하십시오 . 여기서는 검색 패턴의 길이가 증가함에 따라 예상 런타임이 감소하지만 건초 더미의 길이가 증가하면 런타임이 다시 증가합니다.


답변

예.

“빈”알고리즘 인 런타임 O (1 / n)의 알고리즘이 정확히 하나 있습니다.

알고리즘이 O (1 / n)이면 단일 명령으로 구성된 알고리즘보다 적은 단계로 무조건 실행됩니다. 모든 n> n0에 대해 한 단계보다 적은 단계로 실행되는 경우 해당 n에 대한 명령이 전혀 없어야합니다. ‘n> n0’인 경우 적어도 하나의 명령 비용이 발생하므로 모든 n에 대한 명령이 없어야합니다.

요약 : O (1 / n) 인 유일한 알고리즘은 명령 이 없는 빈 알고리즘 입니다.


답변

sharptooth가 정확하고 O (1)이 최상의 성능입니다. 그러나 빠른 솔루션이 아니라 고정 된 시간 솔루션을 의미합니다.

흥미로운 변형과 아마도 실제로 제안 되는 것은 인구가 증가함에 따라 어떤 문제가 더 쉬워 지는지입니다 . 나는 생각하고 뺨에 혀로 대답하지만 1을 생각할 수 있습니다.

세트에있는 두 사람이 같은 생일을 가지고 있습니까? n이 365를 초과하면 true를 반환합니다. 365 미만이지만 이것은 O (n ln n)입니다. 문제가 서서히 쉬워지지 않고 n> 365의 경우 O (1)이되기 때문에 아마도 큰 대답은 아닙니다.


답변

그건 불가능하다. Big-O의 정의는 불평등 보다 크지 않습니다 .

A(n) = O(B(n))
<=>
exists constants C and n0, C > 0, n0 > 0 such that
for all n > n0, A(n) <= C * B(n)

따라서 B (n)은 실제로 최대 값이므로 n이 증가함에 따라 감소하면 추정값은 변하지 않습니다.


답변

이전의 큰 O 표기법 학습에서 1 단계 (예 : 변수 확인, 할당 수행)가 필요한 경우에도 O (1)입니다.

“상수”는 중요하지 않기 때문에 O (1)은 O (6)과 동일합니다. 그래서 O (n)은 O (3n)과 동일합니다.

따라서 1 단계가 필요하면 O (1)입니다 … 프로그램에 적어도 1 단계가 필요하기 때문에 알고리즘의 최소 단계는 O (1)입니다. 우리가하지 않으면 O (0)입니다. 우리가 전혀 아무것도하지 않는다면, 그것은 O (1)이며, 그것이 할 수있는 최소값입니다.

(우리가 그렇게하지 않기로 선택한다면, 그것은 프로그래밍 영역에서 Zen 또는 Tao 질문이 될 수있다. O (1)은 여전히 ​​최소이다).

아니면 어떻습니까?

프로그래머 : 보스, O (1) 시간 안에 할 수있는 방법을 찾았습니다!
보스 : 오늘 아침에 파산합니다.
프로그래머 : 오, 그러면 O (0)이됩니다.


답변

아니요, 불가능합니다 :

n은 1 / n에서 무한대 인 경향이 있기 때문에 우리는 결국 1 / (inf)를 달성하는데, 이는 사실상 0입니다.

따라서 문제의 큰 클래스는 거대한 n을 갖는 O (0)이지만 낮은 n을 가진 일정한 시간에 더 가깝습니다. 일정한 시간보다 빠르게 수행 할 수있는 유일한 작업은 다음과 같습니다.

void nothing() {};

그리고 이것조차도 논쟁의 여지가 있습니다!

명령을 실행하자마자 최소한 O (1)에 도달 했으므로 O (1 / n)의 큰 클래스를 가질 수 없습니다!


답변

기능을 전혀 실행하지 않는 것은 어떻습니까 (NOOP)? 또는 고정 된 값을 사용합니다. 그게 중요합니까?