아래 클래스에서 성능이 크게 뛰어난 실제 알고리즘이 있습니까? [닫은]


39

어젯밤 나는 다른 프로그래머와 논의했는데, 무언가 O (1) 일 수 있지만 O (n) 연산이 O (1) 알고리즘에 큰 상수가 있으면 성능이 뛰어날 수 있습니다. 그는 동의하지 않았으므로 여기로 가져 왔습니다.

아래 클래스의 알고리즘을 크게 능가하는 알고리즘의 예가 있습니까? 예를 들어, O (n)은 O (1)보다 빠르거나 O (n 2 )는 O (n)보다 빠릅니다.

상수 요인을 무시하지만 이러한 알고리즘이 야생에 존재하는 경우 수학적으로 상한 상한이있는 함수에 대해이를 입증 할 수 있습니다. 그리고 그 예를 어디에서 찾을 수 있습니까? 그들이 어떤 상황에 사용됩니까?


15
"큰"알고리즘의 경우에도 더 작은 것이 더 나은 것은 아닙니다. 예를 들어, 가우시안 제거는 O (n ^ 3)이지만 O (n ^ 2)에서이를 수행 할 수있는 알고리즘이 있지만 2 차 시간 알고리즘에 대한 계수가 너무 커서 사람들이 O (n ^ 3) 하나.
BlackJack

11
"실제 문제의 경우"를 추가하거나이 문제를 현명한 질문으로 만들어야합니다. 그렇지 않으면 n상수 (big-O 표기법의 포인트)를 보상 할만큼 충분히 커야합니다.
starblue

8
속도에 대해 큰 O 표기법을 사용하지 마십시오.
Codism

16
big-O 표기법의 요점은 알고리즘이 얼마나 빨리 실행되는지가 아니라 얼마나 잘 확장되는지를 알려주는 것입니다.
BlueRaja-대니 Pflughoeft

4
LP를 해결하기위한 Simplex 알고리즘을 언급 한 사람이 아무도 없습니다. 선형 예상 런타임과 함께 지수 최악의 경우가 있습니다. 실제로는 매우 빠릅니다. 최악의 런타임을 나타내는 문제를 만드는 것은 사소한 일입니다. 또한 많이 사용됩니다.
ccoakley

답변:


45

매우 작은 고정 데이터 테이블에서 조회 최적화 된 해시 테이블은 O (1) 일 수 있지만 해시 계산 비용으로 인해 이진 검색 또는 선형 검색보다 느릴 수 있습니다.


14
보다 정확하게는, 해시 테이블 조회는 O (m)이며 여기서 m은 키의 크기입니다. 키 크기가 일정하면 O (1) 만 호출하면됩니다. 또한 일반적으로 상각됩니다. 그렇지 않으면 테이블이 커지거나 줄어들 수 없습니다. 3 차 트리는 종종 문자열을 찾을 수없는 컨텍스트에서 문자열 조회를 위해 해시 테이블을 이길 수 있습니다 .3 차 트리 검색은 종종 첫 번째 문자 또는 두 개의 문자열을 확인하면서 키가 존재하지 않음을 발견합니다. 해시 테이블 버전은 아직 해시를 계산하지 않았습니다.
Steve314

2
나는 Loren Pechtel의 답변과 Steve314의 첫 번째 의견을 좋아합니다. 나는 이것이 실제로 일어나는 것을 보았습니다. 해시 값을 반환하는 데 너무 오래 걸리고 캐시 할 수없는 hashcode () 메서드가있는 Java 클래스를 만드는 경우 해시 유형 컬렉션에서 해당 클래스의 인스턴스를 사용하는 경우 (예 : HashSet)은 해당 컬렉션을 ArrayList와 같은 배열 유형 컬렉션보다 느리게 만듭니다.
Shivan Dragon

1
@ Steve314 : 왜 해시 함수가 O (m)이라고 가정합니까? 여기서 m은 키의 크기입니까? 문자열 (또는 다른 복합 유형)을 처리하는 경우에도 해시 함수는 O (1) 일 수 있습니다. 입력에 대해 잘못된 데이터 구조 (해시 테이블)를 선택한 경우 (해시 키 크기를 예측할 수 없음) 단순히 해시 함수를 실현하면 복잡성이 크게 변경 될 수 있다는 것보다 공식적으로 정의하기에는 너무 많은 가치가 없습니다.
Codism

