O (log n)은 정확히 무엇을 의미합니까?


2139

Big O Notation 실행 시간과 상각 시간에 대해 배우고 있습니다. O (n) 선형 시간 의 개념을 이해합니다 . 입력의 크기가 알고리즘의 성장에 비례하여 영향을 미친다는 것을 의미합니다 ... 예를 들어 2 차 시간 O (n 2 ) 등도 마찬가지입니다 (N (n!) 시간의 순열 생성기와 같이 계승에 의해 증가합니다.

예를 들어, 알고리즘이 입력 n 에 비례하여 증가하므로 다음 함수는 O (n)입니다 .

f(int n) {
  int i;
  for (i = 0; i < n; ++i)
    printf("%d", i);
}

마찬가지로 중첩 루프가있는 경우 시간은 O (n 2 )입니다.

그러나 O (log n) 은 정확히 무엇 입니까? 예를 들어 완전한 이진 트리의 높이가 O (log n) 이라는 것은 무엇을 의미 합니까?

log 10 100 = 2 라는 의미에서 Logarithm이 무엇인지 알고 있지만 (상세하게는 아님) Logithmic Time으로 함수를 식별하는 방법을 이해할 수 없습니다.


60
1 노드 이진 트리의 높이는 log2 (1) +1 = 1이고, 2 노드 트리의 높이는 log2 (2) +1 = 2이며, 4 노드 트리의 높이는 log2 (4) +1 = 3입니다. 곧. n 노드 트리의 높이는 log2 (n) +1이므로 트리에 노드를 추가하면 평균 높이가 로그 적으로 커집니다.
David R Tribble

36
내가 대부분의 답변에서보고있는 한 가지는 본질적으로 "O (something)"이라고 기술한다는 것입니다. 알고리즘의 실행 시간이 "something"에 비례하여 증가한다는 것을 의미합니다. "O (log n)"의 "정확한 의미"를 요청했다면 사실이 아닙니다. 이것이 Big-O가 아니라 Big-Theta 표기법에 대한 직관적 인 설명입니다. O (로그 n)은 직관적 실행 시간 성장 수단 많아야 : 비례 "N 로그"에 stackoverflow.com/questions/471199/...
다드 Afshari

31
나는 항상 O (log n)의 사례로 나누고 정복 한 것을 기억합니다
RichardOD

14
로그베이스 2 (베이스 10이 아님)를 인식하는 것이 중요합니다. 이는 알고리즘의 각 단계에서 나머지 선택의 절반을 제거하기 때문입니다. 컴퓨터 과학에서는 상수를 무시할 수 있기 때문에 거의 항상 로그베이스 2를 처리합니다. 그러나 일부 예외가 있습니다 (예 : 쿼드 트리 실행 시간은 로그베이스 4 임)
Ethan

13
@Ethan : 기본 변환은 상수 곱셈이므로 수식이 log_b (x) = log_d (x) / log_d (b)입니다. Log_d (b)는 상수입니다.
mindvirus

답변:


2709

로그 시간으로 함수를 식별하는 방법을 이해할 수 없습니다.

대수 실행 시간 함수의 가장 일반적인 속성은 다음과 같습니다.

  • 어떤 행동을 수행 할 다음 요소의 선택은 여러 가능성 중 하나이며,
  • 하나만 선택하면됩니다.

또는

  • 조치가 수행되는 요소는 n의 숫자입니다.

예를 들어, 전화 번호부에서 사람을 찾는 것이 O (log n) 인 이유입니다. 전화 번호부의 모든 사람 을 확인하지 않아도 올바른 사람을 찾을 수 있습니다. 대신, 이름이 알파벳순으로 표시되어 구분하고 정복 할 수 있으며, 모든 섹션에서 누군가의 전화 번호를 찾기 전에 각 섹션의 하위 집합 만 탐색하면됩니다.

물론, 더 큰 전화 번호부는 여전히 더 오랜 시간이 걸리지 만, 추가 크기가 비례 적으로 증가하는 것만 큼 빠르게 커지는 것은 아닙니다.


우리는 작업의 다른 종류와 비교하는 전화 번호부 예를 확장 할 수 있습니다 자신의 실행 시간을. 전화 번호부에 고유 한 이름을 가진 사업체 ( "노란색 페이지")와 고유 한 이름을 갖지 않는 사람 ( "백색 페이지")이 있다고 가정합니다. 전화 번호는 최대 한 사람이나 회사에 할당됩니다. 또한 특정 페이지로 이동하는 데 일정한 시간이 걸린다고 가정합니다.

전화 번호부에서 수행 할 수있는 일부 작업의 실행 시간은 가장 빠르거나 느립니다.

  • O (1) (최악의 경우) : 업체 이름이있는 페이지와 업체 이름이 주어지면 전화 번호를 찾으십시오.

  • O (1) (평균적인 경우) : 사람의 이름이있는 페이지와 이름이 주어지면 전화 번호를 찾으십시오.

  • O (log n) : 사람의 이름이 주어지면 아직 검색하지 않은 책 부분의 중간 지점에서 임의의 지점을 선택한 다음 그 사람의 이름이 해당 지점에 있는지 확인하여 전화 번호를 찾습니다. 그런 다음 그 사람의 이름이있는 책 부분의 절반 정도에 대해 과정을 반복하십시오. (이것은 사람의 이름에 대한 이진 검색입니다.)

  • O (n) : 전화 번호에 숫자 "5"가 포함 된 모든 사람을 찾습니다.

  • O (n) : 전화 번호가 주어지면 해당 번호의 사람이나 업체를 찾습니다.

  • O (n log n) : 프린터 사무실에 혼동이 있었고 전화 번호부에 모든 페이지가 무작위로 삽입되었습니다. 각 페이지의 이름을 확인한 다음 새 빈 전화 번호부의 적절한 위치에 해당 페이지를 배치하여 순서가 올바른지 확인하십시오.

아래 예의 경우, 이제 프린터 사무실에 있습니다. 전화 번호부는 각 거주자 또는 사업자에게 우편으로 발송되기를 기다리고 있으며, 각 전화 번호부에 우편 발송 위치를 나타내는 스티커가 있습니다. 모든 사람이나 사업체는 전화 번호부를 하나받습니다.

  • O (n log n) : 전화 번호부를 개인화하고 싶기 때문에 지정된 사본에서 각 사람이나 회사 이름을 찾은 다음 책에서 이름을 동그라미로 표시하고 후원에 대한 짧은 감사의 글을 씁니다. .

  • O (n 2 ) : 사무실에서 실수가 발생했으며 각 전화 번호부의 각 항목에는 전화 번호 끝에 "0"이 추가로 있습니다. 화이트 아웃을하고 각각의 0을 제거하십시오.

  • O (n · n!) : 전화 번호부를 배송 도크에로드 할 준비가되었습니다. 불행하게도, 책을로드해야했던 로봇은 완전히 사라졌습니다 : 책을 무작위 순서로 트럭에 싣고 있습니다! 더 나쁜 것은, 모든 서적을 트럭에 적재 한 다음, 올바른 순서인지 확인하고, 그렇지 않은 경우 적재를 해제하고 다시 시작하는 것입니다. (이것은 두려운 보고 정렬 입니다.)

  • O (n n ) : 로봇이 올바르게 적재되도록 로봇을 고정시킵니다. 다음날 동료 중 한 명이 장난을 치고 로딩 독 로봇을 자동화 된 인쇄 시스템에 연결합니다. 로봇이 원본 책을로드 할 때마다 팩토리 프린터는 모든 전화 번호부를 중복 실행합니다! 다행스럽게도, 로봇의 버그 감지 시스템은 중복 된 책이 적재 될 때 로봇이 더 많은 사본을 인쇄하려고 시도하지 않을 정도로 정교하지만 여전히 인쇄 된 모든 원본 및 복제 된 책을로드해야합니다.


81
@cletus : 우연의 일치, 나는 두렵다. 전화 번호부에 큰 N이 있고 사람들은 자신이 무엇을하고 무엇을하는지 이해하기 때문에 예를 들어 다재다능했기 때문에 선택했습니다. 또한 설명에 로봇을 사용해야했습니다! 만능 승리. (또한 StackOverflow 회원으로 시작하기 전에 귀하의 답변이 이루어진 것 같습니다!)
John Feminella

12
"사무실에서 실수가 발생했으며 각 전화 번호부의 각 항목에는 전화 번호 끝에"0 "이 추가로 있습니다. 흰색을 지우고 0을 제거하십시오." <-이것은 N 제곱이 아닙니다. N은 입력 크기로 정의됩니다. 입력 크기는 전화 번호 수이며, 이는 책당 숫자 수에 책 수를 곱한 것입니다. 그것은 여전히 ​​선형 시간 연산입니다.
Billy ONeal

21
@ 빌리 :이 예에서는 N한 권의 책에있는 사람의 수입니다. 전화 번호부에있는 모든 사람도 자신의 책의 사본을 N 얻으N 므로, 동일한 전화 번호부 가 있으며, 그 안에는 사람들 과 함께 있는 O (N ^ 2)가 있습니다.
John Feminella

48
O (1)이 최악의 경우가 아니라 가장 좋은 경우가 아닌가?
Svip

54
마침내 의미가있는 O (log n) 정의를 찾는 데 O (long⅝n! n-55 / 2) 시간이 걸렸습니다. +1
iAteABug_And_iLiked_it

611

O(log N)기본적으로 시간이 선형 적으로 증가하고 시간이 n기하 급수적 으로 증가 함을 의미 합니다. 걸리는 경우에 따라서 1계산에 두 번째 10요소, 그것은 걸릴 것입니다 2계산에 초 100요소, 3초 계산하는 1000등등 요소 및.

그것은이다 O(log n)우리가 알고리즘 예를 들어, 이진 검색의 분할 및 정복 유형을 수행 할 때. 또 다른 예는 배열을 두 부분으로 나누고 O(N)피벗 요소를 찾는 데 시간이 걸리는 빠른 정렬 입니다. 따라서 N O(log N)


108
다른 모든 에세이 답변을 능가하는 세 줄의 지혜 ... :) 누군가가 누락 된 경우를 대비하여 프로그래밍 컨텍스트에서 로그의 밑은 2 (10이 아님)이므로 O (log n)은 10의 경우 1 초와 같습니다. 요소, 20 초 동안 2 초, 40 초 동안 3 초
nawfal

