C++

Big-O Notation

F.xavier 2014. 3. 20. 04:38

Big-O notation은 알고리즘의 복잡도나 성능을 표현하는 방식이다. 이는 절대적인 수치를 보여주는 것이 아니지만 이를 통해서 현재 작성할 프로그램의 알고리즘을 미리 살펴보고 적당한 알고리즘을 선택하는 데 도움을 준다.

  1. 특징
  • 플랫폼에 독립적이다.
  • 통계적인 기대치를 표현한다.
  • 모든 종류의 입력 데이타 크기에 대한 실행성능을 보여준다.
  • 실제 실행시간과는 차이가 있을 수가 있다.
  • 사용할 라이브러리가 얼마나 자주 실행될 지에 대한 고려를 해보아야 한다. 10:90의 법칙을 생각할 때 10의 경우에는 별로 차이가 있지 않겠지만 90의 경우의 코드에서는 심각하게 검토를 해보아 야 한다.

 

Good

Fair

Poor

Searching

Algorithm

Data Structure

Time Complexity

Space Complexity

  

Average

Worst

Worst

  

Depth First Search (DFS)

Graph of |V| vertices and |E| edges

-

O(|E| + |V|)

O(|V|)

  

Breadth First Search (BFS)

Graph of |V| vertices and |E| edges

-

O(|E| + |V|)

O(|V|)

  

Binary search

Sorted array of n elements

O(log(n))

O(log(n))

O(1)

  

Linear (Brute Force)

Array

O(n)

O(n)

O(1)

  

Shortest path by Dijkstra,
using a Min-heap as priority queue

Graph with |V| vertices and |E| edges

O((|V| + |E|) log |V|)

O((|V| + |E|) log |V|)

O(|V|)

  

Shortest path by Dijkstra,
using an unsorted array as priority queue

Graph with |V| vertices and |E| edges

O(|V|^2)

O(|V|^2)

O(|V|)

  

Shortest path by Bellman-Ford

Graph with |V| vertices and |E| edges

O(|V||E|)

O(|V||E|)

O(|V|)

  

Sorting

Algorithm

Data Structure

Time Complexity

Worst Case Auxiliary Space Complexity

  

Best

Average

Worst

Worst

  

Quicksort

Array

O(n log(n))

O(n log(n))

O(n^2)

O(n)

  

Mergesort

Array

O(n log(n))

O(n log(n))

O(n log(n))

O(n)

  

Heapsort

Array

O(n log(n))

O(n log(n))

O(n log(n))

O(1)

  

Bubble Sort

Array

O(n)

O(n^2)

O(n^2)

O(1)

  

Insertion Sort

Array

O(n)

O(n^2)

O(n^2)

O(1)

  

Select Sort

Array

O(n^2)

O(n^2)

O(n^2)

O(1)

  

Bucket Sort

Array

O(n+k)

O(n+k)

O(n^2)

O(nk)

  

Radix Sort

Array

O(nk)

O(nk)

O(nk)

O(n+k)

  

Data Structures

Data Structure

Time Complexity

Space Complexity

 

Average

Worst

Worst

 

Indexing

Search

Insertion

Deletion

Indexing

Search

Insertion

Deletion

 

Basic Array

O(1)

O(n)

-

-

O(1)

O(n)

-

-

O(n)

Dynamic Array

O(1)

O(n)

O(n)

O(n)

O(1)

O(n)

O(n)

O(n)

O(n)

Singly-Linked List

O(n)

O(n)

O(1)

O(1)

O(n)

O(n)

O(1)

O(1)

O(n)

Doubly-Linked List

O(n)

O(n)

O(1)

O(1)

O(n)

O(n)

O(1)

O(1)

O(n)

Skip List

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

O(n)

O(n)

O(n)

O(n log(n))

Hash Table

-

O(1)

O(1)

O(1)

-

O(n)

O(n)

O(n)

O(n)

Binary Search Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

O(n)

O(n)

O(n)

O(n)

Cartresian Tree

-

O(log(n))

O(log(n))

O(log(n))

-

O(n)

O(n)

O(n)

O(n)

B-Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

Red-Black Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

Splay Tree

-

O(log(n))

O(log(n))

O(log(n))

-

O(log(n))

O(log(n))

O(log(n))

O(n)

AVL Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

Heaps

Heaps

Time Complexity

 

Heapify

Find Max

Extract Max

Increase Key

Insert

Delete

Merge

 

Linked List (sorted)

-

O(1)

O(1)

O(n)

O(n)

O(1)

O(m+n)

 

Linked List (unsorted)

-

O(n)

O(n)

O(1)

O(1)

O(1)

O(1)

 

Binary Heap

O(n)

O(1)

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(m+n)

 

Binomial Heap

-

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

 

Fibonacci Heap

-

O(1)

O(log(n))*

O(1)*

O(1)

O(log(n))*

O(1)

 

Graphs

Node / Edge Management

Storage

Add Vertex

Add Edge

Remove Vertex

Remove Edge

Query

Adjacency list

O(|V|+|E|)

O(1)

O(1)

O(|V| + |E|)

O(|E|)

O(|V|)

Incidence list

O(|V|+|E|)

O(1)

O(1)

O(|E|)

O(|E|)

O(|E|)

Adjacency matrix

O(|V|^2)

O(|V|^2)

O(1)

O(|V|^2)

O(1)

O(1)

Incidence matrix

O(|V| |E|)

O(|V| |E|)

O(|V| |E|)

O(|V| |E|)

O(|V| |E|)

O(|E|)