1
@ Steve314 : 고정 데이터 테이블을 언급했습니다. 그들은 자라지 않습니다. 또한 충돌이 없도록 키를 최적화 할 수있는 경우 해시 테이블에서만 O (1) 성능을 얻습니다.
Loren Pechtel

1
@Loren-엄격하게 테이블의 크기가 고정되어 있으면 여유 공간을 찾는 데 사용할 수있는 최대 시간이 일정합니다. 즉, 최대 n 개의 이미 채워진 슬롯을 확인해야합니다. 여기서 n은 상수 테이블 크기입니다. 따라서 고정 크기 해시 테이블은 실제로 상각 분석이 필요없는 O (1)입니다. 이것은 테이블이 가득 차면 액세스 속도가 느려지는 것에 신경 쓰지 않는다는 것을 의미하지는 않습니다. 오로지 큰 O가 표현하는 것이 아닙니다.
Steve314

25

행렬 곱셈. 순진한 O (n ^ 3) 알고리즘은 종종 작은 매트릭스의 경우 Strassen의 O (n ^ 2.8)보다 빠른 속도로 실제로 사용됩니다. Strassen 's는 더 큰 행렬을위한 O (n ^ 2.3) Coppersmith–Winograd 알고리즘 대신 사용됩니다.



2
Coppersmith-Winograd는 절대 사용되지 않습니다. 그것을 구현하는 것은 그 자체로 끔찍한 일이 될 것이며 상수는 너무 나빠서 현대 과학 매트릭스 문제조차도 불가능합니다.
tskuzzy

24

간단한 예는 다양한 정렬 알고리즘의 차이점입니다. Mergesort, Heapsort 및 기타는 O (n log n) 입니다. Quicksort는 O (n ^ 2) 최악의 경우입니다. 그러나 종종 Quicksort가 더 빠르며 실제로 O (n log n) 과 같이 평균적으로 수행됩니다 . 더 많은 정보 .

또 다른 예는 단일 피보나치 수의 생성입니다. 반복 알고리즘은 O (n) 이고 행렬 기반 알고리즘은 O (log n) 입니다. 그럼에도 불구하고 처음 2 천 피보나치 수의 경우 반복 알고리즘이 더 빠를 것입니다. 이것은 물론 구현에 달려 있습니다!

더 나은 점근 성능을 가진 알고리즘에는 성능이 좋지 않지만 간단한 조작을 가진 알고리즘에는 필요하지 않은 값 비싼 조작이 포함될 수 있습니다. 결국, O- 표기법은 그것이 작용하는 논증이 극적으로 증가 할 때 (무한대에 접근 할 때) 성능에 대해서만 알려줍니다.


이것은 Big-O에 대한 훌륭한 설명이지만 문제의 핵심을 다루지 못합니다. 이는 O (n) 알고리즘이 O (1)보다 빠른 특정 경우에 해당합니다.
KyleWpppd

피보나치 번호 1은 약간 벗어났습니다. 출력 크기는 입력 크기에서 지수 적이므로 O (lg n * e ^ n) 대 O (lg lg n * e ^ n)의 차이입니다.
피터 테일러

부록 : 기껏해야. 행렬 기반 알고리즘은 1.5 ^ n 정도의 숫자로 곱셈을 수행하므로 O (lg lg n * ne ^ n)가 가장 적합합니다.
피터 테일러

1
Quicksort는 일반적으로 어쨌든 O (n log n) 예상 성능으로 설명됩니다. 최악의 경우는 임의의 입력에서는 거의 불가능하며 프리 패스 또는 피벗 선택에 임의의 임의성을 구축하면 최악의 경우 전체가 심각한 입력 크기에는 거의 해당되지 않습니다. 최악의 경우는 quicksort가 (1) 매우 간단하고 (2) 매우 캐시 친화적이라는 사실보다 관련성이 적습니다.이 두 가지 모두 다른 많은 정렬 알고리즘보다 훨씬 더 나은 상수 요인으로 이어집니다.
Steve314