3
OP의 마지막 질문은 "무엇인가"가 아니라 로그 함수를 식별하는 방법에 관한 것이 었음에도 불구하고 동의하고 간결하고 명확합니다.
Adam

4
예, 대수 함수는 지수 함수와 반대입니다. ((log x) 밑수 a)는 (power x)의 역수입니다. 그래프를 사용하여 이러한 기능을 정 성적으로 분석하면 더 직관력이 생깁니다.
overexchange 1

7
이것은 잘못된 것이 아님을 깨닫기 위해 약 3 번의 읽기를 필요로했습니다. 요소수가 기하 급수적 으로 시간 이 선형으로 증가 합니다. 이것은 더 적은 시간 동안 더 많은 요소를 의미 합니다 . 이것은 그래프에서 친숙한 로그 곡선으로 시각화하는 사람들에게는 정신적으로 과세 됩니다. log
Qix-MONICA는

1
이진 검색이 나누기 및 정복 알고리즘이라고 주장하는 부분을 제외하고는 이것이 매우 좋은 대답이라고 생각합니다. 그렇지 않습니다.
code_dredd

579

이 질문에 대한 많은 좋은 답변이 이미 게시되어 있지만 중요한 답변, 즉 설명 된 답변이 실제로 누락되었다고 생각합니다.

완전한 이진 트리의 높이가 O (log n)라는 것은 무엇을 의미합니까?

다음 그림은 이진 트리를 나타냅니다. 각 레벨에 위의 레벨에 비해 두 배의 노드 수가 어떻게 포함되는지 확인하십시오 (따라서 binary ).

이진 트리

이진 검색은 복잡한 예입니다 O(log n). 그림 1에서 트리의 맨 아래 레벨에있는 노드는 정렬 된 콜렉션의 항목을 나타냅니다. 이진 검색은 분할 및 정복 알고리즘이며이 그림은이 16 개의 항목 데이터 세트에서 검색중인 레코드를 찾기 위해 최대 4 개의 비교가 필요한 방법을 보여줍니다.

대신 32 개의 요소가있는 데이터 세트가 있다고 가정합니다. 데이터의 양을 곱할 때 트리가 한 단계 깊게 성장했기 때문에 검색 대상을 찾기 위해 5 번의 비교가 필요하다는 것을 알기 위해 위의 그림을 계속하십시오. 결과적으로 알고리즘의 복잡성을 로그 순서로 설명 할 수 있습니다.

log(n)평범한 종이에 그림을 그리면 곡선의 상승이 n증가함에 따라 감소 하는 그래프가 나타 납니다.

O (로그 n)


60
"각 레벨에 위의 레벨 (이진)과 비교하여 두 개의 노드 수를 포함하는 방법에 유의하십시오."이것은 올바르지 않습니다. 당신이 설명하는 것은 균형 이진 트리입니다. 이진 트리는 각 노드에 최대 두 개의 자식이 있음을 의미합니다.
Oenotria

8
사실, 그것은 완전한 이진 트리라고 불리는 매우 균형 잡힌 이진 트리입니다. 답변을 수정했지만 승인 할 사람이 필요합니다.
user21820

5
완전한 이진 트리는 마지막 레벨을 완전히 채울 필요는 없습니다. '전체 이진 트리'가 더 적절하다고 말할 것입니다.
Mr. AJ

귀하의 답변은 OP의 원래 문제에 대해보다 구체적으로 답변하려고하므로 현재 승인 된 답변 (IMO)보다 낫지 만 여전히 불완전합니다. 절반의 예제와 2 개의 이미지 만 제공하십시오.
nbro

2
이 트리에는 16 개가 아닌 31 개 항목이 있습니다. 16 개 항목 데이터 세트라고하는 이유는 무엇입니까? 그것의 모든 노드는 숫자를 나타내며, 그렇지 않으면 비효율적 인 이진 트리가 될 것입니다 : P
Perry Monschau

