λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ–‹οΈ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜/μ•Œκ³ λ¦¬μ¦˜,자료ꡬ쑰

[큐] λ°°μ—΄ 기반 큐와 μ—°κ²°λ¦¬μŠ€νŠΈ 기반 큐

by OR15A 2023. 11. 21.

μƒν™œ 속 큐의 μ˜ˆμ‹œ

  • 은행 λŒ€κΈ°μ—΄: 고객듀이 μ°¨λ‘€λ‘œ λ„μ°©ν•˜κ³ , λ„μ°©ν•œ μˆœμ„œλŒ€λ‘œ μ„œλΉ„μŠ€λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.
  • ν”„λ¦°ν„° μž‘μ—…: λ¬Έμ„œλ“€μ΄ ν”„λ¦°ν„° λŒ€κΈ°μ—΄μ— μ°¨λ‘€λ‘œ μΆ”κ°€λ˜λ©°, μΆ”κ°€λœ μˆœμ„œλŒ€λ‘œ μΈμ‡„λ©λ‹ˆλ‹€.
  • μ½œμ„Όν„° μ „ν™” λŒ€κΈ°μ—΄: μ „ν™”κ°€ μˆœμ„œλŒ€λ‘œ λŒ€κΈ°μ—΄μ— λ“€μ–΄κ°€κ³ , μ°¨λ‘€λ‘œ μ—°κ²°λ©λ‹ˆλ‹€.
  • 온라인 ν‹°μΌ“ 예맀: μ‚¬μš©μžλ“€μ΄ μ„œλ²„μ— 접속해 λŒ€κΈ°μ—΄μ— λ“€μ–΄κ°€κ³ , μˆœμ„œμ— 따라 티켓을 ꡬ맀할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

큐 자료ꡬ쑰의 ADT(좔상 데이터 νƒ€μž…)

Enqueue: 큐의 끝에 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
Dequeue: 큐의 μ‹œμž‘μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜ν•©λ‹ˆλ‹€.
Peek / Front: 큐의 μ‹œμž‘μ— μžˆλŠ” μš”μ†Œλ₯Ό μ‘°νšŒν•˜μ§€λ§Œ μ œκ±°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
IsEmpty: 큐가 λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
Size: 큐에 μ €μž₯된 μš”μ†Œμ˜ 개수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

 

λ°°μ—΄ 기반 큐(μ›ν˜•)

κ΅¬μ„±μš”μ†Œ
  • λ°°μ—΄: μš”μ†Œλ“€μ„ μ €μž₯ν•˜λŠ” 정적 λ°°μ—΄μž…λ‹ˆλ‹€.
  • Front 포인터: 큐의 μ‹œμž‘μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • Rear 포인터: 큐의 끝을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€. = 큐.length - 1
  • Size/Capacity: λ°°μ—΄μ˜ μ΅œλŒ€ ν¬κΈ°μž…λ‹ˆλ‹€.

 

μž‘λ™ 원리
  • Enqueue: Rear 포인터 μœ„μΉ˜μ— μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³  Rearλ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.
  • Dequeue: Front 포인터 μœ„μΉ˜μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  Frontλ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.
  • Wrap Around: μˆœν™˜ 큐(circular queue)의 경우, 포인터가 λ°°μ—΄ 끝에 λ„λ‹¬ν•˜λ©΄ 처음으둜 λŒμ•„κ°‘λ‹ˆλ‹€.
  • λ°°μ—΄μ˜ 경계λ₯Ό λ„˜μ–΄κ°€λŠ” 경우λ₯Ό κ°μ•ˆν•΄μ„œ rear++ λŒ€μ‹ μ— rear = ( rear+1 )%queue.length λ‚˜λ¨Έμ§€ 연산을 μ΄μš©ν•©λ‹ˆλ‹€.

 

μ£Όμš” λ©”μ„œλ“œ
  • offer(E e) / add(E e) : νμ˜ 끝에 μš”μ†Œλ₯Ό μΆ”κ°€. offerλŠ” 큐가 가득 찼을 λ•Œ falseλ₯Ό λ°˜ν™˜ν•˜κ³ , addλŠ” IllegalStateException을 던짐
  • poll() / remove() : νμ˜ μ‹œμž‘μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜. poll은 큐가 λΉ„μ–΄μžˆμ„ λ•Œ null을 λ°˜ν™˜ν•˜κ³ , removeλŠ” NoSuchElementException을 던짐
  • peek() / element() :큐의 μ‹œμž‘μ— μžˆλŠ” μš”μ†Œλ₯Ό μ‘°νšŒν•˜μ§€λ§Œ, μ œκ±°ν•˜μ§€ μ•ŠμŒ. peek은 큐가 λΉ„μ–΄μžˆμ„ λ•Œ null을 λ°˜ν™˜ν•˜κ³ , elementλŠ” NoSuchElementException을 던짐.
  • size() : νμ— μ €μž₯된 μš”μ†Œμ˜ 수λ₯Ό λ°˜ν™˜
  • isEmpty() :큐가 λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜

 

 

 

μ—°κ²° 리슀트 기반 큐

κ΅¬μ„±μš”μ†Œ
  • λ…Έλ“œ: 각 μš”μ†ŒλŠ” λ…Έλ“œλ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.
  • ν—€λ“œ 포인터: 큐의 μ‹œμž‘μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • ν…ŒμΌ 포인터: 큐의 끝을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

 

μž‘λ™ 원리
  • Enqueue: ν…ŒμΌμ— μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³ , ν…ŒμΌ 포인터λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
  • Dequeue: ν—€λ“œμ— μžˆλŠ” μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³ , ν—€λ“œ 포인터λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

 