(2)는 정확히 큰 O 성능을 볼 때 고려해야 할 일종의 외부 고려 사항입니다. 알고리즘 적으로 Mergesort는 항상 Quicksort보다 성능이 뛰어나야하지만, 리소스 사용량과 캐시 위치는 일반적으로 실제 성능 위치를 뒤집습니다.
Dan Lyons

18

참고 : 아래 @ back2dos 및 다른 전문가의 의견을 읽으십시오. 실제로 작성한 것보다 더 도움이되므로 모든 기고자에게 감사드립니다.

아래 차트 ( Big O 표기법 , "비관론의 알고리즘의 비유 :"검색)에서 O (log n)이 항상 O (n)보다 나은 것은 아니라는 것을 알 수 있습니다 . 따라서 귀하의 주장이 유효하다고 생각합니다.

그림 -1


6
문제는 알고리즘의 구체적인 실제 예를 원했습니다. 이것은 그대로 없습니다.
Megan Walker

19
그 그래프에서 아무것도 볼 수 없으며 질문에 대답합니다. 오해의 소지가 있습니다. 이 그래프는 단지 함수들 y = 1, y = log x그리고 그 사이의 교차점 y = 1y = x실제로 교차점을 나타냅니다 (1,1). 이것이 실제로 정확하다면, 당신이 말한 것보다, 복잡성이 높은 알고리즘은 사람들이 거의 신경 쓰지 않는 0 ~ 2 개의 항목에 대해 더 빠를 수 있습니다. 그래프가 완전히 고려하지 못하는 것 (및 문제의 성능 차이는 무엇인지)은 일정한 요소입니다.
back2dos

@Samuel Walker, 댓글 주셔서 감사합니다. 제공된 링크 (Link-1)에는 범주 별 알고리즘의 예가 있습니다.
NoChance

5
@ back2dos : 자체 그래프는 질문에 대답하지 않지만 대답하는 데 사용할 수 있습니다. 표시된 각 기능의 모양은 모든 스케일 및 상수 계수에 대해 동일합니다. 이를 통해 그래프는 주어진 기능의 조합으로 하나의 입력 범위가 더 작고 다른 입력 범위가 있음을 보여줍니다.
Jan Hudec

2
@dan_waterworth, 당신 말이 맞아요, 그 점을 인정하고 그 의견을 제거하겠습니다. 그럼에도 불구하고 그 대답은 두 가지 측면에서 부정확하거나 오해의 소지가 있습니다. 1) Big-O의 요점은 복잡성에 대한 상한을 제공한다는 것입니다. n이 커짐에 따라 가장 큰 항에 의해 압도되는 작은 항을 명시 적으로 던지기 때문에 큰 n에만 의미가 있습니다. 2) 문제는 Big-O 경계가 높은 알고리즘이 하한 알고리즘보다 성능이 우수한 두 알고리즘의 예를 찾는 것입니다. 이 대답은 그러한 예를 제공하지 않기 때문에 실패합니다.
Caleb

11

의 실제 값은 n그렇습니다. 이것은 CS 이론에서 많이 나온다. 기술적으로 더 나은 성능을 갖는 복잡한 알고리즘이 종종 있지만, 상수 요소가 너무 커서 비실용적입니다.

한때 계산 기하학 교수가 선형 시간으로 다각형을 삼각 측량하기위한 알고리즘을 설명했지만 "매우 복잡합니다. 실제로 아무도 그것을 구현하지 않았다고 생각합니다"(!!).

또한 피보나치 힙은 일반 힙보다 더 나은 특성을 갖지만 실제로 는 일반 힙만큼 성능이 좋지 않기 때문에별로 인기가 없습니다 . 예를 들어 Dijkstra의 최단 경로는 피보나치 힙을 사용하면 수학적으로 더 빠르지 만 실제로는 그렇지 않습니다.


10 만 정도의 정점 정도의 거대한 그래프는 더 빠릅니다.
tskuzzy

피보나치 더미도 저의 첫 번째 (실제로 두 번째) 생각이었습니다.
Konrad Rudolph

10

