로그 대 더블 로그 시간 복잡성


9

실제 응용 프로그램에서는 알고리즘 대신 사용할 때 이점이 있습니까?O(log(log(n))O(log(n))

예를 들어보다 일반적인 이진 검색 트리 구현 대신 van Emde Boas 트리를 사용하는 경우입니다. 그러나 예를 들어, 우리가 을 취 하면 가장 좋은 경우에 이중 로그 알고리즘은 의 인수 (대략)만큼 로그를 능가합니다 . 또한 일반적으로 구현이 더 까다 롭고 복잡합니다.n<1065

개인적으로 VEB- 트리보다 BST를 선호한다면 어떻게 생각하십니까?

이를 쉽게 입증 할 수 있습니다.

<106. 로그로그(로그())<5.26146


기본적으로 입력의 작은 값 / 크기에 대한 알고리즘과 관련된 상수를 살펴 봐야합니다. 이상적으로는 우리는 그것들이 작기를 바랍니다.
singhsumit

3
VEB 트리 이후로 무작위 화 (결정적) 및 없이 검색 / 삽입 / 삭제 복잡도를 갖는 RAM의 데이터 구조에 따라 VEB 트리 이후 많은 개선이있었습니다. 무작위 화가 포함 된 . 시간 및 선형 공간의 결정적 정렬을 참조 하십시오 . Han 및 예상 시간 및 선형 공간. 한과 소롭 영형(영형 영형 )영형(영형 영형 )영형( 영형 영형 )영형(영형 영형 )
AT

실제 세계에서 5의 요소는 상당히 중요하며 항목 수는 종종 10 ^ 9 또는 10 ^ 12 일 수 있습니다.
RBarryYoung

답변:


10

여전히 보다 기하 급수적으로 ( ) 증가 한다는 것을 잊지 마십시오 !로그로그()로그(로그)

실제로 및 의 몫을 살펴보면 다음과 같이 인상적입니다.로그()로그(로그())

로그 (n) / 로그 (log (n))
[ 출처 ]

그러나 여전히 최대 크기의 경우 5-6 됩니다. 더 큰 크기는 실제로 드문 일이 아니며 해당 요소에 의한 속도 향상은 대단합니다 ! 점심 식사 후 또는 내일 만 결과를 얻는 데 차이가있을 수 있습니다. 더 높은 상수의 트리 구현으로 인해 속도 향상의 일부가 사라질 수 있습니다. 당신은 음모에 (또는 분석) 것 와 와 실제 사진을 얻을 수있는 실제 런타임 상수.100000로그()로그(로그()),

또한 Dave가 언급 한 사항이 중요합니다. 즉, 작업 속도가 선형으로 자주 실행되는 경우 일정한 속도 향상은 선형 속도 향상이됩니다. 즉 전체 알고리즘의 선행 상수를 줄일 수 있습니다! 위에서 말했듯이, 그것은 굉장합니다. 작업을 번 실행하면 어떻게되는지 살펴보십시오 .

n * log (n) / (n * log (log (n))))
[ 출처 ]

이제 그만한 가치가 없다면 나는 무엇을 모른다.


6

복잡성의 차이는 그다지 중요하지 않으며 실제 런타임이 더 중요하다고 생각할 수 있습니다. 그러나 알고리즘이 다른 알고리즘의 핵심이라면이 차이가 중요 할 수 있습니다.

순수하게 이론적 인 목적에서, 물론 알고리즘이 다른 알고리즘의 일부인 경우 물론 차이가 중요합니다. 더 큰 알고리즘을 다른 복잡성 클래스에 넣을 수 있습니다.


6

나는 실제로 van Emde-Boas 트리를 한 번 벤치마킹했습니다. AA Tree, hashmap 및 bit array와 비교했습니다.

테스트 size는 간격에 임의의 숫자로 삽입을 수행 [0, bound]한 다음 size검색 한 후 size삭제 한 다음 다시 size검색합니다. 삭제는 임의의 숫자에서도 이루어 지므로 먼저 구조에 있는지 확인해야합니다.

다음은 초 단위 의 결과 ( size= 2000000, bound= 10000000)입니다.

AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting...  7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting...  0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting...  1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting...  0.2387776
Searching... 0.3413800

보시다시피 van Emde-Boas 트리는 해시 맵보다 약 2 배, 비트 배열보다 10 배, 바이너리 검색 트리보다 5 배 느립니다.

물론 위의 면책 조항이 필요합니다. 테스트는 인공적이므로 출력이 더 빠른 컴파일러 등을 사용하여 코드를 개선하거나 다른 언어를 사용할 수 있습니다.

이 면책 조항은 알고리즘 설계에서 점근 분석을 사용하는 이유의 핵심입니다. 상수가 무엇인지 모르고 환경 요인에 따라 상수가 변경 될 수 있으므로 최선을 다하는 것은 점근 분석입니다.

이제는 로그로그로그위의 예에서 내 van Emde-Boas 트리에는 232 집단. 로그232=32, 로그32=5, 이것은 요소 6 개선이며 실제로는 약간입니다. 또한 van Emde-Boas 나무는 스스로 균형을 잡을 필요가 없기 때문에 일정한 상수 요소 (실제로는 차이가 작은 상수 요소에 관한 것)가 있습니다.


어쩌면 R (또는 동등한)로 뛰어 들어가서 @Raphael처럼 예쁜 그래프를 생성 할 수 있습니다.
Dave Clarke

1
이 알고리즘을 개념과 관련 시키면 답변이 향상됩니다. 로그로그로그
Dave Clarke

@DaveClarke : 제안 해 주셔서 감사합니다. 불행히도 나는 예쁜 그림을 만드는 데 상당히 나쁩니다. 편집 한 결과 내 가독성이 향상되었다고 생각합니다.
Alex ten Brink

적절한 사진을위한 데이터가 충분하지 않을 수 있습니다. 상관없이 ....하지만 좋은 사진을 배우는 것은 편리한 기술입니다.
Dave Clarke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.