O (1), O (n log n) 및 O (log n) 복잡도를 갖는 알고리즘의 예


114

O (1), O (n log n) 및 O (log n) 복잡성을 가진 우리가 매일 사용하는 알고리즘은 무엇입니까?


6
왜 위키인가? 설문 조사도 주관 적이지도 않습니다. 그녀는 big-O 속성의 구체적인 예를 원합니다.
paxdiablo

4
하나의 정답이 없기 때문에 위키에는 여러 개의 답변이 있습니다.
Jason S

2
Wikipedia에도 좋은 목록이 있습니다. en.wikipedia.org/wiki/Time_complexity
Homer6

답변:


234

질문에 주어진 시간 복잡성을 가진 알고리즘 / 문 그룹의 예를 원한다면 여기에 작은 목록이 있습니다.

O(1) 시각

  • 배열 인덱스 액세스 (int a = ARR [5];)
  • 링크 된 목록에 노드 삽입
  • 스택에 푸시 및 팝
  • 대기열에서 삽입 및 제거
  • Array에 저장된 트리에서 노드의 부모 또는 왼쪽 / 오른쪽 자식 찾기
  • 이중 연결 목록에서 다음 / 이전 요소로 이동

O(n) 시각

요컨대, 모든 Brute Force 알고리즘 또는 선형성을 요구하는 Noob 알고리즘은 O (n) 시간 복잡성을 기반으로합니다.

  • 배열 탐색
  • 연결 목록 탐색
  • 선형 검색
  • 연결 목록에서 특정 요소 삭제 (정렬되지 않음)
  • 두 문자열 비교
  • 회문 확인
  • 계산 / 버킷 정렬 및 여기에서도 이러한 예를 수백만 개 더 찾을 수 있습니다 ....

O(log n) 시각

  • 이진 검색
  • 이진 검색 트리에서 가장 큰 / 가장 작은 숫자 찾기
  • 선형 기능을 기반으로하는 특정 분할 및 정복 알고리즘
  • 피보나치 수 계산-최상의 방법 여기의 기본 전제는 완전한 데이터를 사용하지 않고 매 반복마다 문제 크기를 줄이는 것입니다.

O(n log n) 시각

'log n'의 인수는 Divide와 Conquer를 고려하여 도입되었습니다. 이러한 알고리즘 중 일부는 가장 최적화 된 알고리즘이며 자주 사용됩니다.

  • 병합 정렬
  • 힙 정렬
  • 빠른 정렬
  • O (n ^ 2) 알고리즘 최적화를 기반으로 한 특정 분할 및 정복 알고리즘

O(n^2) 시각

이러한 것들은 O (nlogn) 대응 물이있는 경우 덜 효율적인 알고리즘으로 간주됩니다. 일반적인 응용 프로그램은 여기에서 Brute Force 일 수 있습니다.

  • 버블 정렬
  • 삽입 정렬
  • 선택 정렬
  • 간단한 2D 배열 탐색

5
n !? 나는 어떤 일반적인 알고리즘이 n!을 사용하는지 궁금합니다.
Y_Y 2014 년

HashMap 및 이중 링크 목록을 사용하여 O (1)를 달성하거나 PUSH / POP / MIN 기능을 사용하여 스택을 구현하는 LRU 구현과 같은 더 복잡한 알고리즘뿐만 아니라 HashMap 값에 액세스합니다. 또한 Fibonacci의 재귀 구현은 N!에 속합니다.
ruralcoder 2014 년

11
내 OCD는 목록이 가장 좋은 것에서 가장 나쁜 것 순으로 나열되도록 목록을 목록 O(log n)앞에 O(n)놓으라고합니다. haha :)
Sam Eaton

4
2D 배열을 순회하는 것은 정사각형 행렬이 아닌 한 실제로 O (nxm)입니다.
Simon Peck 2015 년

1
'여행하는 세일즈맨'문제는 n! (n 계승)뿐만 아니라
Ju66ernaut dec.

28

의 간단한 예는 O(1)수 있습니다 return 23;- 어떤 입력이 고정, 유한 한 시간에 돌아갑니다.

의 전형적인 예 O(N log N)는 좋은 알고리즘 (예 : mergesort)으로 입력 배열을 정렬하는 것입니다.

O(log N)이분법으로 정렬 된 입력 배열에서 값을 찾는 것이 전형적인 예 입니다.


28

O (1)-대부분의 요리 절차는 O (1)입니다. 즉, 요리 할 사람이 더 많아도 일정한 시간이 걸립니다 (냄비 / 팬의 공간이 부족할 수 있기 때문에 어느 정도 시간이 걸립니다). 요리를 나누어야합니다)

O (logn)-전화 번호부에서 무언가를 찾습니다. 이진 검색을 생각하십시오.

O (n)-책 읽기. 여기서 n은 페이지 수입니다. 책을 읽는 데 걸리는 최소 시간입니다.

O (nlogn)-병합 또는 빠른 정렬을 수행하여 카드를 정렬하지 않는 한 nlogn 인 매일 할 수있는 일을 즉시 생각할 수 없습니다!


2
미니 로스트보다 로스트를 요리하는 데 더 오래 걸립니다 :-)
paxdiablo