연결된 목록에 삽입하고 크기 조정 가능한 배열에 삽입하는 것을 비교하십시오.

연결된 목록 O (1) 삽입이 가치가 있으려면 데이터 양이 상당히 커야합니다.

연결된 목록에는 다음 포인터 및 역 참조에 대한 추가 오버 헤드가 있습니다. 크기를 조정할 수있는 배열은 데이터를 복사해야합니다. 그 복사는 O (n)이지만 실제로는 매우 빠릅니다.


1
크기 조정 가능 배열은 채워질 때마다 크기가 두 배가되므로 삽입 당 크기 조정의 평균 비용은 O (1)입니다.
케빈 클라인

2
@kevincline, 그렇습니다. 그러나 O (n)은 삽입 점 다음에 모든 요소를 ​​이동해야합니다. 할당은 O (1) 시간으로 상각됩니다. 내 요점은 움직임이 여전히 매우 빠르기 때문에 실제로는 일반적으로 연결된 목록을 능가합니다.
Winston Ewert

연속 된 배열이 링크 된 목록과 비교하여 너무 빠른 이유는 프로세서 캐싱 때문입니다. 링크 된 목록을 순회하면 모든 요소에 대해 캐시 누락이 발생합니다. 두 세계를 최대한 활용하려면 롤링되지 않은 연결 목록을 사용해야 합니다 .
dan_waterworth

크기 조정 가능한 배열이 항상 복사되는 것은 아닙니다. 실행중인 내용과 방해가되는 것이 있는지에 달려 있습니다. 배가 크기, 구현에 따라 다릅니다. 롤오버 롤오버는 문제입니다. 링크 된 목록은 일반적으로 알 수없는 크기의 대기열에 가장 적합하지만 로터리 버퍼는 대기열에 돈을 제공합니다. 다른 경우에는 링크 된 목록이 유용합니다. 할당 또는 확장으로 인해 항상 연속적인 항목을 사용할 수 없기 때문에 어쨌든 포인터가 필요합니다.
jgmjgm

@jgmjgm, 크기 조정 가능한 배열의 중간에 삽입하면 그 이후의 요소를 절대적으로 복사합니다.
Winston Ewert

8

Big-Oh 표기법은 함수의 성장률을 설명하는 데 사용되므로 O (1) 알고리즘이 더 빠를 수 있지만 특정 지점 (상수 계수)까지만 가능합니다.

일반적인 표기법 :

O (1)-반복 횟수 (때때로 함수에서 소비 한 사용자 시간이라고도 함)는 입력 크기에 의존하지 않으며 실제로 일정합니다.

O (N) - 반복 횟수는 증가에 선형 입력의 크기에 비례. 의미-알고리즘이 입력 N, 2 * N 번 반복되는 경우 여전히 O (n)으로 간주됩니다.

O (n ^ 2) (quadratic)-반복 횟수는 입력 크기의 제곱입니다.


2
탁월한 답변에 대한 예를 추가하려면 O (1) 메서드는 호출 당 37 년이 걸리지 만 O (n) 메서드는 호출 당 16 * n 마이크로 초가 걸릴 수 있습니다. 어느 것이 더 빠릅니까?
Kaz Dragon

16
이것이 어떻게 질문에 대답하는지 완전히 알지 못합니다.
avakar

7
나는 큰 O를 이해한다. 이것은 실제 질문을 다루지 않습니다. 이는 큰 O를 가진 알고리즘이 큰 O를 가진 알고리즘보다 성능이 우수한 함수의 특정 예입니다.
KyleWpppd

"예제가 있습니까?"라는 형식으로 질문을하면 누군가 "예"라고 대답 할 수밖에 없습니다. 아무 것도주지 않고.
rakslice

1
@rakslice : 아마도. 그러나이 사이트는 귀하의 진술에 대한 설명 (또는 더 나은 증거)을 요구합니다. 이제 증명하는 가장 좋은 방법은 이러한 사례가 있다는 것을 하나 제공하는 것입니다)
back2dos

6

정규식 라이브러리는 일반적으로 복잡한 DFA 생성보다는 최악의 지수 시간을 갖는 역 추적을 수행하도록 구현됩니다 O(nm).

