๋ฐ๋ธŒ์ฝ”์Šค_๋ฐ์ดํ„ฐ์—”์ง€๋‹ˆ์–ด๋ง

[Week2 ์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜] TIL 3์ผ์ฐจ - ์Šคํƒ๊ณผ ํ, ํŠธ๋ฆฌ

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 10. 18. 00:43
728x90
๋”๋ณด๊ธฐ

TIL์„ ์“ฐ๋Š”๋ฐ ๋„ˆ๋ฌด ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๋งค์ผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด์„ , ์กฐ๊ธˆ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

์Šคํƒ๊ณผ ํ์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋Š” ๊ธฐ์กด์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์ž.

 

 

 

[ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] 1. ์Šคํƒ๊ณผ ํ

* ์ด ๊ธ€์€ ๋„ค์ด๋ฒ„ ๋ถ€์ŠคํŠธ ์ฝ”์Šค์˜ ์ธ๊ณต์ง€๋Šฅ(AI) ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์‚ฌ๋‹ด) ์–ผ๋งˆ์ „ ์ธํ„ด ๋ชจ์˜๋ฉด์ ‘์— ์šฐ์—ฐํžˆ ์ฐธ์—ฌํ•  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ ์Šคํƒ๊ณผ ํ๋ฅผ ํ—ท๊ฐˆ๋ ค๋ฒ„๋ ธ๋‹ค. ํ”„๋กœ์ 

steady-eschoi.tistory.com

 

1) ์Šคํƒ

ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•

ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•(infix notation) : ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž๋“ค ์‚ฌ์ด์— ์œ„์น˜

(A+B)*(C-D)

  • ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•(postfix notation) : ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž๋“ค ๋’ค์— ์œ„์น˜

AB+CD-* : ์•ž์˜ ์—ฐ์‚ฐ์ž๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ

  • ์ „์œ„ ํ‘œ๊ธฐ๋ฒ•(prefix notation) : ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž๋“ค ์•ž์— ์œ„์น˜

*+AB-CD

 

๊ฐ•์˜์—์„œ๋Š” ์ค‘์œ„ํ‘œ๊ธฐ๋ฒ• → ํ›„์œ„ํ‘œ๊ธฐ๋ฒ•์„ ์Šคํƒ์„ ์ด์šฉํ•ด์„œ ๋ณ€ํ™˜ํ•˜์˜€๋‹ค

 

(์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ• -> ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ๋ณ€ํ™˜) ๋กœ์ง

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•œ๋‹ค. 

ํ”ผ์—ฐ์‚ฐ์ž : ์ถœ๋ ฅ

์—ฐ์‚ฐ์ž : ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ถœ๋ ฅ

  • ์Šคํƒ์— push : ์Šคํƒ ๋งจ ์œ„์˜ ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฉด
  • ์Šคํƒ์—์„œ pop : ์—ฌ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜จ ๊ฒฝ์šฐ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋‚ฎ์€ ๊ฒฝ์šฐ, ๋‚จ์•„์žˆ๋Š” ์‹์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ pop

 

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ํ…Œ์ด๋ธ”(prec)

