Dream๐Ÿฐng
article thumbnail

๐Ÿ’ [230323 TIL] JavaScript Algorithms and Data Structures Masterclass

Object & Array

Big O of object

๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์„ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ •๋ ฌํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ
  2. ๋น ๋ฅธ ์ ‘๊ทผ / ์‚ฝ์ž… / ์‚ญ์ œ๊ฐ€ ํ•„์š”ํ•  ๋•Œ

๊ฐ์ฒด์˜ Big O
ํƒ์ƒ‰ - O(N)
์‚ฝ์ž… - O(1)
์‚ญ์ œ - O(1)
์ ‘๊ทผ - O(1)

 

ํƒ์ƒ‰์ด O(N)์„ ๋”ฐ๋ฅด๋Š” ์ด์œ ๋Š” ํŠน์ •ํ•œ ์ •๋ณด๊ฐ€ ์–ด๋–ค ๊ฐ’์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

const information = {
    name: 'Shoupeach',
    isApeach: true,
    favoriteNumbers: [4, 8]
};

information์ด๋ž€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ๋•Œ ์—ฌ๊ธฐ์„œ true๋ผ๋Š” ๊ฐ’์ด information์—์„œ ์–ด๋””์— ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € name์„ ํ™•์ธํ•˜๊ณ  ๊ฐ’์„ ํ™•์ธํ•œ๋‹ค.

name์˜ ๊ฐ’์€ Shoupeach์ด๊ธฐ ๋•Œ๋ฌธ์— ํ†ต๊ณผํ•œ ๋’ค isApeach๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ’์„ ํ™•์ธํ•œ๋‹ค.

isApeach์˜ ๊ฐ’์€ true์ด๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ๋œ๋‹ค.

 

์ง€๊ธˆ์€ ๊ฐ์ฒด ์•ˆ์— key-value ์Œ์ด 3๊ฐœ ๋ฐ–์— ์—†์ง€๋งŒ, ๊ฐ์ฒด ๋‚ด๋ถ€์— ์†์„ฑ์ด ๋งŽ์„์ˆ˜๋ก (N์ด ์ปค์งˆ์ˆ˜๋ก) ํ™•์ธํ•ด์•ผ ํ•˜๋Š” key๊ฐ€ ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— O(N)์„ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

 

Big O of object methods


๊ฐ์ฒด ๋ฉ”์†Œ๋“œ์˜ Big O
hasOwnProperty - O(1)
Object.keys - O(N)
Object.values - O(N)
Object.entries - O(N)

Object.keys

Object.keys(information);
// ["name", "isApeach", "favoriteNumbers"]

Object.keys๋Š” key๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

key๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก (N์ด ์ปค์งˆ์ˆ˜๋ก) ๊ฐ key๋“ค์— ์ ‘๊ทผํ•ด์„œ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

 

Object.values

Object.values(information);
// ["Shoupeach", true, [4, 8]];

Object.values๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ N์ด ์ปค์งˆ์ˆ˜๋ก ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ์„ ํ˜•์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋ฏ€๋กœ O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

 

Object.entries(information);
// [["name", "Shoupeach"], ["isApeach", true], ["favoriteNumbers", [4, 8]]

Object.entries๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ N์ด ์ปค์งˆ์ˆ˜๋ก ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ์„ ํ˜•์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋ฏ€๋กœ O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

 

hasOwnProperty

information.hasOwnProperty("name");
// true

hasOwnProperty๋Š” ์œ„ ๋ฉ”์†Œ๋“œ๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ ‘๊ทผ์˜ ๊ฐœ๋…์ด๊ธฐ ๋•Œ๋ฌธ์— O(1)์„ ๋”ฐ๋ฅธ๋‹ค.

 

Big O of array

๋ฐฐ์—ด์€ ๊ฐ์ฒด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ์„ ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๐Ÿซ 

 

๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•  ๋•Œ
  2. ๋น ๋ฅธ ์ ‘๊ทผ์ด ํ•„์š”ํ•  ๋•Œ

๋ฐฐ์—ด์˜ Big O
์ ‘๊ทผ - O(1)
ํƒ์ƒ‰ - O(N)
์‚ฝ์ž… - ์‚ฝ์ž… ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ„
์‚ญ์ œ - ์‚ญ์ œ ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ„

JavaScript๊ฐ€ ๋ฐฐ์—ด์— ์ ‘๊ทผํ•  ๋•Œ, ์š”์†Œ๊ฐ€ 10000๊ฐœ ์žˆ๋Š” ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  arr[9000]์„ ํ˜ธ์ถœํ•˜๋ฉด 0๋ถ€ํ„ฐ 9000๊นŒ์ง€์˜ ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

9000๋ฒˆ์˜ ์ธ๋ฑ์Šค์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ์€ O(1)์„ ๋”ฐ๋ฅธ๋‹ค.

 

Insertion

const names = ["Shoupeach", "Rabbit", "Ogu"];

names ๋ฐฐ์—ด ๋์— Namazuo๋ผ๋Š” ์ด๋ฆ„์„ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด push๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค.