순진한 역 추적은 입력이 빠른 경로를 유지하거나 과도하게 역 추적 할 필요없이 실패 할 때 더 나은 성능을 발휘할 수 있습니다.

(이 결정은 단지 성능에 기초한 것이 아니라 역 참조를 허용하는 것이기도합니다.)


또한 정규 표현식을 DFA로 변환하는 알고리즘은 일부 초기 도구 (sed 및 grep, 필자가 생각하는 것)가 개발 될 때 특허를 받았다는 것도 부분적으로 역사적이라고 생각합니다. 물론 나는 확실하지 않은 컴파일러 교수로부터 이것을 들었으므로 이것은 제 3의 계정입니다.
Tikhon Jelvis

5

O(1)알고리즘 :

def constant_time_algorithm
  one_million = 1000 * 1000
  sleep(one_million) # seconds
end

O(n)알고리즘 :

def linear_time_algorithm(n)
  sleep(n) # seconds
end

분명히, 임의의 값에 대해 상기 실시 예에서 주어진 알고리즘 것이다 빠른 댄 알고리즘.nn < one_millionO(n)O(1)

이 예제는 약간 애매하지만 다음 예제와 같은 의미입니다.

def constant_time_algorithm
  do_a_truckload_of_work_that_takes_forever_and_a_day
end

def linear_time_algorithm(n)
  i = 0
  while i < n
    i += 1
    do_a_minute_amount_of_work_that_takes_nanoseconds
  end
end

당신은 있어야 당신의 상수와 계수 알고 O표현을, 당신은 해야한다 의 예상 범위를 알고 n결정하기 위해, 사전 알고리즘이 빨리 끝나게되는합니다.

그렇지 않으면, 당신은 해야한다 벤치 마크의 값을 갖는 두 알고리즘 n의 순서로 예상 범위를 결정하는 사후 빠른 었죠 알고리즘입니다.


4

정렬 :

삽입 정렬은 O (n ^ 2)이지만 적은 수의 요소에 대해서는 O (n * log (n)) 정렬 알고리즘보다 성능이 우수합니다.

이것이 대부분의 정렬 구현이 두 알고리즘의 조합을 사용하는 이유입니다. 예를 들어, 병합 정렬을 사용하여 큰 배열이 특정 크기 배열에 도달 할 때까지 분할 한 다음 삽입 정렬을 사용하여 더 작은 단위를 정렬하고 병합 정렬로 다시 병합하십시오.

이 기술을 사용하는 Python 및 Java 7 정렬의 현재 기본 구현 Timsort를 참조하십시오 .



3

메모리에있는 Bubblesort는 프로그램이 디스크로 교체되거나 비교할 때 디스크에서 모든 항목을 읽어야 할 때 빠른 정렬보다 성능이 뛰어납니다.

이것은 그가 관련시킬 수있는 모범이되어야합니다.


quicksort 및 bubblesort의 인용 된 복잡성이 O (1) 임의 메모리 액세스를 가정하지 않습니까? 이것이 더 이상 사실이 아니라면, 퀵소트 복잡성을 재검토 할 필요가 없습니까?
Viktor Dahl

@ViktorDahl는 항목의 액세스 시간은 없습니다 그래서 "O는 (1)"여기 단어의 올바른 선택이 아니다 전통적으로 정렬 알고리즘의 복잡성으로 측정되는 내용의 일부입니다. 대신 "일정한 시간"을 사용하십시오. PHK는 정렬 알고리즘에 대해 기사를 작성했습니다. 일부 항목은 다른 항목 (가상 메모리)보다 검색 비용이 더 높다는 것을 알고 있습니다 -queue.acm.org/detail.cfm?id=1814327- 흥미로울 것입니다.

지금 내 실수를 봅니다. 하나는 일반적으로 비교 횟수를 측정하며 물론 저장 매체의 속도에 영향을받지 않습니다. 또한 링크 주셔서 감사합니다.
Viktor Dahl

3

종종 고급 알고리즘은 일정량의 (비싼) 설정을 가정합니다. 한 번만 실행해야하는 경우 무차별 대입 방법을 사용하는 것이 좋습니다.

