Skip to content

crosstar1228/DS_Algorithm

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

63 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

crosstar's algorithm studies

  • ๋ณธ Repository์—๋Š” ์ทจ์—…์ค€๋น„๋ฅผ ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐœ๋… ๋ฐ ์‹ค์Šต, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ’€์ด ๋“ฑ์„ ๋‹ด์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ ๋ฐ ๋‚ด์šฉ์€ ์ง€์†์  ์—…๋ฐ์ดํŠธ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Data structure

๐Ÿ“ŒTime Complexity


big- O ํ‘œ๊ธฐ๋ฒ•

  • ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ฅธ ์—ฐ์‚ฐ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ํ‘œ๊ธฐ

O(1)

  • ๊ฐ„๋‹จํ•œ ์ธ๋ฑ์‹ฑ
function O_1_algorithm(arr, index) {
 return arr[index];
}
let arr = [1, 2, 3, 4, 5];
let index = 1;
let result = O_1_algorithm(arr, index);
console.log(result); // 2

O($$n$$)

  • ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ linearํ•˜๊ฒŒ ์ฆ๊ฐ€
  • range ๊ธธ์ด๊ฐ€ n๊ฐœ์ธ for๋ฌธ์ด ๋Œ€ํ‘œ์ 

O($$logn$$)

  • ์—…๋‹ค์šด ๊ฒŒ์ž„์„ ์ƒ๊ฐ
  • BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋Œ€ํ‘œ์ 

O($$n^2$$)

  • ์ด์ค‘ for๋ฌธ

O($$2^n$$)

  • ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ๋Œ€ํ‘œ์ (ํ”ผ๋ณด๋‚˜์ฐŒ)