245

아래 설명은 완전 균형 이진 트리 의 경우를 사용하여 로그 시간 복잡성을 얻는 방법을 이해하는 데 도움이됩니다.

이진 트리는 크기 n의 문제가 크기 1의 문제에 도달 할 때까지 크기 n / 2의 하위 문제로 나뉜 경우입니다.

이진 트리의 높이

그리고 이것이 당신이 솔루션에 도달하기 위해 위의 트리에서 수행해야 할 작업량 인 O (log n)을 얻는 방법입니다.

O (log n) 시간 복잡성을 갖는 일반적인 알고리즘은 재귀 관계가 T (n / 2) + O (1) 인 이진 검색입니다. 즉, 트리의 모든 후속 레벨에서 문제를 반으로 나누고 일정한 양의 추가 작업을 수행합니다.


2
여기 초보자 트리 높이가 재귀에 의한 분할 속도가 n = 1에 도달한다고 말할 수 있습니까?
코디

@Cody, 대부분의 경우 관찰 내용이 정확합니다. 이 예제는를 보여주고 / 사용 log_2합니다. 당신의 관찰은 그 이상으로 확장 log_2될 것이며 어느 log_x곳 에서나 정확할 것 x > 1입니다. 직선 분할을 수행하면 정확히 1로 이어지지 않을 수 있으므로 Ceiling()최신 분할이 1 또는 이와 유사한 것이 될 때까지 재귀 분할을 말하고 싶을 수 있습니다 .
James Oravec

198

개요

다른 사람들은 트리 다이어그램과 같은 좋은 다이어그램 예제를 제공했습니다. 간단한 코드 예제는 보지 못했습니다. 따라서 내 설명 외에도 다양한 알고리즘 범주의 복잡성을 설명하기 위해 간단한 인쇄 문이있는 알고리즘을 제공합니다.

먼저 https://en.wikipedia.org/wiki/Logarithm 에서 얻을 수있는 Logarithm에 대한 일반적인 아이디어가 필요합니다 . 자연 과학 사용 e과 자연 로그. 공학자들은 컴퓨터가 이진 기반이기 때문에 log_10 (로그베이스 10)을 사용하고 컴퓨터 과학자들은 log_2 (로그베이스 2)를 많이 사용합니다. 때로는 자연 로그의 약어가로 표시 ln()되고 엔지니어는 일반적으로 _10을 끄고 사용하면 log()log_2는로 표시됩니다 lg(). 모든 유형의 로그는 비슷한 방식으로 성장하므로 동일한 카테고리를 공유합니다 log(n).

아래 코드 예제를 볼 때 O (1), O (n), O (n ^ 2)를 확인하는 것이 좋습니다. 당신이 그것들을 잘 알고 나면 다른 것들을보십시오. 미묘한 변화가 여전히 동일한 분류를 초래할 수있는 방법을 보여주는 변형뿐만 아니라 깨끗한 예를 포함 시켰습니다.

O (1), O (n), O (logn) 등을 클래스 또는 성장 범주로 생각할 수 있습니다. 일부 카테고리는 다른 카테고리보다 시간이 더 걸립니다. 이 범주는 알고리즘 성능을 주문하는 방법을 제공합니다. 일부는 입력 n이 증가함에 따라 더 빠르게 성장했습니다. 하기 표는 상기 성장을 수치 적으로 설명한다. 아래 표에서 log (n)을 log_2의 상한값으로 생각하십시오.

여기에 이미지 설명을 입력하십시오

다양한 Big O 카테고리의 간단한 코드 예제 :

O (1)-상수 시간 예 :

  • 알고리즘 1 :

알고리즘 1은 hello를 한 번 인쇄하며 n에 의존하지 않으므로 항상 일정한 시간에 실행되므로입니다 O(1).

print "hello";
  • 알고리즘 2 :

알고리즘 2는 hello를 3 번 ​​인쇄하지만 입력 크기에 의존하지 않습니다. n이 커지더라도이 알고리즘은 항상 hello를 3 번만 인쇄합니다. 3이라고하는 것은 상수 이므로이 알고리즘도 마찬가지 O(1)입니다.

print "hello";
print "hello";
print "hello";

O (log (n))-대수 예제 :

  • 알고리즘 3- "log_2"와 같은 역할

알고리즘 3은 log_2 (n)에서 실행되는 알고리즘을 보여줍니다. for 루프의 포스트 연산은 i의 현재 값에 2를 곱하므로 i1에서 2로, 4에서 8로, 16에서 32로갑니다.

for(int i = 1; i <= n; i = i * 2)
  print "hello";
  • 알고리즘 4- "log_3"과 같은 기능

알고리즘 4는 log_3을 보여줍니다. 통지 i는 1에서 3으로, 9에서 27로갑니다 ...

for(int i = 1; i <= n; i = i * 3)
  print "hello";
  • 알고리즘 5- "log_1.02"와 같은 기능

알고리즘 5는 숫자가 1보다 크고 결과가 반복해서 자신에 대해 곱해지는 한, 로그 알고리즘을보고 있다는 것을 보여 주므로 중요합니다.

for(double i = 1; i < n; i = i * 1.02)
  print "hello";

O (n)-선형 시간 예 :

  • 알고리즘 6

이 알고리즘은 간단하며 hello를 n 번 인쇄합니다.

for(int i = 0; i < n; i++)
  print "hello";
  • 알고리즘 7

이 알고리즘은 hello n / 2 번 인쇄되는 변형을 보여줍니다. n / 2 = 1/2 * n. 1/2 상수를 무시하고이 알고리즘이 O (n)임을 알 수 있습니다.

for(int i = 0; i < n; i = i + 2)
  print "hello";

O (n * log (n))-nlog (n) 예 :

  • 알고리즘 8

(A)의 조합이 생각 O(log(n))하고 O(n). for 루프의 중첩은 우리가O(n*log(n))

for(int i = 0; i < n; i++)
  for(int j = 1; j < n; j = j * 2)
    print "hello";
  • 알고리즘 9

알고리즘 9는 알고리즘 8과 비슷하지만 각 루프마다 변형이 허용되어 최종 결과는 여전히 O(n*log(n))

for(int i = 0; i < n; i = i + 2)
  for(int j = 1; j < n; j = j * 3)
    print "hello";

O (n ^ 2)-n 제곱 예 :

  • 알고리즘 10

O(n^2) 표준 for 루프를 중첩하여 쉽게 얻을 수 있습니다.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    print "hello";
  • 알고리즘 11

알고리즘 10과 유사하지만 약간의 변형이 있습니다.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j = j + 2)
    print "hello";

O (n ^ 3)-n 큐브 형 예 :

  • 알고리즘 12

이것은 알고리즘 10과 비슷하지만 2 대신 3 개의 루프가 있습니다.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    for(int k = 0; k < n; k++)
      print "hello";
  • 알고리즘 13

알고리즘 12와 유사하지만 여전히 변형되는 변형이 있습니다 O(n^3).

