어떤 문제 A에 대해 시간 에서 실행되는 알고리즘이 있고 누군가가 시간에서 실행되는 알고리즘 을 발생시키는 경우 , 이전 알고리즘보다 개선 된 것으로 간주됩니까?
이론적 인 컴퓨터 과학의 맥락에서 그러한 알고리즘을 생각해내는 것이 합리적입니까?
어떤 문제 A에 대해 시간 에서 실행되는 알고리즘이 있고 누군가가 시간에서 실행되는 알고리즘 을 발생시키는 경우 , 이전 알고리즘보다 개선 된 것으로 간주됩니까?
이론적 인 컴퓨터 과학의 맥락에서 그러한 알고리즘을 생각해내는 것이 합리적입니까?
답변:
아니오, 시간 에서 실행되는 알고리즘 , 여기서 은 반드시 개선으로 간주되지는 않습니다. 예를 들어, 이고 . 그러면 는 보다 더 나쁜 시간 경계 입니다.g ( N ) = O ( F ( N ) ) F ( N ) = N g ( N ) = 1 / N O ( F ( N ) / g ( N ) ) = O ( N 2 ) O ( F ( N
시간 에서 실행되는 알고리즘을 개선하려면 시간 에서 실행되는 알고리즘 , 즉 일부 함수 g ( n )에 대해 시간 에서 실행되는 알고리즘이 필요합니다. = o ( f ( n ) ) .
알고리즘이 시간 에서 실행된다는 것만 알고 있다면 , 시간 O ( g ( n ) ) 에서 실행되는 알고리즘 이 f ( n ) , g ( n )에 관계없이 개선 되는지 확실하지 않습니다. ) 입니다. 큰 O는 실행 시간의 상한 일 뿐이 기 때문입니다. 대신 최악의 시간 복잡성을 고려하고이를 단지 큰 O 보다는 큰 Θ 로 추정하는 것이 일반적 입니다.
그 기억 표기법 분석에 대한 의미있는 작업이 다른 입력의 크기, 곱셈 요인 밖으로 특히 잎을 위해 성장하는 방법, 낮은 순서 용어 및 상수를.
당신이 있다고 가정 실제의 실행이다 알고리즘 1 N 2 + 2 N + 1 (실제로 지시를 계산하고 인정 하듯이 현대적인 시스템에 큰 가정이다, 등등 정확한 타이밍 등을 알 수있는 가정을). 그런 다음 될 일이 새로운 알고리즘을 가지고 올 생각 O ( N ) 하지만, 실제 실행은 1000 N + 5000 . 또한이 알고리즘을 사용할 소프트웨어가 n > 10 의 문제 크기를 절대로 보지 못한다고 가정하십시오 .
그래서, 당신이 선택한 것이다 - 시간의 15000 개 단위를 걸릴 거예요 알고리즘, 또는 O를 ( N 2 ) 하나 만 121 대를 취할 것인가? 이제 소프트웨어가 n > 100000 의 문제 크기를 처리하도록 발전했다면 어떤 것을 선택 하시겠습니까? 문제의 크기가 크게 다른 경우 어떻게 하시겠습니까?
일반적으로 의미가 큰 것은 입력의 크기에 상관없이 이전 알고리즘의 최악의 실행 시간이 새로운 것보다 느리다는 것입니다. 즉 형식주의에 등가이다 , g는 새로운 알고리즘과 시간 복잡도 인 F 이전의 시간 복잡도.
그러나 때때로 컴퓨터 과학자들은 평균 사례 성능에 관심을 갖습니다. 전형적인 예는 Quicksort입니다. 최악의 런타임은 이지만 우리는 Θ ( n log n ) 시간으로 실행되는 다른 것을 알고 있지만 실제로는 평균 케이스 실행 시간이 길기 때문에 실제로 널리 사용됩니다. 또한 대부분 올바른 순서로 배열과 같이 야생에서 가장 빈번한 경우에 매우 빠르게 실행되도록 추가로 조정할 수 있습니다.
때로는 이론적 인 컴퓨터 과학자조차도 일반 사람들과 같은 방식으로 "빠른"것을 사용합니다. 예를 들어, 대부분의 String 클래스 구현에는 짧은 문자열 최적화 (작은 문자열 최적화라고도 함)가 있지만 짧은 문자열의 경우 속도 만 높이고 긴 문자열의 경우 순수한 오버 헤드입니다. 입력 크기가 점점 커짐에 따라 SSO를 사용한 문자열 연산의 실행 시간은 작은 상수 항으로 높아질 것이므로 첫 번째 단락에서 정의한 내용에 따라 String 클래스에서 SSO를 제거하면 "빠르게" 하지만 실제로는 대부분의 줄이 작기 때문에 SSO는 대부분의 프로그램을 더 빨리 사용하며 대부분의 컴퓨터 과학 교수는 사람들이 점근 적 시간 복잡성 에 대해서만 이야기하도록 요구하는 것보다 더 잘 알고 있습니다.
"빠른 알고리즘"이 무엇인지에 대한 통일 된 정의는 없습니다. 알고리즘이 다른 알고리즘보다 빠른지 여부를 결정하는 관리 기관이 없습니다.
이것이 왜 그런지 지적하기 위해이 어두운 개념을 보여주는 두 가지 시나리오를 제안하고 싶습니다.
첫 번째 예는 정렬되지 않은 데이터의 연결된 목록을 검색하는 알고리즘입니다. 배열에서 동일한 작업을 수행 할 수 있다면 성능에 큰 영향을 미치지 않습니다. 두 검색 모두 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)으로 변경할 수 있으며 의미있는 속도 향상이 전혀 없다고 주장 할 수 있습니다. 이것이 바로 "빠른 알고리즘"에 대한 통일 된 정의가 없다고 말하는 이유입니다. 항상 상황에 따라 다릅니다.
나는 아직 언급 할 수는 없지만 현재 답변과 같은 느낌이 들지만 정확하고 유익하지만이 질문의 일부를 다루지 않습니다. 첫째, 우리가 식 당량 쓸 수 ( N ) ∈ O ( F ( N을 ) ) .
이제, 우리는 우리가 얘기 가정하자 임의의 증가 함수 LIM SUP N → ∞ g ( N ) = ∞ 우리가 함수를 만들 수있는 시간 ( N ) = F ( N을 ) .
"개선 된"알고리즘 의 런타임 은 O ( h ( n ) ) 이다. 원래 알고리즘 A ( n ) 의 런타임 도 O ( h ( n ) )라고 가정 합니다. 이것은 다음과 같이 쓸 수 있습니다.
제한 규칙을 사용하여 다음과 같이 작성할 수도 있습니다.