CS 이론을 새로 고치고 있는데, 알고리즘 O (log n) 복잡성을 식별하는 방법을 알고 싶습니다. 구체적으로, 그것을 쉽게 식별 할 수있는 방법이 있습니까?
나는 O (n)으로 알고있다. 보통 단일 루프를 가진다. O (n ^ 2)는 이중 루프입니다. O (n ^ 3)은 트리플 루프 등입니다. O (log n)는 어떻습니까?
CS 이론을 새로 고치고 있는데, 알고리즘 O (log n) 복잡성을 식별하는 방법을 알고 싶습니다. 구체적으로, 그것을 쉽게 식별 할 수있는 방법이 있습니까?
나는 O (n)으로 알고있다. 보통 단일 루프를 가진다. O (n ^ 2)는 이중 루프입니다. O (n ^ 3)은 트리플 루프 등입니다. O (log n)는 어떻습니까?
답변:
나는 O (n)으로 알고있다. 보통 단일 루프를 가진다. O (n ^ 2)는 이중 루프입니다. O (n ^ 3)은 트리플 루프 등입니다. O (log n)는 어떻습니까?
당신은 정말로 여기에 잘못된 길을 가고 있습니다. 주어진 알고리즘 구조에 어떤 big-O 표현식이 있는지 암기하려고하지만 실제로 알고리즘에 필요한 연산 수를 세어 입력 크기와 비교해야합니다. 전체 입력을 반복하는 알고리즘은 단일 루프가 아닌 루프를 n 번 실행하기 때문에 O (n) 성능을 갖습니다. 다음은 O (log n) 성능을 가진 단일 루프입니다.
for (i = 0; i < log2(input.count); i++) {
doSomething(...);
}
따라서 필요한 연산 수가 입력 크기의 로그 순서에 해당 하는 알고리즘 은 O (log n)입니다. big-O 분석이 알려주는 중요한 점은 입력 크기와 관련하여 알고리즘의 실행 시간이 어떻게 변하는 지입니다. 입력 크기를 두 배로 늘리면 알고리즘이 1 단계 더 진행됩니다 (O (log n)) , 두 배 많은 단계 (O (n)), 네 배 많은 단계 (O (n ^ 2)) 등
입력을 반복적으로 분할하는 알고리즘은 일반적으로 성능의 구성 요소로 'log n'이 있다는 것을 경험을 통해 알 수 있습니까? 확실한. 그러나 분할을 찾지 말고 알고리즘의 성능이 O (log n)이라는 결론으로 넘어가십시오. 이는 O (n log n)과 비슷할 수 있습니다.
알고리즘은 O(log n)구조를 1 x 1로 스크롤하는 대신 구조를 반씩 반복해서 나누고 각 분할에 대해 일정한 수의 작업을 수행한다는 것입니다. 응답 공간이 계속 분할되는 검색 알고리즘은 O(log n)입니다. 이에 대한 예는 이진 검색으로 , 숫자를 찾을 때까지 정렬 된 배열을 계속 반으로 반복해서 분할합니다.
참고 : 반드시 반으로 나눌 필요는 없습니다.
log n사람들의 이진 검색 반사에 대한 언급입니다 .
일반적인 예는 이진 검색을 다루는 예입니다. 예를 들어, 이진 검색 알고리즘 은 일반적으로 O(log n)입니다.
이진 검색 트리 가 있으면 조회, 삽입 및 삭제가 모두 O(log n)복잡합니다.
공간을 지속적으로 분할하는 모든 상황에는 종종 log n구성 요소가 포함 됩니다. 이것이 많은 정렬 알고리즘이 O(nlog n)종종 세트를 분할하고 정렬함에 따라 복잡하기 때문에 복잡한 이유입니다.
"단일 루프-> O (n), 이중 루프-> O (n ^ 2)"처럼 간단하게 원하는 경우 대답은 "트리-> O (log n)"입니다. 뿌리에서 하나의 잎 (또는 전부는 아닙니다!)이나 다른 방향으로 나무를 더 정확하게 통과합니다. 그러나 이것들은 모두 지나치게 단순화 된 것입니다.
알고리즘이 O (log N)인지 식별하는 쉬운 방법이 있는지 알고 싶습니다.
음 : 그냥 달려서 시간을 정하십시오. 입력 1.000, 10.000, 100.000 및 백만에 대해 실행하십시오.
3,4,5,6 초 (또는 몇 배)의 러닝 타임처럼 보이면 O (log N)라고 안전하게 말할 수 있습니다. 그것이 1,10,100,1000 초와 같으면 아마도 O (N) 일 것입니다. 3,40,500,6000 초와 같으면 O (N log N)입니다.