[알고리즘] Big O Of Arrays and Objects


1. 배열과 오브젝트 성능 평가

Javascript에서 objects의 keys-values쌍은 index가 따로 없기 때문에 삽입, 제거, 탐색, 접근 등의 작업에 드는 시간이 arrays와 다르다.

  • objects의 keys-values는 index(순서)가 없기 때문에 상수시간 O(1)이 걸린다
  • 하지만 value를 찾을때는 모든 keys를 확인해야해서 선형 시간 O(n)이 걸린다

1) 객체(Objects)

  • 객체는 순서가 없지만 key와 value을 사용해 빠르다는 장점이 있다.
  • Big O로 보는 성능은 다음과 같다.
    • 삽입(Insertion) ⇒ O(1)
    • 삭제(Removal) ⇒ O(1)
    • 검색(Searching) ⇒ O(N)
    • 접근(Access) ⇒ O(1)


2) 객체 순회

Object.keys()

  • 객체의 키 목록을 배열로 리턴한다.
  • 객체 내장 메서드가 아니고, 객체 생성자인 Object 가 직접 가지고 있는 메서드.
let instructor = {
	firstName:"Abel",
	isInstructor:true,
	favoriteNumbers: [1,2,3,4]
}

console.log(Object.keys(instructor));

[Running] node "/workspaces/codespaces-blank/ObjectBigO.js"
[ 'firstName', 'isInstructor', 'favoriteNumbers' ]

[Done] exited with code=0 in 0.03 seconds

Object.entries()

  • value 값을 배열로 반환하는 Object.values() 와 객체의 key, value 값을 배열로 반환
//시간복잡도가 훨씬 낮음

let instructor = {
    firstName:"Abel",
    isInstructor:true,
    favoriteNumbers: [1,2,3,4]
}

console.log(Object.entries(instructor));

[Running] node "/workspaces/codespaces-blank/ObjectBigO.js"
[
  [ 'firstName', 'Abel' ],
  [ 'isInstructor', true ],
  [ 'favoriteNumbers', [ 1, 2, 3, 4 ] ]
]

[Done] exited with code=0 in 0.038 seconds


3) 배열(Array)

  • 순서가 정해져 있어 객체보다 시간이 좀 더 오래 걸림.
  • 정렬될 필요가 있는 데이터, 정렬되어 있는 데이터를 보관하는데 유리함
  • 배열 시작에서 작업을 하는것이 끝에서 하는것보다 더 느리다

  • 삽입 ⇒ 배열 시작 : O(N), 배열 끝: O(1)
  • 삭제 ⇒ 배열 시작 : O(N), 배열 끝: O(1)
  • 검색 ⇒ O(N)
  • 탐색 ⇒ O(N)

Big O Notation

pushO(1)
popO(1)
shiftO(n)
unshiftO(N)
concatO(N)
sliceO(N)
spliceO(N)
sortO(N * ㏒N)
고차함수(forEach/map/filter/reduce)O(N)
  • pop, push은 인덱스를 사용해서 접근하는 것과 똑같고 상수 시간걸림 빠름
  • 배열의 기본적인 연산, 메소드들은 보통 O(N).


2. 정리

  • 객체는 거의 모든것을 더 빠르게 하지만 , 정렬되어 있지 않다
  • 배열은 정렬 되어 있지만 ,끝에 추가하고 제거하는 작업이 느림 , 시작에 넣거나 빼면 처음부터 끝까지 영향 받고 Index를 다시 정리해야함