3 * /
2 + -
1 (  

 

์ฝ”๋“œ

def infixToPostfix(tokenList):
    prec = {
        '*': 3,
        '/': 3,
        '+': 2,
        '-': 2,
        '(': 1,
    }

    opStack = ArrayStack()
    postfixList = []
    for token in tokenList:
        if token=='(':
            opStack.push(token)
        elif token==')':
            while opStack.peek()!='(':
                postfixList.append(opStack.pop())
            opStack.pop()
        elif token not in prec.keys():
            postfixList.append(token)
        else:
            if opStack.isEmpty():
                opStack.push(token)
            else:
            	#์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด pop
                while opStack.isEmpty()!=True and prec[opStack.peek()]>=prec[token]:
                    postfixList.append(opStack.pop())
                opStack.push(token)
    #๋นˆ ์Šคํƒ์ด ๋  ๋•Œ๊นŒ์ง€ ์ถœ๋ ฅ
    while opStack.isEmpty()!=True:
        if opStack not in ['(', ')']:
            postfixList.append(opStack.pop())
        else:
            opStack.pop()
    return postfixList

 

(ํ›„์œ„ํ‘œ๊ธฐ๋ฒ• ๊ณ„์‚ฐ) ๋กœ์ง

ํ”ผ์—ฐ์‚ฐ์ž : ์Šคํƒ์— ์‚ฝ์ž…

์—ฐ์‚ฐ์ž : ์Šคํƒ์— top, top-1 ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•œ ๋’ค ๋‹ค์‹œ push

* ์ด๋•Œ, ์ฃผ์˜ํ•  ๊ฒƒ์€ top-1 (์—ฐ์‚ฐ์ž) top ์ˆœ์„œ์—ฌ์•ผ ํ•จ์„ ์œ ์˜ํ•˜์ž(๋บ„์…ˆ, ๋‚˜๋ˆ—์…ˆ์˜ ํ”ผ์—ฐ์‚ฐ์ž์˜ ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•  ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค)

ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์ด๋ฏ€๋กœ ์—ฐ์‚ฐ์ž๋Š” ์ˆœ์„œ๋Œ€๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ

def postfixEval(tokenList):
    valStack = ArrayStack()
    
    for token in tokenList:
        if type(token) is int:
            valStack.push(token)
        elif token == '*':
            num2 = valStack.pop()
            num1 = valStack.pop()
            valStack.push(num1 * num2)
        elif token == '/':
            num2 = valStack.pop()
            num1 = valStack.pop()
            valStack.push(num1 / num2)
        elif token == '+':
            num2 = valStack.pop()
            num1 = valStack.pop()
            valStack.push(num1 + num2)
        elif token == '-':
            num2 = valStack.pop()
            num1 = valStack.pop()
            valStack.push(num1 - num2)
    
    return valStack.pop()

 

2) ํ

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

ํ์˜ ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ์˜ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

ํ™œ์šฉ

์ž๋ฃŒ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…๊ณผ ๊ทธ ์ž๋ฃŒ๋ฅผ ์ด์šฉํ•˜๋Š” ์ž‘์—…์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

์ž๋ฃŒ๋ฅผ ์ด์šฉํ•˜๋Š” ์ž‘์—…์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

์ž๋ฃŒ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ผ์–ด๋‚˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

๋ณดํ†ต ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌดํ•œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์›ํ˜•ํ๋ฅผ ์ด์šฉํ•ด์„œ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•œ๋‹ค.

 

์›ํ˜• ํ(Circular Queue)

์›ํ˜•ํ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.

isFull():Boolean

  • front : ํ์— ์ œ์ผ ๋จผ์ € ๋“ค์–ด๊ฐ„ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • rear : ํ์— ์ œ์ผ ๋‚˜์ค‘์— ๋“ค์–ด๊ฐ„ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์•ž์˜ ํฌ์ธํ„ฐ์™€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐฐ์—ด์„ ์ด์šฉํ•  ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋Š” 0~(n-1)๊นŒ์ง€์ด๋‹ค. ๋”ฐ๋ผ์„œ ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ•  ๋•Œ,  (front or rear)%maxCount ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

 

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

์›ํ˜• ํ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

 

์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)

ํ์˜ ๋ฐฉ์‹์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ , ์›์†Œ๋“ค์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ํ์—์„œ ๋น ์ ธ๋‚˜์˜ค๋Š” ํ˜•์‹

์‚ฝ์ž… ์ˆœ์„œ๋Š” ์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์€ ๊ฒƒ๋ถ€ํ„ฐ → ํฐ ๊ฒƒ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ pop ์—ฐ์‚ฐ๋„ ๋™์ผํ•˜๊ฒŒ ์ผ์–ด๋‚œ๋‹ค.

 

ํ™œ์šฉ

์šด์˜์ฒด์ œ์˜ CPU ์Šค์ผ€์ฅด๋Ÿฌ

 

๊ตฌํ˜„

  1. Enqueue ํ•  ๋•Œ ์šฐ์„ ์ˆœ์œ„ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก
  2. Dequeue ํ•  ๋•Œ ์šฐ์„ ์ˆœ์œ„ ๋†’์€ ๊ฒƒ์„ ์„ ํƒ