for(int i = 0; i < n; i++)
  for(int j = 0; j < n + 5; j = j + 2)
    for(int k = 0; k < n; k = k + 3)
      print "hello";

요약

위의 몇 가지 간단한 예제와 분석을 변경하지 않는 미묘한 변경 사항을 소개하는 변형을 보여줍니다. 잘하면 그것은 당신에게 충분한 통찰력을 제공합니다.


17
대박. 내가 본 가장 좋은 설명. 경우는 더 좋은 것 O(n^2)의 조합으로 주목 O(n)하고 O(n)그래서 O(n) * O(n) = O(n * n) = O(n^2). 이 방정식이 없으면 약간의 점프처럼 느껴집니다. 이것은 이전 설명의 반복이지만,이 반복이 독자들에게 더 많은 이해를 제공 할 수 있다고 생각합니다.
Eonil

2
이것은 단순히 최고의 설명입니다.
Edgar Kiljak 2016 년

2
@IceTea, 질문에 대한 통찰력 / 직관을 제공합니다. 차트를 n비교 n/2하면 둘 다 직선을 이룹니다. 이를 통해 성장률이 비슷한 것과 같은 등급으로 분류 할 수 있습니다 (차트 형태로 생각하십시오). 마찬가지로, 차트 log_2와 차트를 비교 log_3하면 둘 다 "유사한 모양"또는 "유사한 성장률"을 취한다는 것을 알 수 있습니다.
James Oravec

1
@Shai와 @James가 제공 한 @IceTea의 설명이 더 정확 n/2 or 2n or n+2 or n하고 그래프에서 다른 선을 가지지 만 성장률은 동일하지만 모두 선형 성장을 따릅니다.
Naresh Joshi

2
두 개의 중첩 루프가 있지만 두 번째 반복자가 첫 번째 반복에 의존하는 경우는 어떻습니까?이 종속성은 시간 복잡성에 영향을 줍니까?
Bionix1441

131

필요한 기능이있는 경우 :

1 millisecond to complete if you have 2 elements.
2 milliseconds to complete if you have 4 elements.
3 milliseconds to complete if you have 8 elements.
4 milliseconds to complete if you have 16 elements.
...
n milliseconds to complete if you have 2^n elements.

그런 다음 로그 2 (n) 시간이 걸립니다. 큰 O 표기법은 느슨하게 관계는 큰 N에 대한 사실 필요가 수단을 말하고, 그 상수 요인과 작은 조건은 무시할 수 있습니다.


log2 (n)은 o (log n)과 동일합니까?
Sven van den Boogaart

예, 또 다른 대답은 nawfal의 주석을 참조하십시오. (복사 붙여 넣기)-프로그래밍 컨텍스트에서 로그의 밑은 2 (10 아님)이므로 O (log n)은 10 요소의 경우 1 초, 20의 경우 2 초입니다. , 3 등 40 개
Andrejs

@SvenvandenBoogaart,이 솔루션의 예제 log_2는 클래스에있는을 보여줍니다 .O(log(n)) 있습니다. 많은 사람들이 동일한 클래스에있다 O(log(n))log_xx > 1
제임스 Oravec

@Andrejs, 귀하의 의견 so O(log n) scales like 1 sec for 10 elements, 2 sec for 20, 3 for 40 etc이 정확하지 않습니다. 해당 패턴 / 클래스는 O(n)not 과 일치 / 정렬됩니다 O(log(n)). 사람에 관심이 있다면 log_1010 개 요소 등 2 내지 100 초, 1000 (3), 1 초 후 것 등가 예
제임스 Oravec

99

로그 실행 시간 ( O(log n))은 기본적으로 실행 시간이 입력 크기 의 로그 에 비례하여 증가 함을 의미합니다. 예를 들어, 10 개의 항목이 최대 시간 x이 걸리고 100 개의 항목이 최대, 예를 들어 2x10,000 개의 항목 을 차지하는 경우 최대한 걸리면 시간 복잡성 4x처럼 보입니다 O(log n).


1
+1이지만 실제로 log10이 아니라 log2임을 지적해야합니다.
Adriano Varoli Piazza

62
log2 또는 log10은 관련이 없습니다. 그것들은 스케일 팩터에 의해서만 달라서 같은 순서로 만들어집니다. 즉, 여전히 같은 비율로 성장합니다.
Noldorin

17
대수의 재미있는 점은 상대 높이를 비교할 때 사용하는 정확한 기준이 중요하지 않다는 것입니다. log 10,000 / log 100어떤베이스를 사용하든 관계없이 2입니다.
아논.

12
엄밀히 말하면 O (lg n)는 런타임이 최대 lg n에 비례 한다는 것을 의미합니다 . 당신이 설명하는 것은 Theta (lg n)입니다.

1
@rgrig : 맞습니다. big-O의 상한 특성을 나타 내기 위해 "최대한"몇 가지로 편집했습니다.
아논.

95

대수

이제 로그가 실제로 무엇인지 완전히 이해하려고 노력하겠습니다.

우리가 밧줄을 가지고 있고 그것을 말에 묶었다고 상상해보십시오. 밧줄이 말에 직접 묶여 있다면 말이 잡아 당겨야 할 힘은 (즉, 사람에게서) 1입니다.

이제 밧줄이 기둥 둘레에 고리를 이루고 있다고 상상해보십시오. 도망 치는 말은 이제 여러 번 더 세게 당겨야합니다. 시간은 로프의 거칠기와 극의 크기에 따라 달라 지지만, 로프가 완전히 회전 할 때 강도에 10을 곱한다고 가정 해 봅시다.

밧줄이 한 번 반복되면 말은 10 배 더 세게 당길 필요가 있습니다. 만약 인간이 말을 정말로 어렵게하기로 결정한다면, 밧줄을 다시 기둥에 감아 강도를 추가로 10 배 증가시킬 수 있습니다. 세 번째 루프는 강도를 다시 10 배 더 증가시킵니다.

여기에 이미지 설명을 입력하십시오

우리는 각 루프마다 값이 10 씩 증가한다는 것을 알 수 있습니다. 어떤 숫자를 얻는 데 필요한 회전 수를 숫자의 로그라고합니다. 즉, 우리는 강도를 1000 배로 곱하기 위해 3 개의 포스트가 필요합니다. 1,000,000

3은 1,000의 로그이고 6은 1,000,000의 로그 (기본 10)입니다.

그렇다면 O (log n)은 실제로 무엇을 의미합니까?

위의 예에서 '성장률'은 O (log n) 입니다. 모든 추가 루프마다 로프가 처리 할 수있는 힘이 10 배 이상 증가합니다.

Turns | Max Force
  0   |   1
  1   |   10
  2   |   100
  3   |   1000
  4   |   10000
  n   |   10^n

이제 위의 예는 10을 사용했지만 운 좋게도 큰 표기법에 대해 이야기 할 때 로그의 기본은 중요하지 않습니다.

이제 1-100 사이의 숫자를 추측하려고한다고 가정 해 봅시다.

