배열과 오브젝트의 성능 평가 - 알고리즘2

Junho Yun·2022년 11월 10일
0

알고리즘

목록 보기
2/18
post-thumbnail

빅오의 시점에서 오브젝트와 배열의 작동

객체(objects)의 빅오

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

객체란 정렬되어 있지 않은 데이터 구조이며, 키와 값(벨류)로 구성되어 있습니다.

언제 objects를 사용할까요?

  • 정렬이 필요 없을때
  • 빠른 접근 및 입력 제거가 필요할 때

빠른 접근 입력 제거 -> O(1) 상수의 빅오를 따른다는 것이죠 (순서가 상관 없으니까요)

검색의 경우에는 O(n)의 성능을 가집니다. 검색이라는 것은 어떤 특정한 정보가 특정한 값에 있는 지 확인하는 것을 말합니다. 저장되 있는 모든 key를 확인한다고 생각하면 될 것 같습니다.

object Methods 의 빅오를 확인해보겠습니다.

  • object.keys -> O(n)
  • object.values -> O(n)
  • object.entries -> O(n)
  • hasOwnProperty -> O(1)

hasOwnProperty는 왜 상수일까요? firstName이라는 키가 있고 그 키에 접근하는 것은 상수시간이 필요합니다. 그리고 같은 시간안에 존재여부를 확인할 수 있는 것이죠

배열 안의 데이터에 접근이 느린 이유

let name = ["michael", "melissa", "Andrea"];

let values =[true, {}, [], 2, "awesome"];

언제 배열을 사용할까요?

  • 정렬된 데이터가 필요할 떄
  • 데이터에 빠른 접근 추가 삭제 등이 필요할 때 입니다. (예외 존재)

접근이라는 것에 대한 오해 : 1000개의 엘리먼트가 있을 때 900번째 엘리먼트에 접근하는 것은 0~899를 거치고 접근하는 것이 아닙니다. 바로 900번째에 접근하는 것이죠.

입력과 삭제의 경우 조금 다릅니다. 어디에 입력(혹은 삭제)함에 따라 다른 결과가 발생할 수 있습니다 (빅오 관점)

  • 배열 앞에 추가하는 경우 뒤에 엘리먼트들의 순서가 다 바뀌죠? -> O(n)
  • 배열 맨뒤에 추가를 하는 것은 앞의 엘리먼트에 영향을 주지 않기 때문에
    -> O(n)

빅오 배열 메소드 (암기 X)

  • push = O(1)
  • pop = O(1)
  • shift = O(N)
  • unshift = O(N)
  • concat = O(N) // 여러 배열을 합쳐줍니다.
  • slice = O(N) // 배열의 일부를 가져올 수 있습니다.
  • splice = O(n) // 엘리먼트를 제거하고 추가합니다.
  • sort = O(n*log n) / 기본 알고리즘 중 하나 입니다. 추후 설명
  • forEach/map/filter/reduce/ete. = O(n)

작동원리를 생각하면서 빅오랑 비교해봅시다.

profile
의미 없는 코드는 없다.

0개의 댓글