2๋ฒˆ์˜ ๊ฒฝ์šฐ ํ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•˜๋ฏ€๋กœ 1๋ฒˆ ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋” ์œ ๋ฆฌํ•˜๋‹ค.

 

  1. ์„ ํ˜• ๋ฐฐ์—ด ์ด์šฉ
  2. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ด์šฉ

Enqueue ํ• ๋•Œ ์šฐ์„ ์ˆœ์œ„ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋ฉด, ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•˜๋ฉด ์ดํ›„์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ํ•œ ์นธ์”ฉ ๋’ค๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•˜์ง€๋งŒ, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๋‹จ์ˆœํžˆ ์•ž ๋’ค์˜ ์—ฐ๊ฒฐ๋งŒ ๋ฐ”๊พธ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

3) ํŠธ๋ฆฌ

๊ทธ๋ž˜ํ”„์˜ ์ผ์ข…์œผ๋กœ, ๋…ธ๋“œ๊ฐ€ ์—ฃ์ง€๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

 

์šฉ์–ด

  • ๋ฃจํŠธ ๋…ธ๋“œ (root node) : ๊ฐ€์žฅ ์œ„์— ์œ„์น˜ํ•œ ๋…ธ๋“œ
  • ๋ฆฌํ”„ ๋…ธ๋“œ (leaf nodes) : ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ = degree๊ฐ€ 0์ธ ๋…ธ๋“œ
  • ๋‚ด๋ถ€ ๋…ธ๋“œ (internal nodes) : ๋ฃจํŠธ, ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋‚˜๋จธ์ง€์˜ ๋…ธ๋“œ
  • ๋ถ€๋ชจ (parent) ๋…ธ๋“œ : ํ•˜๋‚˜์˜ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ค‘ ์ƒ์œ„ ๋…ธ๋“œ
  • ์ž์‹ (child) ๋…ธ๋“œ : ํ•˜๋‚˜์˜ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ค‘ ํ•˜์œ„ ๋…ธ๋“œ
  • ๋…ธ๋“œ์˜ ์ˆ˜์ค€ (level) : ๋ฃจํŠธ ๋…ธ๋“œ ๊ธฐ์ค€ 0์œผ๋กœ, ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ๋ช‡ ๊ฐœ์˜ ๊ฐ„์„ ์„ ๊ฑฐ์น˜๋Š”์ง€(๊ฑฐ๋ฆฌ)
  • ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜ (degree) : ์ž์‹ ๋…ธ๋“œ์˜ 
  • ํŠธ๋ฆฌ์˜ ๋†’์ด (height) , ๊นŠ์ด (depth) : ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ์ˆ˜์ค€(level)+1
  • ๋ถ€๋ถ„ ํŠธ๋ฆฌ (์„œ๋ธŒํŠธ๋ฆฌ; subtrees) : ํŠธ๋ฆฌ์˜ ์ผ๋ถ€

 

์ด์ง„ํŠธ๋ฆฌ(binary tree)

๋ชจ๋“  ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๊ฐ€ 2 ์ดํ•˜์ธ ํŠธ๋ฆฌ

 

ํฌํ™” ์ด์ง„ํŠธ๋ฆฌ (full binary trees)

๋ชจ๋“  ๋ ˆ๋ฒจ์—์„œ 2๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ด์ง„ํŠธ๋ฆฌ

 

์™„์ „ ์ด์ง„ํŠธ๋ฆฌ (complete binary trees)

๋†’์ด๊ฐ€ k๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด,

k-2๋ฒˆ์งธ ๋ ˆ๋ฒจ์€ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋‘ 2๊ฐœ์ด๊ณ ,

k-1๋ฒˆ์งธ ๋ ˆ๋ฒจ์€ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ

 

 

๊ตฌํ˜„

์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด์ž.

๋…ธ๋“œ์™€ ํŠธ๋ฆฌ์˜ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