예를 들어, 이진 검색 및 해시 테이블 조회는 선형 검색 보다 조회 당 훨씬 빠르지 만 각각 목록을 정렬하거나 해시 테이블을 작성해야합니다.

정렬 비용은 N log (N)이고 해시 테이블은 최소 N입니다. 이제 수백 또는 수천 건의 조회를 수행하려는 경우 여전히 상각 비용이 절감됩니다. 그러나 하나 또는 두 개의 조회 만 수행해야하는 경우 선형 검색 만 수행하고 시작 비용을 절약하는 것이 좋습니다.


1

암호 해독은 종종 0 (1)입니다. 예를 들어 DES의 키 공간은 2 ^ 56이므로 모든 메시지의 암호 해독은 일정한 시간 작업입니다. 단지 거기에 2 ^ 56의 계수가 있으므로 실제로는 큰 상수입니다.


메시지 O ( n )의 암호 해독이 아닌데 , 여기서 n 은 메시지 크기에 비례합니까? 올바른 키가 있으면 키 크기도 고려되지 않습니다. 일부 알고리즘에는 키 설정 / 확장 프로세스가 거의 없거나 전혀 없습니다 (DES, RSA-키 생성은 여전히 ​​복잡한 작업이지만 키 확장과는 관련이 없음에 유의하십시오). 일단 완료되면 실제 작업을 수행하는 시간은 메시지의 크기에 비례하므로 O (n)입니다.
CVn

암호 해독보다는 암호 분석을 의미합니까?
leftaroundabout

3
예, 일정하게 유지하고 알고리즘을 O (1)로 선언 할 수있는 것은 많습니다. [예를 들어, 비 숫자가 아닌 수학과 비교하기 위해 요소들이 일정한 시간이 걸린다고 가정한다]
Random832

1

세트의 다른 구현은 내 마음에 떠오른다. 가장 소박한 중 하나는 어떤 수단에 벡터를 통해 구현된다 remove뿐만 아니라 contains, 따라서 또한 add전체 포획 O (N).
대안은 입력 해시를 입력 값에 매핑하는 일부 범용 해시에 대해 구현하는 것입니다. 용 O (1)과 이러한 세트의 구현을 수행한다 add, contains그리고 remove.

N이 약 10 정도라고 가정하면 첫 번째 구현이 더 빠를 것입니다. 요소를 찾기 위해서는 10 개의 값을 하나만 비교하면됩니다.
다른 구현은 모든 종류의 영리한 변환을 시작해야하는데, 10 번의 비교보다 훨씬 비쌀 수 있습니다. 모든 오버 헤드로 인해 캐시 누락이 발생할 수 있으며 이론상 솔루션 속도가 중요하지 않습니다.

그렇다고 생각할 수있는 최악의 구현이 N이 충분히 작 으면 괜찮은 구현을 능가한다는 의미는 아닙니다. 이는 풋 프린트와 오버 헤드가 낮은 순진한 구현이 실제로 확장 성을 최우선으로하는 구현보다 명령이 덜 필요하고 캐시 미스를 더 적게 유발할 수 있다는 점에서 충분히 작은 N을 의미합니다.

실제 시나리오에서 어떤 것이 얼마나 빠른지 알 수는 없습니다. 종종 결과는 놀랍습니다 (적어도 나에게는).


1

예, 적절하게 작은 N의 경우, 항상 N이 있으며, 그 위의 순서는 항상 O (1) <O (lg N) <O (N) <O (N log N) <O (N ^ c ) <O (c ^ N) (여기서 O (1) <O (lg N)은 O (1) 알고리즘에서 N이 적절하게 크고 c가 1보다 큰 일부 고정 상수 인 경우 더 적은 연산을 수행함을 의미합니다. ).

특정 O (1) 알고리즘이 정확히 f (N) = 10 ^ 100 (구골) 연산을 취하고 O (N) 알고리즘이 정확히 g (N) = 2 N + 5 연산을 취한다고 가정합니다. O (N) 알고리즘은 N이 대략 구골이 될 때까지 (실제로 N> (10 ^ 100-5) / 2 일 때) 더 나은 성능을 제공하므로 N이 1000에서 10 억 사이에있을 것으로 예상한다면 O (1) 알고리즘을 사용하면 큰 페널티를받습니다.

