λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
SW사관학ꡐ μ •κΈ€/κ°œλ°œμΌμ§€ - TIL

[Week02] μ•Œκ³ λ¦¬μ¦˜ - 큐 (feat. python)

by young-ji 2022. 4. 14.
λͺ¨λ“ˆ

: ν•¨μˆ˜,λ³€μˆ˜ λ˜λŠ” ν΄λž˜μŠ€λ“€μ„ λͺ¨μ•„놓은 파일 - 파일λͺ…이 λͺ¨λ“ˆλͺ…이 λœλ‹€. 

 

 if __name__ == "__main__" 의 의미

πŸ‘‰ python은 cλ‚˜ java와 λ‹€λ₯΄κ²Œ 슀크립트 기반 인터프리터 μ–Έμ–΄λ‘œ νŠΉλ³„νžˆ μ‹œμž‘ 지점이 λͺ…μ‹œκ°€ λ˜μ–΄μžˆμ§€ μ•Šμ€ 언어이닀. 

κ·Έλž˜μ„œ νŠΉλ³„νžˆ λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜μ—¬ ν˜„μž¬ 슀트립트의 μ‹œμž‘μ μ΄ 어디인지 νŒλ‹¨ν•˜λŠ”λ° κ·Έ λ³€μˆ˜λ‘œμ„œ μ΄μš©ν•˜λŠ” 것이 __name__ 이닀. 

 

 νŒŒμΌ μ‹€ν–‰μ‹œμ—λŠ” __name__ λ³€μˆ˜μ— "__main__"을 μ €μž₯ν•˜κ²Œ λ˜μ§€λ§Œ ν•΄λ‹Ή λͺ¨λ“ˆμ΄ import 될 경우 λ³€μˆ˜μ— "λͺ¨λ“ˆλͺ…"이 λ“€μ–΄κ°€κΈ°λ•Œλ¬Έμ—

if __name__ == "__main__" 문은 μ‹€ν–‰λ˜μ§€μ•ŠλŠ”λ‹€. 

 

__init__의 의미

πŸ‘‰ μƒμ„±μžμ˜ 의미 ( μ—¬κΈ°μ„œ selfλŠ” μΈμŠ€ν„΄μŠ€ μžμ‹ , λ©”μ†Œλ“œμ˜ μž„μ˜μ˜ 인수 μ •λ„μ˜ 의미λ₯Ό 가진닀. )

class의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν• λ•Œ μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•œ ν•¨μˆ˜. μΈμŠ€ν„΄μŠ€ν™”λ₯Ό μ‹€μ‹œν• λ–„ λ°˜λ“œμ‹œ μ²˜μŒμ— ν˜ΈμΆœλ˜λŠ” νŠΉμˆ˜ν•œ ν•¨μˆ˜μ΄λ‹€. 

 

class test:
	def __init__(self,x) :
		self.x = x
    
	def test_function(self) : #λ©”μ†Œλ“œ
		perint(self.x)

 

ADT 좔상적 μžλ£Œν˜•

: 물리적으둜 μ‘΄μž¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μΌμ’…μ˜ κ·œμΉ™, λ°°μ—΄μœ„μ— μ–΄λ–€ κ·œμΉ™μ„ 섀정할지 μ •ν•˜λŠ” 것

  • μŠ€νƒ stack : μ„ μž…ν›„μΆœ
  • 큐 queque : μ„ μž…μ„ μΆœ

 

μŠ€νƒ

  • νŒŒμ΄μ¬μ€ λ”°λ‘œ μŠ€νƒ λͺ¨λ“ˆμ΄ μ‘΄μž¬ν•˜μ§€μ•ŠλŠ”λ‹€. 보톡 덱(deque) 라이브러리λ₯Ό importν•΄μ„œ μŠ€νƒ λŒ€μ‹  μ‚¬μš©κ°€λŠ₯ν•œλ‹€.
  • 리슀트 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ μŠ€νƒμ„ μ‚¬μš©ν• μˆ˜μžˆλ‹€. 

큐

큐 λ™μž‘ 

enqueue / dequeue

 