Your Friend: Guess my number between 1-100! 
Your Guess: 50
Your Friend: Lower!
Your Guess: 25
Your Friend: Lower!
Your Guess: 13
Your Friend: Higher!
Your Guess: 19
Your Friend: Higher!
Your Friend: 22
Your Guess: Lower!
Your Guess: 20
Your Friend: Higher!
Your Guess: 21
Your Friend: YOU GOT IT!  

이제 이것을 올바르게하려면 7 가지 추측이 필요했습니다. 그러나 여기서의 관계는 무엇입니까? 각각의 추가 추측으로 추측 할 수있는 가장 많은 항목은 무엇입니까?

Guesses | Items
  1     |   2
  2     |   4
  3     |   8
  4     |   16
  5     |   32
  6     |   64
  7     |   128
  10    |   1024

그래프를 사용하면 이진 검색을 사용하여 1-100 사이의 숫자를 추측하면 최대 7 번의 시도 가 필요하다는 것을 알 수 있습니다 . 만약 우리가 128 개의 숫자를 가지고 있다면, 7 번의 시도에서 숫자를 추측 할 수 있지만 129 개의 숫자는 우리 를 최대로 끌어들일 것입니다 번의 시도 8 번의 시도를 (대수와 관련하여, 여기에서는 128 개의 값 범위에 대해 7 개의 추측, 1024 개의 값에 대해 10 개의 추측이 필요합니다) 7은 128의 로그이고, 10은 1024의 로그 (기수 2)입니다.

'최대한'굵게 표시했습니다. Big-O 표기법은 항상 더 나쁜 경우를 나타냅니다. 운이 좋으면 한 번의 시도로 숫자를 추측 할 수 있으므로 가장 좋은 경우는 O (1)이지만 다른 이야기입니다.

모든 추측에 대해 데이터 세트가 축소되고 있음을 알 수 있습니다. 알고리즘에 로그 시간이 있는지 식별하는 좋은 경험 법은 각 반복 후 데이터 세트가 특정 순서로 축소되는지 확인하는 것입니다.

O (n log n)는 어떻습니까?

결국 선형 선형 시간 O (n log (n)) 알고리즘을 보게됩니다 . 어림짐작 위에 다시 적용되지만 대수 함수를 갖는다 이번에 실행 n 번 예는리스트의 사이즈 감소 n 번 머지 소트 등의 알고리즘에서 발생.

알고리즘 시간이 n log n인지 쉽게 식별 할 수 있습니다. 목록을 반복하는 외부 루프를 찾으십시오 (O (n)). 그런 다음 내부 루프가 있는지 확인하십시오. 내부 루프가 각 반복에서 데이터 세트를 절단 / 축소 하는 경우 해당 루프는 (O (log n))이므로 전체 알고리즘은 = O (n log n) 입니다.

면책 조항 : 로프 로그 예제는 W.Sawyer의 우수한 수학자 딜라이트 책에서 발췌 한 것 입니다.


In our example above, our 'growth rate' is O(log n). For every additional loop, the force our rope can handle is 10 times more어느 방송 N 루프 == 번호 차트 지원 our 'growth rate'N 로그 NOT한다 => 10 ^ N. 로 만들 n=# horses려면 log n 루프가 필요합니다. 불완전한 페도 고 학적 사례는 자신 만 이해한다고 믿는 학생들을 만들어냅니다.
psimpson

56

시간이 N의 자릿수에 비례한다고 말하면 O (log N)을 직관적으로 생각할 수 있습니다.

연산이 입력의 각 자릿수 또는 비트에 대해 일정한 시간 작업을 수행하는 경우, 전체 연산은 입력의 크기가 아니라 입력의 자릿수 또는 비트 수에 비례하여 시간이 걸립니다. 따라서 O (N) 대신 O (log N)입니다.

작업이 고려할 입력의 크기를 반으로 (3, 4, 5로 줄임) 일련의 일정한 시간 결정을하는 경우 전체는 로그베이스 2 (베이스 3)에 비례하여 시간이 걸립니다. , base 4, base 5 ...)는 입력 크기 N의 O (N)이 아니라 N입니다.

등등.


7
대부분의 설명보다 정확하고 쉽게 파악할 수 있다고 생각합니다.
T.

에 대한 설명입니다 log<sub>10</sub> N.
LiuYan 刘 研

1
@LiuYan 刘 研 그들은 숫자의 자릿수가 얼마인지 말하지 않았습니다. 어쨌든 log₂ (n) = log₁₀ (n) / log₁₀ (2) 그리고 1 / log₁₀ (2)는 상수 곱셈기입니다. 다른 모든 기지에도 같은 원칙이 적용됩니다. 이것은 두 가지를 보여줍니다. 첫째로, 그 달 그림자의 원리는 기본에 상관없이 (베이스가 낮을수록 추정치에서 "재그 (jags)"가 적음) 적용되며, 그 결론을 이끌어 낸 계산에 상관없이 O (log n)은 O (log n)입니다. .
존 한나

"비례"... "각 입력의 절반 크기"??????
csguy

52

O (log n)에서 실행되는 알고리즘을 항상 정신적으로 시각화해야하는 가장 좋은 방법은 다음과 같습니다.

문제 크기를 곱하기 양으로 늘리면 (즉, 크기에 10을 곱하면) 작업은 추가 량만큼만 증가합니다.

이진 트리 질문에 이것을 적용하면 좋은 응용 프로그램을 얻을 수 있습니다. 이진 트리의 노드 수를 두 배로 늘리면 높이는 1 (첨가량) 만 증가합니다. 다시 두 배로 늘리면 여전히 1 증가했습니다 (분명히 균형을 유지한다고 가정합니다). 이렇게하면 문제의 크기를 곱할 때 작업을 두 배로 늘리는 대신 약간 더 많은 작업 만 수행 할 수 있습니다. 이것이 O (log n) 알고리즘이 대단한 이유입니다.


52

먼저 다음 책을 읽는 것이 좋습니다.

알고리즘 (제 4 판)

다음은 몇 가지 기능과 예상되는 복잡성입니다. 숫자는 명령문 실행 빈도를 나타냅니다 .

다음은 몇 가지 기능과 예상되는 복잡성입니다.

bigocheatsheet 에서 가져온 다음 Big-O Complexity Chart 빅오 복잡도 차트

마지막으로 매우 간단한 쇼케이스는 계산 방법을 보여줍니다.

프로그램의 명령문 실행 빈도 분석

프로그램의 실행 시간 분석 (예).

프로그램의 실행 시간 분석


5
나쁜 바구니 에 O (n log n)를 넣지 않을 것 입니다. 그것은 공정한 것에 속합니다 .
André Werlang '12

위의 큰 O 복잡도 차트를 볼 때 O (n)은 분홍색 / 주황색 보더가 아니라 실제 선형 점임을 기억해야합니다. @Andre 그래서 O (n log n)가 '나쁜'성능 브래킷에 올바르게 표시되는 이유는 선형보다 성능이 떨어집니다.
JavaBeast