또는 현실적인 비교를 위해 n 자리 숫자를 곱한다고 가정하십시오. 카라 츠바 알고리즘은 최대 3 N이다 ^ 동작 (3 LG) (대충 O (N ^ 1.585))이 잠시 쇤하게 - 슈트라 센 알고리즘은 O A는 (N 로그 N 로그 로그 N)은 빠른 순서 이지만 인용 위키 백과 :

실제로 Schönhage–Strassen 알고리즘은 2 ^ 2 ^ 15에서 2 ^ 2 ^ 17 (십진수 10,000 ~ 40,000 자리) 이상의 숫자에서 Karatsuba 및 Toom–Cook 곱셈과 같은 이전 방법보다 성능이 뛰어납니다. [4] [5] [6 ]

따라서 500 자리 숫자를 곱하면 "빠른"알고리즘을 큰 O 인수로 사용하는 것이 적합하지 않습니다.

편집 : 당신은 한계 N-> f (N) / g (N)의 무한대를 취함으로써 g (N)에 대해 f (N)을 결정하는 것을 찾을 수 있습니다. 한계가 0이면 f (N) <g (N)이고, 한계가 무한대이면 f (N)> g (N)이며, 한계가 다른 상수이면 f (N) ~ g (N) 큰 O 표기법 측면에서.


1

선형 프로그래밍을 위한 단순한 방법 은 최악의 경우 지수가 될 수있는 반면, 비교적 새로운 내부 포인트 알고리즘은 다항식 일 수 있습니다.

그러나 실제로 심플 렉스 방법의 지수 최악의 경우는 나타나지 않습니다. 심플 렉스 방법은 빠르고 안정적이며 초기 내부 포인트 알고리즘은 너무 느려 경쟁하기에는 너무 느립니다. (지금 경쟁 치열한 현대적인 내부 포인트 알고리즘이 있지만 단순 방법도 있습니다 ...)


0

접미사 작성을 위한 Ukkonen의 알고리즘 은 O (n log n)입니다. "온라인"이라는 이점이 있습니다. 즉, 더 많은 텍스트를 점진적으로 추가 할 수 있습니다.

최근에 다른 더 복잡한 알고리즘은 실제로 메모리 액세스가 더 높은 로컬 성을 가지고있어 프로세서 캐시 활용도를 개선하고 CPU 파이프 라인 중단을 피하기 때문에 실제로 더 빠르다고 주장했습니다. 예를 들어, 처리 시간의 70-80 %가 메모리를 기다리는 데 소비된다고 주장하는 이 설문 조사 와 "wotd"알고리즘을 설명하는 이 백서 를 참조하십시오.

접미사 시도는 유전자 (유전자 서열 일치)에서 중요하며 스크랩 블 사전의 구현에서는 다소 덜 중요합니다.


0

잘 정의 된 문제에 대해 가장 빠르고 가장 짧은 알고리즘 이 항상 있습니다 . 그것은 순전히 이론적으로 (무증상) 가장 빠른 알고리즘입니다.

문제 P에 대한 설명 과 해당 문제 I에 대한 인스턴스가 주어지면 가능한 모든 알고리즘 A 와 증거 Pr을 열거 하여 PrAP에 대해 가장 빠른 알고리즘 이라는 유효한 증거 인지 확인합니다 . 이 같은 증거를 발견하면, 그 다음 실행 I .

이 문제 방지 쌍을 검색하면 복잡성 O (1) (고정 문제 P )가 있으므로 항상 문제에 대해 가장 빠른 알고리즘을 사용합니다. 그러나이 상수는 거의 모든 경우에 말할 수 없을 정도로 엄청 나기 때문에이 방법은 실제로는 전혀 쓸모가 없습니다.


0

많은 언어 / 프레임 워크가 KMP 대신 문자열을 일치시키기 위해 순진한 패턴 일치를 사용 합니다. 우리는 ababaabababababaababababababab보다는 Tom, New York 같은 문자열을 찾습니다.

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