이론적 인 컴퓨터 과학에서 더 빠른 알고리즘은 무엇을 의미합니까?


18

어떤 문제 A에 대해 시간 에서 실행되는 알고리즘이 있고 누군가가 시간에서 실행되는 알고리즘 을 발생시키는 경우 , 이전 알고리즘보다 개선 된 것으로 간주됩니까?영형(에프())영형(에프()/())()=영형(에프())

이론적 인 컴퓨터 과학의 맥락에서 그러한 알고리즘을 생각해내는 것이 합리적입니까?


4
"빠른 알고리즘"은 "무조건 빠른 알고리즘"을 의미합니다.
Yuval Filmus

@YuvalFilmus "무증상"이란 무엇입니까?
정의되지 않음

1
시간에 실행 중 입니다. o(f(n))
Yuval Filmus

답변:


26

아니오, 시간 에서 실행되는 알고리즘 , 여기서 은 반드시 개선으로 간주되지는 않습니다. 예를 들어, 이고 . 그러면 는 보다 더 나쁜 시간 경계 입니다.g ( N ) = O ( F ( N ) ) F ( N ) = N g ( N ) = 1 / N O ( F ( N ) / g ( N ) ) = O ( N 2 ) O ( F ( N영형(에프()/())()=영형(에프())에프()=()=1/영형(에프()/())=영형(2)영형(에프())=영형()

시간 에서 실행되는 알고리즘을 개선하려면 에프()시간 에서 실행되는 알고리즘 영형(에프()), 즉 일부 함수 g ( n )에 대해 시간 에서 실행되는 알고리즘이 필요합니다. = o ( f ( n ) ) .()()=영형(에프())

알고리즘이 시간 에서 실행된다는 것만 알고 있다면 , 시간 O ( g ( n ) ) 에서 실행되는 알고리즘 이 f ( n ) , g ( n )에 관계없이 개선 되는지 확실하지 않습니다. ) 입니다. 큰 O는 실행 시간의 상한 일 뿐이 기 때문입니다. 대신 최악의 시간 복잡성을 고려하고이를 단지 큰 O 보다는 큰 Θ 로 추정하는 것이 일반적 입니다.영형(에프())영형(())에프(),()Θ영형


21
첫 번째 단락에서 을 사용하는 것이 좋습니다 . 감소 기능을 사용하는 것은 약간의 속임수를 느낍니다. ()=1
David Richerby

1
@DavidRicherby : 어쩌면 조금, 영업 이익은에서 실행되는 알고리즘을 가지고 있다고 말한 적이 단순성을 가정 할 수 없도록합니다. 영형(())
Kevin

7
@Kevin 물론 컴퓨터 컨텍스트는 컴퓨터 과학에서 big-O 표기법은 일반적으로 비 감소 기능에 사용됩니다. 아마도 그 질문자는 그 용어로 생각하고 있었을 것입니다.
David Richerby

11

그 기억 표기법 분석에 대한 의미있는 작업이 다른 입력의 크기, 곱셈 요인 밖으로 특히 잎을 위해 성장하는 방법, 낮은 순서 용어 및 상수를.영형(...)

당신이 있다고 가정 실제의 실행이다 알고리즘 1 N 2 + 2 N + 1 (실제로 지시를 계산하고 인정 하듯이 현대적인 시스템에 큰 가정이다, 등등 정확한 타이밍 등을 알 수있는 가정을). 그런 다음 될 일이 새로운 알고리즘을 가지고 올 생각 O ( N ) 하지만, 실제 실행은 1000 N + 5000 . 또한이 알고리즘을 사용할 소프트웨어가 n > 10 의 문제 크기를 절대로 보지 못한다고 가정하십시오 .영형(2)12+2+1영형()1000+5000>10

그래서, 당신이 선택한 것이다 - 시간의 15000 개 단위를 걸릴 거예요 알고리즘, 또는 O를 ( N 2 ) 하나 만 121 대를 취할 것인가? 이제 소프트웨어가 n > 100000 의 문제 크기를 처리하도록 발전했다면 어떤 것을 선택 하시겠습니까? 문제의 크기가 크게 다른 경우 어떻게 하시겠습니까?영형()영형(2)>100000


2
"n> 10의 문제 크기를 보지 마십시오"– 우리는 O 표기법을 전혀 사용하지 않을 것입니다.
AnoE

5
@AnoE 논쟁을위한 간단한 숫자. 10 대 1e5의 문제 크기를 분석하든 1e6 대 1e9를 분석하든 동일한 논리가 적용됩니다.
twalberg

1
@AnoE 대부분의 컴퓨터 프로그램은 무한대로 커지는 문제 크기를 처리하려고하지 않습니다. 따라서 절충안이있을 것입니다. 이것이 big-O가 이론적 인 컴퓨터 과학을 위한 이유 이며, 실제 프로그램을 개선하기 위해 개념을 적용 할 수 있습니다 .
mbomb007

정확히 @ mbomb007입니다. 질문 제목은 " 이론적 인 컴퓨터 과학 에서 더 빠른 알고리즘은 무엇을 의미 합니까?" 그리고 그는 몸에 이것을 가지고 있습니다 : " 이론적 인 컴퓨터 과학 의 맥락에서 말이 되나요?"
AnoE

@AnoE 경험에서 볼 때, n <10이면 항상 O 표기법이 사용됩니다! 좋은 생각은 아니지만 완전히 끝난 것입니다!
Cort

5

일반적으로 의미가 큰 것은 입력의 크기에 상관없이 이전 알고리즘의 최악의 실행 시간이 새로운 것보다 느리다는 것입니다. 즉 형식주의에 등가이다 , g는 새로운 알고리즘과 시간 복잡도 인 F 이전의 시간 복잡도.g(n)o(f(n))gf

그러나 때때로 컴퓨터 과학자들은 평균 사례 성능에 관심을 갖습니다. 전형적인 예는 Quicksort입니다. 최악의 런타임은 이지만 우리는 Θ ( n log n ) 시간으로 실행되는 다른 것을 알고 있지만 실제로는 평균 케이스 실행 시간이 길기 때문에 실제로 널리 사용됩니다. 또한 대부분 올바른 순서로 배열과 같이 야생에서 가장 빈번한 경우에 매우 빠르게 실행되도록 추가로 조정할 수 있습니다.Θ(n2)Θ(nlogn)

때로는 이론적 인 컴퓨터 과학자조차도 일반 사람들과 같은 방식으로 "빠른"것을 사용합니다. 예를 들어, 대부분의 String 클래스 구현에는 짧은 문자열 최적화 (작은 문자열 최적화라고도 함)가 있지만 짧은 문자열의 경우 속도 만 높이고 긴 문자열의 경우 순수한 오버 헤드입니다. 입력 크기가 점점 커짐에 따라 SSO를 사용한 문자열 연산의 실행 시간은 작은 상수 항으로 높아질 것이므로 첫 번째 단락에서 정의한 내용에 따라 String 클래스에서 SSO를 제거하면 "빠르게" 하지만 실제로는 대부분의 줄이 작기 때문에 SSO는 대부분의 프로그램을 더 빨리 사용하며 대부분의 컴퓨터 과학 교수는 사람들이 점근 적 시간 복잡성 에 대해서만 이야기하도록 요구하는 것보다 더 잘 알고 있습니다.


1

"빠른 알고리즘"이 무엇인지에 대한 통일 된 정의는 없습니다. 알고리즘이 다른 알고리즘보다 빠른지 여부를 결정하는 관리 기관이 없습니다.

이것이 왜 그런지 지적하기 위해이 어두운 개념을 보여주는 두 가지 시나리오를 제안하고 싶습니다.

첫 번째 예는 정렬되지 않은 데이터의 연결된 목록을 검색하는 알고리즘입니다. 배열에서 동일한 작업을 수행 할 수 있다면 성능에 큰 영향을 미치지 않습니다. 두 검색 모두 O (n)입니다. 큰 Oh 값만 살펴보면 전혀 개선되지 않았다고 말할 수 있습니다. 그러나 배열 조회는 대부분의 경우 연결된 목록을 걷는 것보다 빠르다는 것이 알려져 있으므로 큰 Oh가 변경되지 않았더라도 알고리즘을 "빠른"것으로 결정할 수 있습니다.

PBJ 샌드위치를 ​​만들기 위해 로봇을 프로그래밍하는 전통적인 예를 사용할 수 있다면 다른 의미를 보여줄 수 있습니다. 땅콩 버터 항아리를 여는 지점 만 고려하십시오.

Pick up the jar
Grab the lid
Unscrew the lid

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

내가 생각할 수있는 가장 학문적 인 이론적 설정에서도 큰 오 표기법 결과가 같더라도 사람들이 첫 번째 알고리즘이 두 번째 알고리즘보다 빠르다는 것을 알게 될 것입니다.

반대로 RSA 암호화를 해제하는 알고리즘을 고려할 수 있습니다. 현재이 프로세스는 아마도 O (2 ^ n) 일 것입니다. 여기서 n은 비트 수입니다. n ^ 100을 더 빠르게 실행하는 새로운 알고리즘을 고려하십시오. 이것은 새로운 프로세스가 O (2 ^ n / n ^ 100)에서 실행됨을 의미합니다. 그러나 암호화 세계에서 지수 알고리즘에 대한 다항식 속도 향상은 전통적으로 이론적 인 속도 향상으로 생각되지 않습니다. 보안 증명을 수행 할 때 공격자는 이러한 속도 향상 중 하나를 발견하여 아무런 영향을 미치지 않을 것으로 가정합니다.

따라서 한 상황에서 O (n)을 O (n)으로 변경하고 더 빨리 호출 할 수 있습니다. 다른 상황에서 O (2 ^ n)를 O (2 ^ n / n ^ 100)으로 변경할 수 있으며 의미있는 속도 향상이 전혀 없다고 주장 할 수 있습니다. 이것이 바로 "빠른 알고리즘"에 대한 통일 된 정의가 없다고 말하는 이유입니다. 항상 상황에 따라 다릅니다.


1

나는 아직 언급 할 수는 없지만 현재 답변과 같은 느낌이 들지만 정확하고 유익하지만이 질문의 일부를 다루지 않습니다. 첫째, 우리가 식 당량 쓸 수 ( N ) O ( F ( N을 ) ) .A(n)O(f(n))

 0cf< lim supnA(n)f(n)=cf

이제, 우리는 우리가 얘기 가정하자 임의의 증가 함수 LIM SUP N g ( N ) = 우리가 함수를 만들 수있는 시간 ( N ) = F ( N을 )g(n)lim supng(n)= .h(n)=f(n)g(n)

"개선 된"알고리즘 의 런타임 은 O ( h ( n ) ) 이다. 원래 알고리즘 A ( n ) 의 런타임 도 O ( h ( n ) )라고 가정 합니다. 이것은 다음과 같이 쓸 수 있습니다.'()O(h(n))A(n)O(h(n))

 0ch< lim supnA(n)h(n)=ch

제한 규칙을 사용하여 다음과 같이 작성할 수도 있습니다.

ch=lim supnA(n)h(n)=lim supnA(n)g(n)f(n)=cflim supng(n)

ch<cf=0

cf0A(n)O(h(n))

A(n)A(n)A(n)Θ(f(n))g(n)

A(n)O(f(n))A(n)A(n)O(h(n))


1
한도는 한도 우월해야합니다.
Yuval Filmus

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