@JavaBeast는 O (n log n)의 성능이 O (n)보다 기술적으로 나쁘지만 위의 표를 참조하십시오. 위의 표를 참조하십시오. 다른 출처에서 온 차트는 O (1)과 O (log n)을 동일한 장점 / 우수성으로 분류하기 때문에 모순됩니다. 그들의 상대적 성장 순서는 O (n) 및 O (n log n)에 필적합니다. tl; dr; O (n log n)는 우수하지 않지만 나쁘지 않습니다.
André Werlang

1
이 답변은 잘못되었습니다! N = N * N이라고 가정합니다. 실제로 N = N! 귀하의 예는 실제로 N 큐브입니다. 그래프에서도 마찬가지입니다. 당신의 O (n)은 실제로 끔찍한 것과 나쁜 것의 구분이어야합니다. 수학적 증거 : for 루프는 O (1)에서 일정하다고 말합니다. 이것이 1이 실제로 의미하는 것이며 N에 의존하지 않습니다. 단지 변수가 아니라는 의미입니다. 그러나 그것은 N에 의존하기 때문에 가변적입니다. N. Twice N과 절반의 시간. 따라서 유효하지 않습니다. 그 책에서 나온 책이라면 사지 마십시오! 당신이 보여준 코드 그래픽은 실제가 아닙니다. 농담입니다. OMG
jgmjgm 2019 년

1
대각선에 O (n)이 없어야합니까?
gyosifov

46

로그 b (n)는 무엇입니까?

길이 1의 로그를 크기가 1 인 섹션에 도달하기 전에 b 등분으로 반복해서자를 수있는 횟수입니다.


훌륭한 의견! 간결하고 정확한 답변입니다.
DennisL

18

분할 및 정복 알고리즘에는 일반적으로 logn실행 시간에 대한 구성 요소가 있습니다. 이것은 입력의 반을 반복하여 발생합니다.

이진 검색의 경우 반복 할 때마다 입력의 절반을 버립니다. Big-O 표기법에서 log는 log base 2입니다.

편집 : 언급했듯이 로그베이스는 중요하지 않지만 알고리즘의 Big-O 성능을 도출 할 때 로그 팩터가 반으로 나옵니다. 따라서 왜 이것을베이스 2로 생각합니다.


2
왜 로그베이스 2입니까? 예를 들어 무작위 퀵 정렬에서는 기본 2라고 생각하지 않습니다. 내가 아는 한 기본은 중요하지 않습니다. 로그베이스 a (n) = log2 (n) / log2 (a)이므로 모든 로그 상수에 의해 다른 것과 다르며, 큰 표기법에서는 상수가 무시됩니다. 사실, 큰 기수 표기법으로 로그의 기초를 쓰는 것은 상수를 쓰는 것처럼 내 생각에는 실수입니다.
IVlad


기본으로 변환 할 수 있으며 중요하지 않지만 Big-O 성능을 도출하려고 시도하고 끊임없이 반감하는 경우 로그베이스 10이 코드에 반영되지 않음을 이해하는 데 도움이됩니다.
David Kanarek

제쳐두고 : 노드가 2 이상 (즉, 이진 트리보다 "더 넓은")의 팬 아웃을 갖는 B- 트리와 같은 것에서는 여전히 분할되고 있기 때문에 O (로그온) 증가를 볼 수 있습니다. -정복하지만 로그의 기본은 팬 아웃과 관련됩니다.
Roger Lipscombe

로그 2의 위반은 실제로 도움이되었습니다.
Dan Rosenstark

15

그러나 O (log n)는 정확히 무엇입니까? 예를 들어, 완전한 이진 트리의 높이가 O (log n)라는 것은 무엇을 의미합니까?

나는 이것을 '완전한 이진 트리의 높이는 log n'으로 바꾸겠다. 전체 이진 트리의 높이를 단계별로 탐색하는 경우 O (log n)가됩니다.

로그 시간으로 함수를 식별하는 방법을 이해할 수 없습니다.

대수는 본질적으로 지수의 역수입니다. 따라서 함수의 각 '단계'가 요인을 제거하면 원래 항목 세트에서 의 요소를 하면 대수 시간 알고리즘입니다.

트리 예제의 경우, 계속해서 순회하면서 노드 수준을 낮추면 기하 급수적 인 요소가 줄어드는 것을 쉽게 알 수 있습니다. 이름별로 정렬 된 전화 번호부를 살펴 보는 가장 일반적인 예는 기본적으로 이진 검색 트리를 탐색하는 것과 같습니다 (중간 페이지는 루트 요소이며 각 단계에서 왼쪽 또는 오른쪽으로 갈지 여부를 추론 할 수 있음).


3
"로그는 본질적으로 지수의 역수입니다"라고 언급하면 ​​+1입니다.
talonx

12

이 두 경우는 O (log n) 시간이 걸립니다

case 1: f(int n) {
      int i;
      for (i = 1; i < n; i=i*2)
        printf("%d", i);
    }


 case 2  : f(int n) {
      int i;
      for (i = n; i>=1 ; i=i/2)
        printf("%d", i);
    }

나는 무언가를 놓치고 있다고 확신하지만, 항상 0이 아니며 0 * 2 = 0 및 0 / ​​2 = 0 이후 루프가 두 경우 모두 영원히 실행됩니까?
dj_segfault

2
@dj_segfault, 그건 내 실수 였어. 이제 말이되는 것 같아 .. :)
라비 비 슬라

@RaviBisla 다른 답변에 따르면 10의 입력은 10 루프만큼 1 시간이 걸리고 100의 입력은 1의 입력 시간에 3 배가 걸리므로 이러한 예에서는 그렇지 않습니다. stackoverflow.com/a/2307330/1667868
Sven van den Boogaart

12

O (log n)은 약간 오해의 소지가 있습니다.보다 정확하게는 O (log 2 n)입니다 (즉, 밑이 2 인 로그).

균형 잡힌 이진 트리의 높이는 O (log 2 n)입니다. 왜냐하면 모든 노드는 2 개 (로그 2 n 에서와 같이 "2"참고 ) 자식 노드를 갖기 때문입니다. 따라서 n 개의 노드가있는 트리의 높이는 log 2 n입니다.

다른 예는 이진 검색으로, 모든 단계에서 검색 공간을 2로 나누기 때문에 실행 시간이 O (log 2 n)입니다.


4
O (log n)은 O (ld n) 또는 O (LN n)과 순서가 같습니다. 그들은 비례합니다. 학습 목적으로 ld를 사용하는 것이 더 쉽다는 것을 이해합니다.
helios

4
"보다 정확하게는 O (ld n)"-아니요, 그렇지 않습니다. 모든 로그의 순서가 동일합니다 (각 로그는 일정한 스케일링 계수에 의해서만 서로 다르며 무시 / 무시 가능).
ChrisW

1
당신은 옳은 크리스, 아주 나쁜 표현입니다. 헬리오스처럼 말 했어야 했어요 학습 / 이해에 도움이되지만 결국 모든 로그는 동일한 순서입니다.
stmax

10

O(log n) 대수에 비례하는 시간 동안 작동하는 함수 (또는 알고리즘 또는 알고리즘의 단계)를 나타냅니다 (대개 대부분의 경우 기본 2이지만 항상 그런 것은 아니며 어떤 경우에도 big-O 표기법으로 중요하지 않음) 입력 크기의.