์ด์ง„ ํŠธ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋…ธ๋“œ์™€ ํŠธ๋ฆฌ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

  • size() : ์ „์ฒด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ = left์„œ๋ธŒํŠธ๋ฆฌ+right์„œ๋ธŒํŠธ๋ฆฌ+root๋…ธ๋“œ
  • depth() : max(left์„œ๋ธŒํŠธ๋ฆฌ์˜ depth, right ์„œ๋ธŒํŠธ๋ฆฌ์˜ depth)+1
  • traverse()
    • ๊นŠ์ด ์šฐ์„  ์ˆœํšŒ(์žฌ๊ท€์  ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„)
      • ์ค‘์œ„ ์ˆœํšŒ(inorder traversal) : left → root → right
      • ์ „์œ„ ์ˆœํšŒ(preorder traversal) : root → left → right
      • ํ›„์œ„ ์ˆœํšŒ(postorder traversal) : left → right → root
    • ๋„“์ด ์šฐ์„  ์ˆœํšŒ : ์ˆ˜์ค€์ด ๋‚ฎ์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฐฉ๋ฌธ(๋ฃจํŠธ๋…ธ๋“œ →๋ถ€๋ชจ๋…ธ๋“œ →์ž์‹๋…ธ๋“œ)

 

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ(binary search tree tree)

๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ํŠธ๋ฆฌ

  • ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๊ณ 
  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ๋Š” ๊ฐ’์€ ๋ชจ๋‘ ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฐ

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์™œ ์ด์ง„ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์“ฐ๋Š”์ง€๋ฅผ ์•Œ์•„๋ณด์ž. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ํƒ์ƒ‰์— ๋น„ํ•ด ์ด์ง„ ํƒ์ƒ‰์ด ๊ฐ–๋Š” ์ด์ ์€ ์ฐพ์•„๋ณด์ž.

ํŠธ๋ฆฌ๊ตฌ์กฐ์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์›์†Œ์˜ ์ถ”๊ฐ€, ์‚ญ์ œ๊ฐ€ ์šฉ์ดํ•˜์ง€๋งŒ, ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ํ‰๊ท  O(log n)์˜ ํƒ์ƒ‰ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

๋ณดํ†ต ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์น˜๋Š” ์ด์ง„ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ํƒ์ƒ‰์— ๋งค์šฐ ๋ถˆ๋ฆฌํ•˜๋‹ค.

(๋”ฐ๋ผ์„œ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๊ฒŒ ํ•˜๋Š”, ๋†’์ด์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๊ฒŒ ํ•˜๋Š” ์ด์ง„ํŠธ๋ฆฌ ์—ฐ์‚ฐ๋“ค์ด ์žˆ๋‹ค tradeoff-์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๋œ ์œ ์—ฐ)

  • AVL tree
  • Red-black tree

 

 

๊ตฌํ˜„

์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋“œ์™€ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ํด๋ž˜์Šค๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

  • insert(key, data) : ํŠธ๋ฆฌ์— key ์ž๋ฆฌ์— ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ์ถ”๊ฐ€
    • key๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ → ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ๋‚ด๋ ค๊ฐ€ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ or ์™ผ์ชฝ์— ์‚ฝ์ž…
    • key๊ฐ€ ํฐ ๊ฒฝ์šฐ → ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ๋‚ด๋ ค๊ฐ€ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ or ์˜ค๋ฅธ์ชฝ์— ์‚ฝ์ž…
    • key๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ → keyError ๋ฐœ์ƒ
  • remove(key) : ํŠธ๋ฆฌ์— key ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ์‚ญ์ œ
    • ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ → parent์˜ ์—ฐ๊ฒฐ๋งŒ ๋Š๊ธฐ
    • ์ž์‹ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ → ์ž์‹ ๋…ธ๋“œ๋ฅผ parent์— ์—ฐ๊ฒฐ
    • ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋‘ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ → ๊ทธ๋‹ค์Œ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ž์‹ ๋…ธ๋“œ๋ฅผ parent์— ์—ฐ๊ฒฐ
  • lookup(key) : key์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ์™€ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • inorder() : key์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ๋‚˜์—ด
  • min() : ์ตœ์†Œํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ์›์†Œ ํƒ์ƒ‰
  • max() : ์ตœ๋Œ€ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ์›์†Œ ํƒ์ƒ‰

 

๋ชจ๋“  ์ฝ”๋“œ๋Š” ๊นƒํ—ˆ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

728x90