4
그러나 오븐이 들어갈만큼 충분히 크다면 일반적으로 미니 로스트 2 개와 미니 로스트 1 개를 요리하는 데 같은 시간이 걸립니다!
Chii

1
매우 통찰력! 내가 이름 목록에서 전화 또는 주소록을 컴파일하는 작업을 가정 / 숫자 O 수 있습니다 (N N 로그)
squashed.bugaboo

10

몇 가지 일반적인 알고리즘을 제공 할 수 있습니다.

  • O (1) : 배열의 요소에 액세스 (예 : int i = a [9])
  • O (n log n) : 빠른 또는 병합 정렬 (평균)
  • O (log n) : 이진 검색

이것은 숙제 / 면접 질문처럼 들리기 때문에 직감 응답이 될 것입니다. 좀 더 구체적인 것을 찾고 있다면 대중은 일반적으로 인기있는 애플리케이션의 기본 구현 (물론 오픈 소스 절약)을 알지 못하며 일반적으로 개념이 "애플리케이션"에 적용되지 않기 때문에 조금 더 어렵습니다.


4

O (1) : 체스에서 최고의 다음 행마를 찾는다 (또는 그 문제를 위해 이동). 게임 상태의 수가 한정되어 있으므로 O (1)입니다. :-)


5
예, 일반적으로 시간을 공간과 교환 할 수 있습니다. 실제로 3 ^ 9 상태 만 있기 때문에 틱택 토 게임에서이 작업을 수행했습니다 (지능적으로 회전을 처리하는 경우에는 적음). 그러나 체스에는 다소 많은 수의 상태가 있습니다. :-)
paxdiablo

1
문제는 내가에만 사는 것입니다 O(1)나노초, 당신은 확실히 알 O(1)이 먼저 생길 것입니다 ...
zardav

3

소프트웨어 애플리케이션의 복잡성은 측정되지 않으며 big-O 표기법으로 작성되지 않습니다. 알고리즘 복잡성을 측정하고 동일한 도메인의 알고리즘을 비교하는 데만 유용합니다. 대부분의 경우 O (n)이라고하면 "O (n) 비교 "또는 "O (n) 산술 연산"이라는 의미입니다. 즉, 알고리즘 또는 응용 프로그램 쌍을 비교할 수 없습니다.


1
그것은 사실이 아닙니다. 알고리즘이 O (N) 시간 복잡도를 갖는 경우, 이는 런타임이 일부 상수 k에 대해 k * N 단계로 제한됨을 의미합니다. "단계"가 CPU 사이클, 어셈블리 명령 또는 (간단한) C 작업인지 여부는 실제로 중요하지 않습니다. 그 세부 사항은 상수 k에 의해 숨겨집니다.
Igor ostrovsky

많은 실제 사례에서 O (logN) 알고리즘의 "c"가 단순한 O (N) 알고리즘보다 더 나쁘다는 것은 말할 것도 없습니다.
Zed

하하, 네, 그리고 N은 튜링 머신 테이프의 입력 길이를 의미합니다. 수직 분할 형태를 구현하는 데 기하 급수적 인 시간이 걸립니다. :-) 각 도메인에는 자체 요구 사항과 자체 추상화 구역이 있습니다.
P Shved 2010 년

3

O (1)-이중 연결 목록에서 요소 삭제. 예 :

typedef struct _node {
    struct _node *next;
    struct _node *prev;
    int data;
} node;


void delete(node **head, node *to_delete)
{
    .
    .
    .
}

2

목록에 다음 알고리즘을 추가 할 수 있습니다.

O(1)-숫자가 짝수인지 홀수인지 결정; HashMap 작업

O(logN) -x ^ N 계산,

O(N Log N) -가장 오래 증가하는 하위 시퀀스


1

O (n log n)는 임의의 집합을 정렬 할 수있는 속도에 대한 상한으로 유명합니다 (고 병렬 컴퓨팅 모델이 아니라 표준이라고 가정).


0

0 (logn)-바이너리 검색, 배열의 피크 요소 (하나 이상의 피크가있을 수 있음) 0 (1)-파이썬에서 목록 또는 문자열의 길이를 계산합니다. len () 함수는 0 (1) 시간이 걸립니다. 배열의 요소에 액세스하는 데는 0 (1) 시간이 걸립니다. 스택에서 푸시 작업은 0 (1) 시간이 걸립니다. 0 (nlogn)-병합 정렬. 파이썬에서 정렬하는 데는 nlogn 시간이 걸립니다. 따라서 listname.sort ()를 사용하면 nlogn 시간이 걸립니다.

참고-해시 테이블에서 검색하는 것은 충돌로 인해 일정한 시간보다 더 오래 걸리는 경우가 있습니다.


0

O ( 2N )

O (2 N )는 입력 데이터 세트에 추가 할 때마다 두 배로 증가하는 알고리즘을 나타냅니다. O (2 N ) 함수 의 성장 곡선 은 기하 급수적입니다. 매우 얕은 것에서 시작하여 급격히 상승합니다. O (2 N ) 함수 의 예는 피보나치 수의 재귀 계산입니다.

int Fibonacci (int number)
{
if (number <= 1) return number;
return Fibonacci(number - 2) + Fibonacci(number - 1);
}

Tower of Hanoi더 좋은 예가되었을 것입니다.
인 Ashish Duklan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.