알고리즘이 O인지 확인 (log n)


25

CS 이론을 새로 고치고 있는데, 알고리즘 O (log n) 복잡성을 식별하는 방법을 알고 싶습니다. 구체적으로, 그것을 쉽게 식별 할 수있는 방법이 있습니까?

나는 O (n)으로 알고있다. 보통 단일 루프를 가진다. O (n ^ 2)는 이중 루프입니다. O (n ^ 3)은 트리플 루프 등입니다. O (log n)는 어떻습니까?



아, 그것은 내가 보지 않은 곳이다 :)
Atif

답변:


32

나는 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)과 비슷할 수 있습니다.


3
"크기의 로그 순서로"를 말하는 구어체적인 방법은 "크기의 자릿수로"를 말하는 것입니다.

@Caleb 스케일링을 말할 때 로그의 실제베이스는 중요하지 않습니다.

@Caleb 말하는 절대는 big-O에서는 의미가 없습니다. 더 나은 표현 : 자릿수가 두 배가되면 단계 수는 두 배가됩니다.

@Caleb 말하는 절대는 big-O에서는 의미가 없습니다. 더 나은 표현 : 자릿수가 두 배가되면 단계 수는 두 배가됩니다.

@ ThorbjørnRavnAndersen 네, 그것이 "크기의 로그"가 의미하는 것입니다. 나는 당신이 다르게 말하기로 선택했다는 것을 제외하고는 문구와 관련된 문제가 무엇인지 잘 모르겠습니다. 기본적으로 우리는 동의한다고 생각합니다.
Caleb

25

알고리즘은 O(log n)구조를 1 x 1로 스크롤하는 대신 구조를 반씩 반복해서 나누고 각 분할에 대해 일정한 수의 작업을 수행한다는 것입니다. 응답 공간이 계속 분할되는 검색 알고리즘은 O(log n)입니다. 이에 대한 예는 이진 검색으로 , 숫자를 찾을 때까지 정렬 된 배열을 계속 반으로 반복해서 분할합니다.

참고 : 반드시 반으로 나눌 필요는 없습니다.


1
입력을 두 개로 나누고 나머지를 다시 나누기 전에 2 ^ (n / 2) 번 반복하면 어떻게됩니까? (물론, 그때 나는 단순한 접근법이 실패하는 예를 보여주고 싶었습니다.)
Tamás Szelei

@afish 그것은 드물다. 검색 할 때 놀라 울 정도로 드문 경우입니다.
Donal Fellows

1
@DonalFellows 알고리즘 이론은 경험적인 과학이 아닙니다. 그리고 질문은 검색에 관한 것이 아니라 log n사람들의 이진 검색 반사에 대한 언급입니다 .
Tamás Szelei

2
파티셔닝은 알고리즘을 O (log n)로 만들지 않으며, 일반적으로 log-n 계수를 big-O 한계에 추가합니다. heapsort 및 mergesort와 같은 재귀 정렬은 완벽한 예입니다. 입력을 분할하지만 결과 파티션을 재귀 적으로 분할합니다. 결과는 O (n log n) 성능입니다.
Caleb

@afish : 좋은 지적입니다. 이 답변의 목표는 질문의 성격에 따라 최대한 간단하게 유지하는 것입니다. 나는 "구조를 반으로 나누는 중 ..."을 "구조를 반으로 나누고 ... 각 분할마다 일정한 수의 작업을 수행"으로 변경하여이 점을 간단히 이해하려고했습니다.
Casey Patton

2

일반적인 예는 이진 검색을 다루는 예입니다. 예를 들어, 이진 검색 알고리즘 은 일반적으로 O(log n)입니다.

이진 검색 트리 가 있으면 조회, 삽입 및 삭제가 모두 O(log n)복잡합니다.

공간을 지속적으로 분할하는 모든 상황에는 종종 log n구성 요소가 포함 됩니다. 이것이 많은 정렬 알고리즘이 O(nlog n)종종 세트를 분할하고 정렬함에 따라 복잡하기 때문에 복잡한 이유입니다.


1

"단일 루프-> O (n), 이중 루프-> O (n ^ 2)"처럼 간단하게 원하는 경우 대답은 "트리-> O (log n)"입니다. 뿌리에서 하나의 잎 (또는 전부는 아닙니다!)이나 다른 방향으로 나무를 더 정확하게 통과합니다. 그러나 이것들은 모두 지나치게 단순화 된 것입니다.


내 대답에 어떤 문제가 있습니까? 나는 건설적인 비판에 열려 있습니다.
scarfridge

0

알고리즘이 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)입니다.


모두가 :-) 분명한 이유 모두,이 대답을 한 upvote에 하나 downvote을 주어야한다
gnasher729
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.