μ£Όμš” λ©”μ„œλ“œ
  • offer(E e) / add(E e) : νμ˜ 끝에 μš”μ†Œλ₯Ό μΆ”κ°€. offer와 addλŠ” κΈ°λŠ₯적으둜 λ™μΌν•˜μ§€λ§Œ, addλŠ” IllegalStateException을 던짐
  • poll() / remove() : νμ˜ μ‹œμž‘μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜. poll은 큐가 λΉ„μ–΄μžˆμ„ λ•Œ null을 λ°˜ν™˜ν•˜κ³ , removeλŠ” NoSuchElementException을 던짐,
  • peek() / element() : νμ˜ μ‹œμž‘μ— μžˆλŠ” μš”μ†Œλ₯Ό μ‘°νšŒν•˜μ§€λ§Œ, μ œκ±°ν•˜μ§€ μ•ŠμŒ. peek은 큐가 λΉ„μ–΄μžˆμ„ λ•Œ null을 λ°˜ν™˜ν•˜κ³ , elementλŠ” NoSuchElementException을 던짐
  • size() : νμ— μ €μž₯된 μš”μ†Œμ˜ 수λ₯Ό λ°˜ν™˜
  • isEmpty() : νκ°€ λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜

 

 

큐의 μž₯점과 단점

μž₯점

  • 곡정성: FIFO(First In, First Out) 원칙에 따라 μš”μ†Œλ“€μ΄ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • 간단함: 큐의 연산듀은 κ΅¬ν˜„ν•˜κΈ° 쉽고 μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

단점

  • λΉ„νš¨μœ¨μ„±: λ°°μ—΄ 기반 νμ—μ„œ 곡간이 κ³ μ •λ˜μ–΄ μžˆμ–΄ 크기 쑰정이 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μ—°κ²° 리슀트 기반 νλŠ” 포인터λ₯Ό μœ„ν•œ μΆ”κ°€ 곡간이 ν•„μš”ν•©λ‹ˆλ‹€.
  • 속도: μ—°κ²° 리슀트 기반 νμ—μ„œλŠ” μš”μ†Œ 접근이 느릴 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

큐의 ν™•μž₯

  • μš°μ„ μˆœμœ„ 큐(Priority Queue): μš”μ†Œλ“€μ΄ μš°μ„ μˆœμœ„μ— 따라 μ •λ ¬λ˜κ³ , κ°€μž₯ 높은 μš°μ„ μˆœμœ„λ₯Ό 가진 μš”μ†Œκ°€ λ¨Όμ € λ‚˜μ˜΅λ‹ˆλ‹€.
  • μˆœν™˜ 큐(Circular Queue): 배열을 μ‚¬μš©ν•˜μ—¬ 효율적으둜 곡간을 μž¬μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 덱(Deque): μ–‘μͺ½ λμ—μ„œ μ‚½μž…κ³Ό μ‚­μ œκ°€ κ°€λŠ₯ν•œ 큐의 μΌλ°˜ν™”λœ ν˜•νƒœμž…λ‹ˆλ‹€.

 

  1. LinkedList:
    • LinkedList ν΄λž˜μŠ€λŠ” List와 Deque μΈν„°νŽ˜μ΄μŠ€λ₯Ό λͺ¨λ‘ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
    • μ—°κ²° 리슀트 기반으둜, 큐의 λͺ¨λ“  κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • λ™μ μœΌλ‘œ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³  μ œκ±°ν•  수 있으며, μΆ”κ°€ 및 제거 μž‘μ—…μ΄ 의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  2. ArrayDeque:
    • ArrayDequeλŠ” μ›ν˜• 배열을 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„λœ 더블 μ—”λ“œ 큐(Deque)μž…λ‹ˆλ‹€.
    • 큐와 μŠ€νƒμ˜ κΈ°λŠ₯을 λͺ¨λ‘ μ œκ³΅ν•˜λ©°, μ„ ν˜• λ°°μ—΄ 기반 큐에 λΉ„ν•΄ 곡간 νš¨μœ¨μ„±μ΄ 더 λ†’μŠ΅λ‹ˆλ‹€.
    • μΆ”κ°€ 및 제거 μž‘μ—…μ΄ 의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  3. PriorityQueue:
    • PriorityQueueλŠ” μš°μ„  μˆœμœ„ 큐λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.
    • μš”μ†Œλ“€μ€ μžμ—° μˆœμ„œ λ˜λŠ” λΉ„κ΅μž(comparator)에 따라 μ •λ ¬λ©λ‹ˆλ‹€.
    • μš”μ†Œμ˜ 좔가와 μ œκ±°λŠ” 의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  4. ConcurrentLinkedQueue:
    • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ 비차단(non-blocking) μ—°κ²° 리슀트 기반 νμž…λ‹ˆλ‹€.
    • λ™μ‹œμ„±(concurrency)에 κ°•ν•˜λ©°, 높은 λ™μ‹œ μ ‘κ·Όμ—μ„œ μ„±λŠ₯이 λ›°μ–΄λ‚©λ‹ˆλ‹€.
  5. LinkedBlockingQueue:
    • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©λ˜λŠ” 차단(blocking) μ—°κ²° 리슀트 기반 νμž…λ‹ˆλ‹€.
    • μŠ€λ ˆλ“œ μ•ˆμ „(thread-safe)ν•˜λ©°, μΆ”κ°€ 및 제거 μž‘μ—… μ‹œ 빈 νλ‚˜ 가득 μ°¬ νμ—μ„œ μŠ€λ ˆλ“œλ₯Ό 차단(λŒ€κΈ° μƒνƒœλ‘œ λ§Œλ“¦)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

참고자료 : γ€Œμ‰½κ²Œ λ°°μš°λŠ” 자료ꡬ쑰 with μžλ°”γ€