큐 리슀트 κ΅¬ν˜„ν•˜κΈ°

  1. 리슀트λ₯Ό 큐 λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄ headλ³€μˆ˜μ™€ tail λ³€μˆ˜μ— index정보λ₯Ό λ‹΄λŠ”λ‹€. 
  2. 데이터λ₯Ό μΆ”μΆœν•˜λ©΄(dequeue) 데이터가 λ‹Ήκ²¨μ§€λŠ” 것이 μ•„λ‹ˆλΌ head λ³€μˆ˜κ°€ λ’€λ‘œ λ„˜μ–΄κ°„λ‹€. 
  3. 좔가와 μΆ”μΆœμ„ λ°˜λ³΅ν•˜λ‹€ 보면 head와 tail이 λ’€λ‘œ λ°€λ € λ¦¬μŠ€νŠΈκ°€ 가득 μ°¨ μ•žμͺ½μ— λΉˆκ³΅κ°„(μ“°λ ˆκΈ° κ°’)이 λ§Žμ€λ°λ„ 더 이상 데이터λ₯Ό 넣을 수 μ—†κ²Œ λœλ‹€. 
  4. 그것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ›ν˜• 리슀트λ₯Ό μ΄μš©ν•œλ‹€.
  5. 물리적이 μ•„λ‹Œ 관념적 μ›ν˜• list이며 리슀트 indexκ°€ λ§ˆμ§€λ§‰ index에 1이 더해지면 λ‹€μ‹œ 0λ²ˆμ§€λ‘œ λŒμ•„μ˜€λ„λ‘ μ μœ ν•œλ‹€. - 점점 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©° ν™•μž₯ (deque의 .rotate()ν•¨μˆ˜ μ‚¬μš© κ°€λŠ₯)

μ›ν˜• νλŠ” μ•Œκ³ λ¦¬μ¦˜ 뿐 μ•„λ‹ˆλΌ μ‹€λ¬΄μ—μ„œ 많이 μ‚¬μš©λ˜λŠ” 데이터 ꡬ쑰이닀. 

μ›ν˜• 큐의 νŠΉμ§•μ€ λ§₯μ‹œλ©ˆ μ‚¬μ΄μ¦ˆκ°€ 있기 λ•Œλ¬Έμ— μ˜€λ²„ν”Œλ‘œμ–΄κ°€ 생길 수 μžˆλ‹€. 

 

βœ…  덱 (double ended queue) λͺ¨λ“ˆ

μ–‘μͺ½ λμ—μ„œ μ‚½μž…κ³Ό μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€.

μ›μΉ™μ μœΌλ‘œλŠ” 제일 μ•ž/λ’€κ°€ μ•„λ‹Œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ˜ 확인, 변경이 λΆˆκ°€λŠ₯ν•œλ° λ±μ—μ„œλŠ” index접근이 κ°€λŠ₯ν•˜λ‹€.

μ–‘μͺ½μœΌλ‘œ ν™•μž₯이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— κ΅¬ν˜„μ‹œ μ‹œμž‘ 지점을 쀑간에 λ‘μ–΄μ•Όν•œλ‹€. 

popleft() - 첫번째 데이터λ₯Ό 제거

eppendleft() - 데이터λ₯Ό 맨 μ•žμ— μ‚½μž…

 

- 큐 (Queue) λͺ¨λ“ˆ

덱보닀 느림, 인덱슀 κ°’μœΌλ‘œ 값을 μ•Œμˆ˜μ—†λ‹€.

: 주둜 λ©€ν‹° μ“°λ ˆλ”© ν™˜κ²½μ—μ„œ μ‚¬μš©λ˜λ©°, λ‚΄λΆ€μ μœΌλ‘œ 라킹(locking)을 μ§€μ›ν•˜μ—¬ μ—¬λŸ¬ 개의 μ“°λ ˆλ“œκ°€ λ™μ‹œμ— 데이터λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•  수 μžˆλ‹€.

덱과 달리 λ°©ν–₯성이 μ—†κΈ° λ•Œλ¬Έμ— 데이터λ₯Ό 좔가와 μ‚­μ œκ°€ ν•˜λ‚˜μ˜ λ©”μ†Œλ“œλ‘œ 처리됨.

put(x) - 데이터 μΆ”κ°€

get( ) - 데이터 μ‚­μ œ

μš°μ„ μˆœμœ„ 큐

: popν• λ–„ κ°€μž₯ λ¨Όμ € λ“€μ–΄μ˜¨ μ›μ†Œ λŒ€μ‹  μš°μ„ μˆœμ˜κ°€ κ°€μž₯ 놓은 μ›μ†Œκ°€ λ‚˜μ˜€λŠ” 큐 κΈ°λŠ₯ - νž™ ꡬ쑰λ₯Ό μ΄μš©ν•΄ λΉ λ₯΄κ²Œ 연산이 κ°€λŠ₯ν•˜λ‹€. 

  1.  μ›μ†ŒμΆ”κ°€ O(logN)
  2. μš°μ„ μˆœμœ„κ°€ κ°€μž₯ 높은 μ›μ†Œμ˜ 확인 O(1)
  3. μš°μ„ μˆœμœ„κ°€ κ°€μž₯ 높은 μ›Œμ†Œμ˜ 제거 O(logN)

