ํฐ์คํ ๋ฆฌ ๋ทฐ
์ถ์์ ์๋ฃ๊ตฌ์กฐ (Abstract Data Structures)
์๋ฃ๊ตฌ์กฐ์ ๋ด๋ถ ๊ตฌํ์ ์จ๊ฒจ๋๊ณ ๋ฐ์์ ๋ณด์ด๋ ๊ฒ๋ค (๋ ๊ฐ์ง)์ ๋งํจ
- Data : ์ ์, ๋ฌธ์์ด, ๋ ์ฝ๋...
- A set of operations : ์ฝ์ , ์ญ์ , ์ํ... ์ ๋ ฌ, ํ์...
๊ธฐ๋ณธ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์์ ์๋ ๋์ด ๋ค์ ์๋ ๋์ ๊ฐ๋ฅดํค๋ ํ์์ผ๋ก ๋์ด๋์ ๊ฒ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๊ณ ํ๋ค.
- Head : ๋ฆฌ์คํธ์ ๋งจ ์ฒ์ ๋ ธ๋
- Tail : ๋ฆฌ์คํธ์ ๋งจ ๋ง์ง๋ง ๋ ธ๋ (๋ฆฌ์คํธ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ๋ Tail์ ์ฌ์ฉํ๋ค.)
- of nodes : ๋ ธ๋๊ฐ ๋ช๊ฐ ์๋์ง๋ ๊ธฐ๋กํด๋๋ ๊ฒ์ด ์ข๋ค
- ๋ ธ๋๋ Data์ Link(Next)๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๋ ธ๋ ๋ด์ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง ์ ์๋ค (๋ฌธ์์ด, ๋ ์ฝ๋, ๋ ๋ค๋ฅธ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฑ)
์๋ฃ๊ตฌ์กฐ ์ ์
# Node ํด๋์ค
# Node ํด๋์ค
class Node:
# ์์ฑ์
def __init__(self, item):
self.data = item
self.next = None
# LinkedList ํด๋์ค
# LinkedList ํด๋์ค
class LinkedList:
def __init__(self):
self.nodeCount = 0
self.head = None
self.tail = None
๋ฐฐ์ด๊ณผ ๋น๊ตํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ ํ ๋ฐฐ์ด์ "๋ฒํธ๊ฐ ๋ถ์ฌ์ง ์นธ์ ์์๋ค์ ์ฑ์๋ฃ๋" ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค๋ฉด, ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ "๊ฐ ์์๋ค์ ์ค์ค์ด ์ฎ์ด์" ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ ํ ๋ฐฐ์ด์ ๋นํด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๊ฐ์ง๋ ์ด์ ์?
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ์์๋ค์ด ๋งํฌ(link)๋ผ๊ณ ๋ถ๋ฅด๋ ๊ณ ๋ฆฌ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก, ๊ฐ์ด๋ฐ์์ ๋์ด ์์ ํ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋, ์ฝ์ ํ๋ ๊ฒ์ด ์ ํ ๋ฐฐ์ด์ ๊ฒฝ์ฐ๋ณด๋ค ๋น ๋ฅธ ์๊ฐ๋ด์ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ฐ๋ผ์ ์์์ ์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํ ์ผ์ด๋๋ ์์ฉ์์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋ง์ด ์ด์ฉ๋๋ค. ์ปดํจํฐ ์์คํ ์ ๊ตฌ์ฑํ๋ ์ค์ํ ์์์ธ ์ด์์ฒด์ (operating system)์ ๋ด๋ถ์์๋ ์ด๋ฌํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ์ฌ๋ฌ ๊ณณ์์ ์ด์ฉ๋๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋จ์ ์?
์ ํ ๋ฐฐ์ด์ ๋นํด์ ๋ฐ์ดํฐ ๊ตฌ์กฐํํ์ ์์๋๋ ์ ์ฅ ๊ณต๊ฐ(๋ฉ๋ชจ๋ฆฌ) ์์๊ฐ ํฌ๋ค. ๋ "k๋ฒ์งธ ์์"๋ฅผ ์ฐพ์๊ฐ๋๋ฐ ์ ํ ๋ฐฐ์ด๋ณด๋ค ์ค๋์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. (์์์๋ถํฐ ํน์ ์์๊น์ง ํ๋์ฉ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ฐพ์์ผ ํ๋๊น)
์ฐ์ฐ์ ์
- ํน์ ์์(k๋ฒ์งธ) ์ฐธ์กฐ
- ๋ฆฌ์คํธ ์ํ
- ๊ธธ์ด ์ป์ด๋ด๊ธฐ
- ์์ ์ฝ์
- ์์ ์ญ์
- ๋ ๋ฆฌ์คํธ ํฉ์น๊ธฐ
ํน์ ์์ ์ฐธ์กฐ getAt
๋ ธ๋๋ฅผ 0๋ถํฐ ์ฐธ์กฐํ์ง ์๊ณ 1๋ถํฐ ์ฐธ์กฐํ๋ ์ด์ ๋ ๋์ค์ 0์ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์์ด๋ค.
# 1. ํน์ ์์ ์ฐธ์กฐ
def getAt(self, pos):
# ํน์ ์์น๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ๋
ธ๋์ ๊ธธ์ด๋ณด๋ค ํฌ๋ฉด None์ ๋ฐํ
if pos <= 0 or pos > self.nodeCount:
return None
i = 1
curr = self.head # ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฅดํด
# i๊ฐ pos๋ณด๋ค ์์ ๋์์ i๋ฅผ ํ๋์ฉ ์ฆ๊ฐ์ํค๋ฉด์ curr๋ฅผ curr์ next๋ฅผ ๊ฐ๋ฅดํค๊ฒ ํ๋ค
# ์ฆ pos-1๋ฒ ๋งํผ ์ ์งํ๋ฉด ๊ทธ๋ curr๊ฐ ๊ฐ๋ฅดํค๋ ๊ฒ์ด ๋ด๊ฐ ๋ฆฌํดํ๋ ค๋ pos๋ฒ์งธ ๋
ธ๋๊ฐ ๋๋ค
while i < pos:
curr = curr.next
i += 1
return curr
๋ฆฌ์คํธ ์ํ traverse
# 2. ๋ฆฌ์คํธ ์ํ
def traverse(self):
result = []
curr = self.head
while curr is not None:
result.append(curr.data)
curr = curr.next
return result
๊ธธ์ด ์ป์ด๋ด๊ธฐ getLength
def getLength(self):
return self.nodeCount
์์์ ์ฝ์ insertAt
์์๊ฐ ์ฝ์ ๋ ์ ์๋ ์กฐ๊ฑด 1 <= pos <= nodeCount + 1 ์ด ๋ฒ์ ์์๋ง ์ฝ์ ํ ์ ์๋ค.
newNode๋ฅผ ์ฝ์ ํ๊ณ ์ฑ๊ณต/์คํจ์ ๋ฐ๋ผ True/False๋ฅผ ๋ฆฌํดํ๋ค.
์์์ ์ฝ์ ํ๋ฆ
1) ๊ณผ 2) ์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ์๋๋ค.
์ฝ๋ ๊ตฌํ์ ์ฃผ์์ฌํญ
1. ์ฝ์ ํ๋ ค๋ ์์น๊ฐ ๋ฆฌ์คํธ ๋งจ ์์ผ ๋
- prev ์์
- Head ์กฐ์ ํ์
2. ์ฝ์ ํ๋ ค๋ ์์น๊ฐ ๋ฆฌ์คํธ ๋งจ ๋์ผ ๋
- Tail ์กฐ์ ํ์
3. ๋น ๋ฆฌ์คํธ์ ์ฝ์ผ ํ ๋
- ์ด ๋ ์กฐ๊ฑด์ ์ํด ์ฒ๋ฆฌ๋จ
ํ์ด์ฌ ์ฝ๋ ๊ตฌํ
# ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ฐ์ฐ - ์์์ ์ฝ์
def insertAt(self, pos, newNode):
# pos์ ์์น๊ฐ ์ ํจํ์ง ํ์ธ
if pos < 1 or pos > self.nodeCount + 1 :
# pos์์น๊ฐ ์ฝ์
ํ ์ ์๋ ๋ฒ์ ๋ฐ์ ์์ ๋ False ๋ฐํ
return False
# ๋
ธ๋๋ฅผ ๋งจ ์ฒ์ ์์น์ ์ฝ์ผํ ๋(prev์์)
if pos == 1: # (๋น ๋
ธ๋์ ์ฝ์
ํ ์กฐ๊ฑด์ ๊ฑธ๋ฆผ)
newNode.next = self.head # ์๋ก์ด ๋
ธ๋์ next๋ head
self.head = newNode # ํค๋๊ฐ ์๋ก์ด๋
ธ๋๊ฐ ๋๋ค
# ์ฝ์
ํ๋ ค๋ ์์น๊ฐ ์ฒ์์ด ์๋ ๋
else:
if pos == self.nodeCount + 1: # ์ฝ์
ํ๋ ค๋ ์์น๊ฐ ๋งจ๋์ผ ๋
prev = self.tail # prev == tail๊ณผ ๊ฐ์(์์์ ๋ถํฐ ์ฐพ์ ํ์ ์์)
else: # ์ฝ์
ํ๋ ค๋ ์์น๊ฐ ์ฒ์๋ ์๋๊ณ ๋งจ๋๋ ์๋ ๋
prev = self.getAt(pos-1) # ๋ผ์๋ฃ์ผ๋ ค๋ ์ง์ ์ ์์น๋ฅผ ์ป์ด๋ธ๋ค
newNode.next = prev.next # ์๋ก์ด ๋
ธ๋๊ฐ prev.next๋ฅผ ๊ฐ๋ฅดํค๋๋กํ๋ค.
prev.next = newNode # prev.next๋ฅผ newNode๋ก ํ๋ค
# ๋งจ ๋ง์ง๋ง ์์น์ ์ฝ์
ํ ๋ (๋น ๋
ธ๋์ ์ฝ์
ํ ์กฐ๊ฑด์ ๊ฑธ๋ฆผ)
if pos == self.nodeCount + 1:
self.tail = newNode # Tail์ ์๋ก์ด ๋
ธ๋๋ก ๋ณ๊ฒฝ
# ๋ง์ง๋ง์ผ๋ก ๋
ธ๋์ ๊ฐฏ์ ์ฆ๊ฐ
self.nodeCount += 1
return True
์๊ฐ ๋ณต์ก๋
- ๋งจ ์์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ O(1)
- ์ค๊ฐ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ O(n)
- ๋งจ ๋์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ O(1) -> tail์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
์์์ ์ญ์ def pop(self, pos)
pos์ ์์น๊ฐ 1<= pos <= nodeCount ์์ ์์นํด์ผํ๋ค.
๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ ๊ทธ ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํด
์์์ ์ญ์ ํ๋ฆ
์ฝ๋ ๊ตฌํ ์ฃผ์์ฌํญ
1. ์ญ์ ํ๋ ค๋ node๊ฐ ๋งจ ์์ ๊ฒ์ผ ๋
- prev๊ฐ ์์
- Head ์กฐ์ ํ์
2. ๋ฆฌ์คํธ์ ๋งจ ๋์ node ๋ฅผ ์ญ์ ํ ๋
- Tail ์กฐ์ ํ์
3. ์ ์ผํ ๋ ธ๋๋ฅผ ์ญ์ ํ ๋
- ์ด ๋ ์กฐ๊ฑด์ ์ํด ์ฒ๋ฆฌ๋๋๊ฐ?
์ญ์ ํ๋ ค๋ node๊ฐ ๋ง์ง๋ง node์ผ ๋, ์ฆ pos == nodeCount์ธ ๊ฒฝ์ฐ?
์ฝ์ ํ๋ ๊ฒฝ์ฐ์ฒ๋ผ tail๋ก ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค. prev๋ฅผ ์ฐพ์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ์์์๋ถํฐ ์ฐพ์์์ผํ๋ค.
ํ์ด์ฌ ์ฝ๋ ๊ตฌํ
# 4. ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ฐ์ฐ - ์์์ ์ญ์
def popAt(self, pos):
# pop ๊ฐ์ด ์ ํจํ์ง ํ์ธ ์ ๋นํ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฐ์
if pos < 1 or pos > self.nodeCount:
raise IndexError
# ๋งจ ์์ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ
if pos == 1:
curr = self.head
self.head = self.getAt(pos+1)
# ์ ์ผํ ๋
ธ๋์ธ ๊ฒฝ์ฐ
if self.nodeCount == 1:
self.tail = None
self.head = None
# ๋งจ ์์ ๋
ธ๋๊ฐ ์๋ ๋
else:
prev = self.getAt(pos-1)
curr = self.getAt(pos)
prev.next = curr.next
# ๋งจ ๋ ๋
ธ๋์ผ ๋
if pos == self.nodeCount:
self.tail = prev
r = curr.data
self.nodeCount -= 1
return r
์๊ฐ ๋ณต์ก๋
- ๋งจ ์์์ ์ญ์ ํ๋ ๊ฒฝ์ฐ O(1)
- ์ค๊ฐ์์ ์ญ์ ํ๋ ๊ฒฝ์ฐ O(n)
- ๋งจ ๋์์ ์ญ์ ํ๋ ๊ฒฝ์ฐ O(n)
๋ ๋ฆฌ์คํธ์ ์ฐ๊ฒฐ def concat(self, L)
์ฐ๊ฒฐ ๋ฆฌ์คํธ self ์ ๋ค์ ๋ ๋ค๋ฅธ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ธ L ์ ์ด์ด๋ถ์
๋ ๋ฆฌ์คํธ์ ์ฐ๊ฒฐ ํ๋ฆ
ํ์ด์ฌ ์ฝ๋ ๊ตฌํ
# 5. ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฐ์ฐ - ๋ ๋ฆฌ์คํธ์ ์ฐ๊ฒฐ
def concat(self, L):
# ์๋ ๋ฆฌ์คํธ์ ๋งจ ๋์ด ์ด์ด๋ถ์ด๋ ค๋ ๋ฆฌ์คํธ์ ์ฒ์์ผ๋ก
self.tail.next = L.head
# L.tail์ด none์ธ ๊ฒฝ์ฐ ์คํ ์๋จ
if L.tail:
self.tail = L.tail
self.nodeCount += L.nodeCount
๋ค์ ์ด์ด๋ถ์ด๋ ค๋ ๋ฆฌ์คํธ L์ด ๋น ๋ฆฌ์คํธ์ธ ๊ฒฝ์ฐ tail์ด None๊ฐ์ด ๋์ด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ์ฒดํฌํด์ฃผ์ด์ผํ๋ค. L.tail์ด ์ ํจํ ๊ฒฝ์ฐ์๋ง self.tail = L.tail๋ก ํด์ค๋ค.
'(๊ตฌ)์๋ฃ๊ตฌ์กฐ&์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Doubly Listed Lists) (0) | 2020.06.19 |
---|---|
์ฐ๊ฒฐ ๋ฆฌ์คํธ (Linked List) - ๋๋ฏธ ๋ ธ๋ ์ถ๊ฐ (0) | 2020.06.19 |
์์ (0) | 2020.06.18 |
ํ์ด์ฌ ๋๋ ์ ์ ๋ ฅ๋ฐ๊ธฐ (0) | 2020.06.17 |
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ (recursive algorithms) (0) | 2020.06.17 |
- Total
- Today
- Yesterday
- java jdk ์ค์น
- ์๋ฐ
- java ํ๊ฒฝ๋ณ์
- ๋ณ๋ช ์ฒ๋ฆฌ
- tomcat์ค์น
- ์๋ฃ๊ตฌ์กฐ
- ์จ๋ฆฌ์์ค
- ๊ฒ์ํ ์กฐํ
- ๊ฒ์ํ๋ง๋ค๊ธฐ
- ๊ฒ์๋ฌผ ์ญ์
- ์ดํด๋ฆฝ์ค ํ๊ธ ์ธ์ฝ๋ฉ
- typeAliases
- Algorithm
- ์๊ณ ๋ฆฌ์ฆ
- ์ ์ฒด๊ฒ์๋ฌผ ์กฐํ
- ์ดํด๋ฆฝ์ค ์ค์น
- ๋ถํธ ์๋์์ฑ
- mysql์ค์น
- ์คํ๋ง๋ถํธ ์๋์์ฑ
- ๊ฒ์๋ฌผ์กฐํ
- ๊ฐ๋ฐ
- ๊ฐ๋ฐํ๊ฒฝ๊ตฌ์ถ
- Java
- ๊ฒ์ํ ์ญ์
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |