모르면 배우면 된다

알고리즘-배열과 객체의 시간 본문

알고리즘

알고리즘-배열과 객체의 시간

Okguri 2022. 5. 30. 20:50
const object ={
	name : 'kelly',
	age : 10,
};

객체의 탐색시간은.. 짧다!

  • 접근, 입력, 수정, 삭제에 걸리는 시간이 O(1)이다. 매우 빠르다는 뜻.
  • 정렬이 돼있지 않다. 어디에 새로운 객체를 넣든지 상관 없다. 정렬 없이 key로만 접근하기 때문에 속도가 빠르다.
  • ex) console.log(object.name);
  • 단, 객체 내장 메소드 중 일부는 O(n)의 시간을 가진다(선형 시간). 프로퍼티 개수가 많아질수록 각 프로퍼티에 접근해 배열에 각각 추가해줘야 하는 시간이 늘어나기 때문이다. Object.keys(object) : 객체의 key를 배열로 반환하는 함수. [’name’, ‘age’] Object.values(object) : 객체의 value를 배열로 반환하는 함수. [’kelly’, 10] Obejct.enteries(obejct) : 객체의 key와 value를 한 쌍의 배열로 만들어 반환 [[’name’,’kelly’],[’age’:10]]
  • 한편, Object.hasOwnProperty(’name’) : 객체에 name이라는 key가 있는지 확인하고 true or false를 반환하는 함수. key로 접근하기 때문에 O(1)을 가진다.

배열의 탐색 시간은 길다!

const array = ['a', 'b', 'c'];
  • 정렬돼 있는 데이터를 다룰 때 배열은 유용하지만 성능은 좀 포기해야.
  • 요소 접근(array[1]) : 배열 뒷쪽에 추가(array.push(’d’))는 O(1)
  • 어떤 요소에 접근하든, 속도는 같다. 흔히들 착각하는 게 길이 1000 배열의 990번째 요소에 접근한다고 하면 처음부터 탐색해가는 걸로 착각하는데, 각각의 인덱스마다 지름길이 있다고 생각하면 된다. 접근 자체는 빠름.
  • 배열 앞쪽에 원소를 추가/제거하면 O(n)만큼의 시간이 걸린다. 뒷쪽의 index를 모두 바꿔줘야 하기 때문이다. 따라서 배열 앞에 추가하고 제거하는 건 최대한 피하는 게 좋다. shift, unshift보다 push, pop의 속도가 빠르다.
  • 배열의 내장 메소드 속도 : 대부분 O(n). push와 pop O(1) 빼고.
  • forEach, map, filter, reduce, slice, splice 등등 : O(n)
  • Array.sort(array) : O(n * log n). 요소들을 한 번만 보는 게 아니라, 여러 번 보면서 비교하느라 시간이 더 오래 걸림.

객체 : 노정렬, 빠름

배열 : 예스정렬, 마지막에 요소추가 하는 게 빠름