로그 함수는 지수 함수의 역수입니다. 달리 말하면, 입력이 일반적으로 생각하는 것처럼 선형이 아닌 지수 적으로 증가하면 함수가 선형으로 증가합니다.

O(log n)실행 시간은 모든 종류의 분할 및 정복 응용 프로그램에서 매우 일반적입니다. 매번 작업을 반으로 (이상적으로) 자르기 때문입니다. 각 분할 또는 정복 단계에서 일정 시간 작업 (또는 일정 시간이 아니지만 시간보다 느리게 성장하는 작업)을 수행하는 경우 O(log n)전체 기능은 O(log n)입니다. 각 단계마다 입력에 선형 시간이 필요하다는 것이 일반적입니다. 이것은 총 시간 복잡성에 해당합니다O(n log n) 합니다.

바이너리 검색의 실행 시간 복잡성은 다음의 예입니다. O(log n) . 이진 검색에서는 배열을 반으로 나누고 각 단계의 절반에만 초점을 두어 나중에 각 단계에서 입력의 절반을 무시하기 때문입니다. 각 단계는 일정한 시간입니다. 바이너리 검색에서는 고려중인 배열의 크기에 관계없이 다음에 수행 할 작업을 파악하기 위해 하나의 요소 만 키와 비교하면됩니다. 따라서 대략 log (n) / log (2) 단계를 수행하십시오.

병합 정렬의 실행 시간 복잡성이 예입니다 O(n log n). 이는 배열을 각 단계마다 반으로 나누기 때문에 총 대략 log (n) / log (2) 단계가 발생하기 때문입니다. 그러나 각 단계에서 모든 요소에 대해 병합 작업을 수행해야합니다 (n / 2 요소의 두 하위 목록에 대한 하나의 병합 작업 또는 n / 4 요소의 네 개의 하위 목록에 대한 두 개의 병합 작업은 상관 없음). 각 단계에서 n 개의 요소에 대해이 작업을 수행하십시오.) 따라서 총 복잡도는 O(n log n)입니다.

* 정의상 큰 상수 표기법 은 중요하지 않습니다. 또한 대수에 대한 기본 규칙변경되어 다른 기수의 로그 사이의 유일한 차이점은 상수 요인입니다.


마지막 * 메모는 2 또는 10을 기반으로하는 로그에 대한 나의 혼란을 해결했습니다.
yahya


9

간단히 말해 : 알고리즘의 각 단계에서 작업을 반으로 줄일 수 있습니다. (증상 적으로 셋째, 넷째, ...와 동일)


2
이 답변은 매우 부정확합니다. 우선, 기초 2의 대수의 경우에만 작업을 절반으로 줄일 수 있다고 생각할 수 있습니다.이 답변 (및 원래 질문에 대한 대부분의 답변)이 많은 투표를받은 방식은 정말 믿어지지 않습니다. "(증상 적으로 셋째, 넷째, ...)"? 시간이 없다면 왜 질문에 대답합니까?
nbro

8

그래픽 계산기 또는 이와 유사한 것에 대수 함수를 플로팅하면 선형 함수보다 훨씬 느리게 상승 함을 알 수 있습니다.

이것이 로그 시간 복잡성을 가진 알고리즘을 찾는 이유입니다. 실제로 큰 n (예를 들어, n = 10 ^ 8이라고하더라도)은 수용 할 수있는 것 이상을 수행합니다.


7

그러나 정확히 O (log n)는 무엇입니까

무엇 정확하게 의미하는 것은 "있는 그대로 n쪽으로 경향 infinity은이 time쪽으로 경향이 a*log(n)a일정한 스케일링 인자이다."

또는 실제로, 그런 의미는 아닙니다. 아마도 " time로 나눈 a*log(n)경향 "을 의미합니다 1.

'분석'에서 일반적인 수학적 의미가있다 "쪽으로 경향이있다": "당신이 선택하는 경우, 예를 들어, 그 어떤 임의의 작은 영이 아닌 상수 k, 그때는 해당 값을 찾을 수있는 X그런 ((time/(a*log(n))) - 1)미만이며 k모든 값 n보다 큰를 X."


즉, 시간 방정식에는 다른 구성 요소가있을 수 있습니다. 예를 들어 일정한 시작 시간이있을 수 있습니다. 그러나 이들 다른 성분들은 큰 n 값에 대해서는 무의미한 창백하고 a * log (n)은 큰 n에 대한 지배적 인 용어이다.

방정식이 예를 들어 ...

시간 (n) = a + b log (n) + c n + d n n

... 상수 a, b, c 및 0이 아닌 d의 값에 관계없이 d*n*n항은 충분히 큰 n 값에 대해 항상 다른 것보다 우세 하기 때문에 O (n 제곱) 입니다.

이것이 비트 O 표기법의 의미입니다. "충분히 큰 n에 대해 지배적 인 용어의 순서는 무엇입니까"를 의미합니다.



7

Kormen 등이 오래 전에 읽은 흥미로운 내용을 추가 할 수 있습니다. 이제 문제 공간에서 해결책을 찾아야하는 문제를 상상해보십시오. 이 문제 공간은 유한해야합니다.

이제 알고리즘을 반복 할 때마다이 공간의 일부, 즉 한계 값을 제한한다는 것을 증명할 수 있다면 이는 알고리즘이 O (logN) 시간에 실행되고 있음을 의미합니다.

여기서는 절대 분수가 아니라 상대 분수 한계에 대해 이야기하고 있습니다. 이진 검색은 전형적인 예입니다. 각 단계에서 문제 공간의 1/2을 버립니다. 그러나 이진 검색 만이 그러한 예는 아닙니다. 어떻게 든 각 단계에서 최소한 1/128의 문제 공간을 버린다고 가정하십시오. 즉, 바이너리 검색보다 상당히 느리지 만 프로그램이 여전히 O (logN) 시간에 실행되고 있음을 의미합니다. 이것은 재귀 알고리즘 분석에 매우 유용한 힌트입니다. 각 단계에서 재귀가 여러 변형을 사용하지 않음을 종종 증명할 수 있으며, 이로 인해 문제 공간에서 일부 부분이 잘립니다.


6

나는 for 루프에 대한 예를 제시 할 수 있고, 일단 개념을 파악한 후에는 다른 상황에서 이해하는 것이 더 간단 할 것이다.

이는 루프에서 단계가 기하 급수적으로 증가 함을 의미합니다. 예 :

for (i=1; i<=n; i=i*2) {;}

이 프로그램의 O 표기법의 복잡성은 O (log (n))입니다. 직접 손으로 반복 해 봅시다 (n은 512와 1023 사이에 있습니다 (1024 제외)).

step: 1   2   3   4   5    6    7    8     9     10
   i: 1   2   4   8   16   32   64   128   256   512

n이 512와 1023 사이에 있지만 10 회만 반복됩니다. 루프의 단계가 기하 급수적으로 증가하므로 종료에 도달하는 데 10 회만 반복하기 때문입니다.

