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)입니다.