function fibonacci(n) {
  if (n <= 1) {
    return 1;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
  }

์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ตฌํ•˜๋Š” ์š”๋ น

ํ•˜๋‚˜์˜ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์š”์†Œ ์ง‘ํ•ฉ์„ ๋ฐ˜๋ณต ํ•˜๋Š” ๊ฒฝ์šฐ : O (n) ์ปฌ๋ ‰์…˜์˜ ์ ˆ๋ฐ˜ ์ด์ƒ ์„ ๋ฐ˜๋ณต ํ•˜๋Š” ๊ฒฝ์šฐ : O (n / 2) -> O (n) ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์ฝœ๋ ‰์…˜์„ ๋ฐ˜๋ณต ํ•  ๊ฒฝ์šฐ : O (n + m) -> O (n) ๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒฝ์šฐ : O (nยฒ) ๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ฝœ๋ ‰์…˜์„ ๋ฐ˜๋ณต ํ•  ๊ฒฝ์šฐ : O (n * m) -> O (nยฒ) ์ปฌ๋ ‰์…˜ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ : O(n*log(n))

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„๋ณต์žก๋„ ๋น„๊ต

์ž๋ฃŒ๊ตฌ์กฐ ์‹œ๊ฐ„๋ณต์žก๋„ ๋น„๊ต

[https://blog.chulgil.me/algorithm/]

๐Ÿ“Œarray

๐Ÿ“ŒLinked List

๐Ÿ“Œqueue, stack

๐Ÿ“ŒHashing

[https://en.wikipedia.org/wiki/Hash_function]

  • key ๊ฐ’๋“ค์ด hash table์˜ ๊ฐ ๊ฐ’์— mapping ๋จ
  • ์ด๋Ÿฌํ•œ mapping์€ hash function ์— ์˜ํ•จ
  • hash table์˜ ๊ฐ ์นธ๋“ค์„ hash bucket์ด๋ผ๊ณ  ํ•จ [https://medium.com/@songjaeyoung92/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-javascript-hash-table-%EC%9D%B4%EB%9E%80-5f5345623dab]
  • ๊ฐ™์€ value(hash bucket)์— mapping๋  ๊ฒฝ์šฐ, ์ด๋ฅผ collision(์ถฉ๋Œ)์ด๋ผ๊ณ  ํ•จ. ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ bucket์„ ์—ฐ๋‹ฌ์•„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Œ

๊ตฌํ˜„ ๋ฐ ์ฝ”๋”ฉ?๐Ÿค”

  • python์˜ dictionary ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•˜๋ฉด ๊ฐ key์™€ value๊ฐ’์„ ์ƒ์ˆ˜์‹œ๊ฐ„(O(n))์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • value์˜ ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ defaultdict๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ง๊ด€์ ์ธ(์งง์€)์ฝ”๋”ฉ ๊ฐ€๋Šฅ
  • value ์–ป์„ ๋•Œ indexing[index]๋ณด๋‹ค๋Š” dict.get ๋ฉ”์†Œ๋“œ๋ฅผ ์“ฐ๋Š”๊ฒƒ์ด ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ (์˜ˆ์™ธ์ฒ˜๋ฆฌ ์šฉ์ด)

๐Ÿ“ŒTree

๐Ÿ“ŒHeap


heap ์ž๋ฃŒ๊ตฌ์กฐ

  • binary tree ๋ฅผ ๊ฐ€์ •
  • ์ตœ์†Œํž™ ๋˜๋Š” ์ตœ๋Œ€ํž™์ด ์žˆ๊ณ , ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์ตœ์†Œํž™์„ ๊ฐ€์ •ํ•˜๊ณ  ๋“  ์˜ˆ์‹œ
  • ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ log(n) ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ ํ์™€ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

Reference

  • ๊ณ ๋ ค๋Œ€ํ•™๊ต ๋‡Œ์˜์ƒ๋ถ„์„์—ฐ๊ตฌ์‹ค ๊ต์œก์ž๋ฃŒ ์ฐธ๊ณ .

minimum heap ์ž๋ฃŒ๊ตฌ์กฐ์— 5 ์‚ฝ์ž…(insert) ์‹œ root node๋กœ ๋„๋‹ฌํ•˜๋Š” ๊ณผ์ •

import heapq as hp
x=[3,2,1,4,5]
hp.heapify(x) # heap์œผ๋กœ ๋งŒ๋“ฆ
print(x)

>> [1, 2, 3, 4, 5]

hp.heappush(x,3) # item ์‚ฝ์ž…
print(x)

>> [1, 2, 3, 4, 5, 3] # binary tree์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์ถ”๊ฐ€๋จ

hp.heappop(x) # ์ตœ์†Ÿ๊ฐ’ ์‚ญ์ œ delete_min
print(x)

>> [2, 3, 3, 4, 5] 

hp.heappushpop(x,1) # item ์‚ฝ์ž… ํ›„ delete_min ์ˆ˜ํ–‰
print(x)

>> [2, 3, 3, 4, 5]  # 1์ด ์ตœ์†Œ์˜€๊ธฐ์— ๊ทธ๋‚ญ ํŠ€์–ด๋‚˜์™”์Œ

hp.heapreplace(x,1) #delete ๋จผ์ € ํ•œ๋‹ค์Œ item ์‚ฝ์ž…
print(x) 

>> [1, 3, 3, 4, 5] # 1๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค (replace)

๐Ÿ“ŒGraph


Graph๋ž€

  • $$V$$ : Vertices( or Nodes)
  • $$E$$ : edges (connect vertex and vertex)

์œ„์™€ ๊ฐ™์ด $$V, E, e_k$$์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„์™€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์€ ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋œ ํ•˜๋‚˜์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐœ๋…

  • edge๋Š” vertice์˜ ์Œ์œผ๋กœ ํ‘œํ˜„๋จ (a,b)
  • edge๋Š” ๋ฐฉํ–ฅ ๋˜๋Š” weight๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
  • degree ๋Š” vertice์— ๊ฐœ์ž…๋œ edge์˜ ์ˆ˜๋ฅผ ํ‘œํ˜„
    • loop : ๊ฐ™์€ vertice์— ์—ฐ๊ฒฐ๋œ edge

Adjacency Matrix( ์ธ์ ‘ํ–‰๋ ฌ)

  • ๊ทธ๋ž˜ํ”„๊ฐ„ edge๊ด€๊ณ„๋ฅผ ํ–‰๋ ฌ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ
  • ๋ฐฉํ–ฅ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๋Œ€์นญํ–‰๋ ฌ์˜ ๊ผด์„ ๋ณด์ž„

Graph Traversal(Search)

Breadth-first Search

  • ๋„ˆ๋น„์šฐ์„  ํƒ์ƒ‰
  • queue์˜ ์ž๋ฃŒ๊ตฌ์กฐ ํ™œ์šฉ
    • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์„ ์ฐจ๋ก€๋กœ ์ €์žฅํ•œ ํ›„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ธ ํ(Queue)๋ฅผ ์‚ฌ์šฉํ•จ
    • ์ฆ‰ ์„ ์ž…์„ ์ถœ(FIFO) ์›์น™์œผ๋กœ ํƒ์ƒ‰
  • ์ตœ๋‹จ๊ฒฝ๋กœ ๋ฌธ์ œ์— ์ ํ•ฉ

Depth-first Search

  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
  • stack ์ž๋ฃŒ๊ตฌ์กฐ ๋˜๋Š” Recursive algorithm์œผ๋กœ ๊ตฌํ˜„
  • ๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด๋‘ฌ์•ผ ํ•˜๋Š” ๋ฌธ์ œ์— ์ ํ•ฉ

๊ธฐํƒ€

  • ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์š”ํ•œ ๋ฌธ์ œ๋ผ๋ฉด ์–ด๋А ๊ฒƒ์„ ์“ฐ๋“  ๋…ธ์ƒ๊ด€
  • ๊ฒ€์ƒ‰ ๋Œ€์ƒ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ •๋ง ํฌ๋‹ค๋ฉด DFS๋ฅผ ๊ณ ๋ ค
  • ๊ฒ€์ƒ‰๋Œ€์ƒ์˜ ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š๊ณ , ๊ฒ€์ƒ‰ ์‹œ์ž‘ ์ง€์ ์œผ๋กœ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ๋Œ€์ƒ์ด ๋ณ„๋กœ ๋ฉ€์ง€ ์•Š๋‹ค๋ฉด BFS

๐Ÿ“ŒSorting

  1. sorting1 - bubble sort, selection sort, insertion sort (๊ฐœ๋… ๋ฐpython ์‹ค์Šต)
  2. sorting2 - mergesort, quicksort, heapsort (๊ฐœ๋… ๋ฐ python ์‹ค์Šต)
  3. sorting3 - counting, radix, topological
  • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„๋ณต์žก๋„ ๋น„๊ต

Algorithm๐Ÿ’ช

๐Ÿ“Œrecursive algorithm

๐Ÿ“Œdynamic programming


์œ ๋…ํ•  ์ ๐Ÿ˜Ž ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋ ค๋ฉด ๋งจ ์ฒ˜์Œ์—๋Š” ์ตœ๋Œ€ ๊ฐ’์„ ๊ณจ๋ผ์„œ ์„ค์ •ํ•ด์ฃผ๊ณ  ๋น„๊ตํ•ด๋‚˜๊ฐ€๋ฉด์„œ ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด ์ข‹๋‹ค. dp ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •์˜ํ•  ๋•Œ index ๊ฐ’์— ๋งคํ•‘๋˜๋Š” ๊ทธ ๊ฐ’๋ถ€ํ„ฐ ์ œ๋Œ€๋กœ ์ •์˜ํ•˜๋Š”๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜๋ฉด ๋ฌธ์ œ์˜ ์‹ค๋งˆ๋ฆฌ๊ฐ€ ๋ณด์ธ๋‹ค.

Recursive Algorithm์˜ ๋ฌธ์ œ์ ๐Ÿ‘…

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค
  • ๋™์ผํ•œ parameter๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ค‘๋ณต๋˜์–ด ๋น„ํšจ์œจ์ 

DP ๐Ÿ’กideation

  • ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘๊ณ  ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๊ฐ€๋ฉด ์–ด๋–จ๊นŒ?

2๋ฅผ 8๋ฒˆ ๋”ํ•˜๋ฉด 16์ด๋‹ค. -> 2๋ฅผ 9๋ฒˆ ๋”ํ•  ๋•Œ๋Š” ๋‹ค์‹œ ๋”ํ•˜์ง€ ๋ง๊ณ  2๋ฅผ 8๋ฒˆ ๋”ํ•œ ๊ฒƒ์— 2๋ฅผ ๋”ํ•˜๋ฉด ๋ผ!

memoization

[https://hyunlee103.tistory.com/73]

  • Recursion : top-down์œผ๋กœ task์˜ ๋งจ ์œ„๋ถ€ํ„ฐ ํ˜ธ์ถœ
  • DP : sub instance์ธ F(0)๋ถ€ํ„ฐ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ memoization์— ์ €์žฅ (bottom-up)

์œ„ ๊ทธ๋ฆผ์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด ๋ด…์‹œ๋‹ค.

Recursive๋กœ ๊ตฌํ˜„

#recursive
def fibonacci(x):
  if x==0:
    return 0
  if x==1:
    return 1
  return fibonacci(x-1)+fibonacci(x-2)
  
  
fibonacci(8)

>>> 21

DP๋กœ ๊ตฌํ˜„

#dp
def fibonacci_dp(x):
  dic = {}
  dic[0] = 0
  dic[1] = 1
  for itr in range(2, x+1):
    dic[itr] = dic[itr-2] + dic[itr-1]
  return dic[x]


fibonacci_dp(8)

>>> 21

๐Ÿง์ •๋ฆฌ

  • dp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด recursion๊ณผ ๋‹ฌ๋ฆฌ ๋งค 0,1 ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๊ทธ ๋‹ค์Œ ์Šคํ… ๊ฐ’์„ ๊ณ„์† ์ €์žฅํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ๋Š” memoization table๋กœ dictionary ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

๐Ÿ“Œgreedy

  • ๋‹จ๊ณ„๋ณ„๋กœ ํ˜„ ์ƒํ™ฉ์—์„œ์˜ ์ตœ์ ํ•ด๋ฅผ ์„ ํƒ.

์–ธ์ œ ์ ์šฉํ•ด์•ผ ํ•˜๋‚˜?

  • ์ตœ์ข…ํ•ด์˜ ์ตœ์ ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํ™•์‹ ์ด ์žˆ์–ด์•ผ ํ•จ.

๐Ÿ“ŒBFS, DFS

  • ๊ณตํ†ต์ ์œผ๋กœ ๊ฒฝ๋กœ ์ฐพ๊ธฐ ๋ฌธ์ œ์— ์ ํ•ฉ.
  • BFS : queue๋กœ ๊ตฌํ˜„
    • ์ตœ๋‹จ๊ฒฝ๋กœ์— ์ ํ•ฉ
  • DFS : ์žฌ๊ท€๋‚˜ stack์œผ๋กœ ๊ตฌํ˜„
    • ๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด๋‘˜ ๋•Œ ์ ํ•ฉ

About

crosstar's algorithm studies

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jupyter Notebook 99.5%
  • Python 0.5%