νž™

이진 트리 - μ΄μ§„κ²€μƒ‰νŠΈλ¦¬(BST)와 달리 늘 κ· ν˜•μ΄ 잘 λ§žλŠ” μ΄μ§„νŠΈλ¦¬

μ΅œμ†Œνž™ / μ΅œλŒ€νž™

  • μ‚½μž… : μ›λž˜ μˆœμ„œλŒ€λ‘œ μ‚½μž…(λ§¨μœ„-였λ₯Έμͺ½-μ™Όμͺ½)후에 쑰건에 μœ„λ°°λœλ‹€λ©΄ μœ„λ°°λ˜μ§€μ•Šμ„λ•ŒκΉŒμ§€ 자리 λ³€κ²½
  • μΆ”μΆœ : λ£¨νŠΈμ— λ“€μ–΄μžˆλŠ” 값이 μ΅œμ†Œ/μ΅œλŒ€κ°’ - μ΅œμ†Œνž™μ—μ„œλŠ” μ΅œμ†Ÿκ°’, μ΅œλŒ€νž™μ—μ„œλŠ” μ΅œλŒ€κ°’μ„ 찾을 수있고 λ‹€λ₯Έ 값을 μ°ΎλŠ” 것은 트리λ₯Ό μ „λΆ€ λ’€μ§€λŠ”κ²Œ μ•„λ‹Œ 이상 확인이 λΆˆκ°€λŠ₯ν•˜λ‹€. 
  • μ‚­μ œ : λ£¨νŠΈκ°’μ„ μ‚­μ œν• λ•Œ 트리 ꡬ쑰가 κΉ¨μ§€μ§€μ•Šκ²Œ κ°€μž₯ λ§ˆμ§€λ§‰ 자리수(μžμ‹μ΄ μ—†λŠ”)와 λ£¨νŠΈκ°’μ„ λ°”κΎΌν›„ μ‚­μ œν•œλ‹€. κ·Έ ν›„ μ‚½μž…μ—μ„œμ™€ λ™μΌν•˜κ²Œ νŠΈλ¦¬κ΅¬μ‘°κ°€ μœ„λ°°λ˜μ§€μ•Šκ²Œ λ‚΄λΆ€μ μœΌλ‘œ 자리λ₯Ό λ³€κ²½ν•΄μ€€λ‹€. 

xλ²ˆμ§€μ˜ μ™Όμͺ½ μžμ‹ index : 2x

xλ²ˆμ§€μ˜ 였λ₯Έμͺ½ μžμ‹ index : 2x + 1

xλ²ˆμ§€μ˜ λΆ€λͺ¨ index : x/2

 

μ΄μ§„κ²€μƒ‰νŠΈλ¦¬λŠ” μ™œ νž™μ²˜λŸΌ λ°°μ—΄λ‘œ λ‚˜νƒ€λ‚Ό 수 μ—†λŠ” 지 생각해보기

 

 

βœ…  νž™ (heapq) λͺ¨λ“ˆ

heapq.heappush(heap, item) : item을 heap list 에 μΆ”κ°€

heapq.heappop(heap) : heap list μ—μ„œ κ°€μž₯ μž‘μ€ μ›μ†Œλ₯Ό pop. λΉ„μ–΄ μžˆλŠ” 경우 IndexErrorκ°€ 호좜됨. 

heapq.heapify(x) : 리슀트 xλ₯Ό μ¦‰κ°μ μœΌλ‘œ heap으둜 λ³€ν™˜ν•¨ O(N)

 

- 덱(queue) λͺ¨λ“ˆ PriorityQueue 클래슀 

λ‚΄λΆ€μ μœΌλ‘œ heapλͺ¨λ“ˆμ„ μ‚¬μš©ν•œλ‹€.

μƒμ„±μž

que = PriorityQueue()

que = PriorityQueue(maxsize=8) : μ΅œλŒ€ν¬κΈ° μ§€μ •μƒμ •μž

 

 

μ—΄μ½” πŸ”₯πŸ”₯

λŒ“κΈ€