x (a의 밑)에 대한 로그는 a ^ x의 역함수입니다.

대수는 지수의 역수라고 말하는 것과 같습니다.

이제 지수가 매우 빠르게 커지면 대수는 (반대 적으로) 매우 느리게 증가합니다.

O (n)과 O (log (n))의 차이는 O (n)과 O (a ^ n)의 차이와 유사합니다 (상수 임).


6

실제로 n 개의 요소 목록이 있고 해당 목록에서 이진 트리를 만들면 (분할 및 정복 알고리즘과 같이) 크기가 1 인 목록 (잎)에 도달 할 때까지 2로 계속 나눕니다.

첫 번째 단계에서는 2로 나눕니다. 그러면 2 개의 목록 (2 ^ 1)이 있고 각각 2로 나눕니다. 따라서 4 개의 목록 (2 ^ 2)이 있고 다시 나누면 8 개의 목록이 있습니다 (2 ^ 3). 목록 크기가 1이 될 때까지 계속

그것은 당신에게 방정식을 제공합니다 :

n/(2^steps)=1 <=> n=2^steps <=> lg(n)=steps

(당신은 각면의 lg를 취하고, lg는 로그베이스 2입니다)


2
일부 악성 코드가 잎 노드 이전에 2 단계로 x 길이의 새 목록을 삽입 할 때까지. 그렇다면 그것은 무한 루프처럼 보일 것입니다 ...
Francis Cugler

1
나는 당신의 의견을 얻지 못했습니다. 내 설명이 잘못 되었습니까?
Dinaiz

1
나는 단지 가상의 농담을하고 있었다. 나는 그것으로 아무것도 의미하지 않았습니다.
Francis Cugler

6

알고리즘이나 코드를 작성할 때마다 점근 적 복잡성을 분석하려고합니다. 시간 복잡성 과는 다릅니다 .

점근 적 복잡성은 알고리즘의 실행 시간의 동작이며 시간 복잡성은 실제 실행 시간입니다. 그러나 어떤 사람들은이 용어들을 서로 바꿔서 사용합니다.

시간 복잡도는 다양한 매개 변수 즉, z에 따라 달라집니다.
1. 물리적 시스템
2. 프로그래밍 언어
3. 코딩 스타일
4. 그리고 훨씬 더 ......

실제 실행 시간은 분석을위한 좋은 척도가 아닙니다.


대신 코드가 무엇이든 입력이 동일하기 때문에 입력 크기를 매개 변수로 사용합니다. 따라서 실행 시간은 입력 크기의 함수입니다.

다음은 선형 시간 알고리즘의 예입니다.


선형 검색
n 개의 입력 요소가 주어지면 배열에서 요소를 검색하려면 최대 'n'비교 가 필요합니다 . 다시 말해서, 어떤 프로그래밍 언어를 사용하든, 어떤 코딩 스타일을 사용하든, 어떤 시스템을 실행하는지에 관계없이. 최악의 경우 n 개의 비교 만 필요하며 실행 시간은 입력 크기에 비례합니다.

그리고 검색 (검색)뿐만 아니라 작업 (증가, 비교 또는 모든 작업)이 입력 크기의 기능 일 수 있습니다.

따라서 어떤 알고리즘이 O (log n)라고 말하면 실행 시간이 로그에 입력 크기 n을 곱한 것을 의미합니다.

입력 크기가 커질수록 완료된 작업 (여기서 실행 시간)이 증가합니다.

      n      Work
      2     1 units of work
      4     2 units of work
      8     3 units of work

입력 크기가 증가한 경우 수행되는 작업이 증가하며 기계와 무관합니다. 작업 단위의 값을 찾으려면 실제로 위의 지정된 매개 변수에 따라 달라지며 시스템 및 모두에 따라 변경됩니다.


5

나무

log x to base b = y 의 반대이다 b^y = x

깊이 d와 크기 n의 Mary 트리가있는 경우 :

  • 전체 트리를 순회 ~ O (M ^ d) = O (n)

  • 나무에서 단일 경로를 걷는 ~ O (d) = O (log n to base M)


5

정보 기술에서 이는 다음을 의미합니다.

  f(n)=O(g(n)) If there is suitable constant C and N0 independent on N, 
  such that
  for all N>N0  "C*g(n) > f(n) > 0" is true.

개미이 표기법은 대부분 수학에서 가져온 것 같습니다.

이 기사에는 다음과 같은 인용문이있다 : DE Knuth, "BIG OMICRON AND BIG OMEGA AND BIG THETA", 1976 :

여기서 논의 된 문제들에 기초하여, 나는 더 나은 대안을 합리적으로 찾을 수 없다면 SIGACT 회원들과 컴퓨터 과학 및 수학 저널 편집자들은 위에 정의 된 표기법을 채택 할 것을 제안한다 .

오늘은 2016 년이지만 오늘도 계속 사용합니다.


수학적 분석에서 다음을 의미합니다.

  lim (f(n)/g(n))=Constant; where n goes to +infinity

그러나 수학적 분석에서도이 기호는 "C * g (n)> f (n)> 0"을 의미하는 데 사용되었습니다.

내가 대학에서 알고 있듯이 독일 수학자 랜도 (1877-1938)에 의해 상징이 만들어졌습니다.


3

검색은 다음과 같으므로 전체 이진 예제는 O (ln n)입니다.

1 2 3 4 5 6 7 8 9 10 11 12

4를 검색하면 3, 6, 3, 4가 표시됩니다. log2 12 = 3은 필요한 위치에 몇 개의 적중이 있는지에 대한 좋은 결과입니다.


예를 들어 주셔서 감사합니다. 우리 알고리즘이 어떻게 대수 및 정복 방법으로 로그 시간을 사용할 수 있는지 명확하게 알려줍니다.
Abc

그렇다면 n / 2의 루프가 항상 log (n)입니까?
Gil Beyruth

3

직관 기반의 대답을 찾고 있다면 두 가지 해석을하고 싶습니다.

  1. 매우 넓은 기초가있는 매우 높은 언덕을 상상해보십시오. 언덕 꼭대기에 도달하려면 두 가지 방법이 있습니다. 하나는 언덕을 따라 나선형으로 진행하는 전용 통로이고 다른 하나는 계단을 제공하기 위해 조각 같은 작은 테라스입니다. 이제 첫 번째 방법이 선형 시간 O (n)에 도달하면 두 번째 방법은 O (log n)입니다.

  2. 정수 n를 입력으로 받아들이고 시간에 비례하여 완료 되는 알고리즘 n은 O (n) 또는 theta (n)이지만 시간에 비례하여 number of digits or the number of bits in the binary representation on number실행되면 알고리즘은 O (log n) 또는 theta 에서 실행된다고 상상해보십시오. (log n) 시간.


편집하십시오. 두 시나리오 모두에 "O (n) 또는 theta (n)"이 있습니까? 또한 크기 대 # 자릿수를 많이 들었습니다. n = 10000000의 경우 size === 128이고 n = 10000000의 경우 숫자 === 8입니까? 설명해주세요.
코디

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