push๋Š” ๋ฐฐ์—ด ๋์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด key-value ์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„ O(1)์„ ๋”ฐ๋ฅธ๋‹ค.

 

Namazuo๋ฅผ ๋ฐฐ์—ด์˜ ๋งจ ์•ž์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด์— ์žˆ๋˜ ์š”์†Œ๋“ค์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋‹ฌ๋ผ์ ธ๋ฒ„๋ฆฐ๋‹ค.

๋ฐฐ์—ด์— ์žˆ๋Š” ์š”์†Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค๋ฅผ ๋ฐฐ์ •ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๋งŽ์„์ˆ˜๋ก (N์ด ์ปค์งˆ์ˆ˜๋ก) ์ž‘์—…๋Ÿ‰๋„ ๋งŽ์•„์ง„๋‹ค.

๋”ฐ๋ผ์„œ unshift๋Š” O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

 

removal

๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋„ ์‚ฝ์ž…์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™๋‹ค.

names ๋ฐฐ์—ด ๋์— ์‚ฝ์ž…ํ•œ Namazuo๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด pop์„ ํ•˜๋ฉด ๋œ๋‹ค.

pop์€ ๋์— ์ถ”๊ฐ€ํ•œ ์š”์†Œ์™€ ์ธ๋ฑ์Šค๋ฅผ ์—†์• ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(1)์„ ๋”ฐ๋ฅธ๋‹ค.

 

๋งจ ์•ž์— ์ถ”๊ฐ€ํ•œ Namazuo๋ฅผ ์—†์• ๊ฒŒ ๋˜๋ฉด unshift์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฐ์—ด์— ๋‚จ์•„์žˆ๋Š” ์š”์†Œ๋“ค์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

N์ด ์ปค์งˆ์ˆ˜๋ก ์ธ๋ฑ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…๋Ÿ‰๋„ ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— shift ๋˜ํ•œ O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

 


๋นˆ ๋ฐฐ์—ด์— push, pop / unshift, shift๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ
๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋Š”๋ฐ ๋งจ ์•ž๊ณผ ๋งจ ๋’ค์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—†์• ๋Š” ๊ฒƒ์€ ๋˜‘๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— O(1)์„ ๋”ฐ๋ฅธ๋‹ค.

 

Big O of array methods


๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ์˜ Big O

~ ์ „๋ถ€ ์•”๊ธฐํ•  ํ•„์š”๋Š” ์—†๋‹ค ๐Ÿ˜ต ~
push - O(1)
pop - O(1)
unshift - O(N)
shift - O(N)
concat - O(N)
slice - O(N)
splice - O(N)
sort - O(Nใ’N)
forEach / map / filter / reduce / etc. - O(N)

 

concat

const arr1 = ['a', 'b', 'c'];
const arr2 = ['d', 'e', 'f', 'g'];

arr1.concat(arr2);
// ["a", "b", "c", "d", "e", "f", "g"]

N๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์— M๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— O(N+M)์ธ๋ฐ ๋‹จ์ˆœํ™” ํ•˜๋ฉด ๊ฒฐ๊ตญ O(N)์ด๋‹ค.

 

slice & splice

const animals = ['rabbit', 'ogu', 'elephant', 'hippo'];

animals.slice(2);
// ["elephant", "hippo"]
animals.splice(1, 0, 'dolphin');
// ["rabbit", "dolphin", "ogu", "elephant", "hippo"]

slice๋Š” ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๋ณต์‚ฌ๋ฅผ ํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ (N์ด ์ปค์งˆ์ˆ˜๋ก) ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

splice๋Š” unshift์™€ shift์ฒ˜๋Ÿผ ๊ธฐ์กด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

 

sort

animals.sort();
// ["elephant", "hippo", "ogu", "rabbit"]

sort๋Š” ๋น„๊ต๋„ ํ•ด์•ผํ•˜๊ณ  ์š”์†Œ์˜ ์ด๋™๋„ ํ•„์š”ํ•˜๋‹ค.

์ผ๋‹จ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์€ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด O(N)๋ณด๋‹ค๋Š” ํฌ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค.

sort๋Š” O(Nใ’N)์„ ๋”ฐ๋ฅธ๋‹ค.

 

etc

๊ทธ ์™ธ ๋ฐฐ์—ด๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์†Œ๋“œ๋Š” O(N)์„ ๋”ฐ๋ฅธ๋‹ค.

๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ „๋ถ€ ์ง€๋‚˜์น˜๋ฉด์„œ ์ž‘์—…์„ ํ•  ๋•Œ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด O(N)์ธ ์ด์œ ๋ฅผ ๊ธˆ๋ฐฉ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค..๐Ÿ˜‰

'๐Ÿ“ Study > Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Algorithm] Big O Notation  (2) 2023.03.16
profile

Dream๐Ÿฐng

@shoupeach

๐Ÿฐ Happy new rabbit! ๐Ÿฐ

profile on loading

Loading...