์งํฉ ADT
์งํฉ ADT๋ ์ ์ผํ ๊ฐ์ฒด๋ค์ ๋ด๋ ์ฉ๊ธฐ๋ฅผ ๋ชจ๋ธ๋งํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ค๊ณ ๋ฑํ๊ต ์์ ์ ๋ฐฐ์ด ์งํฉ๊ณผ ๊ฐ๋ค. ์ค๋ณต๋ ๊ฐ์ฒด๋ ์กด์ฌํ ์ ์๊ณ ์ค์ง ์ ์ผํ ๊ฐ์ฒด๋ง ํฌํจ๋ ์ ์๋ค.
์งํฉ ADT ๋ฉ์๋
ํฉ์งํฉ union(B) : ์งํฉ B์์ ํฉ์งํฉ์ ๋ฐํ
๊ต์งํฉ intersect(B) :์งํฉ B์์ ๊ต์งํฉ์ ๋ฐํ
์ฐจ์งํฉ subtract(B) : ์งํฉ B๋ฅผ ์ฐจ๊ฐํ ์ฐจ์งํฉ์ ๋ฐํ
์งํฉ A์ B์ ๊ดํ ์ฃผ์ ์์ ์ ์คํ์๊ฐ์ ์ต๋ O(|A| + |B|)์ด ๋์ด์ผ ํ๋ค!!
- ์ผ๋ฐ ๋ฉ์๋
integer size()
boolean isEmpty()
iterator elements()
- ์ง์ ๋ฉ์๋
boolean member(e) : ๊ฐ์ฒด e๊ฐ ์งํฉ์ ์์์ธ์ง ์ฌ๋ถ๋ฅผ ๋ฐํ
boolean subset(B) : ์งํฉ์ด ์งํฉ B์ ๋ถ๋ถ์งํฉ์ธ์ง ์ฌ๋ถ๋ฅผ ๋ฐํ
- ๊ฐฑ์ ๋ฉ์๋
addElem(e) : ์งํฉ์ ์์ e๋ฅผ ์ถ๊ฐ
removeElem(e) : ์งํฉ์ผ๋ก๋ถํฐ ์์ e๋ฅผ ์ญ์
- ์์ธ
emptySetExeption() : ๋น์ด ์๋ ์งํฉ์ ๋ํด ์ญ์ ํน์ ์ฒซ ์์๋ฅผ ์ ๊ทผ ์๋ํ ๊ฒฝ์ฐ ๋ฐ๋ น
์งํฉ ADT ๊ตฌํ
์งํฉ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํํ ์ ์๋ค. ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ ธ๋ ํ๋๋ ์งํฉ์์๋ฅผ ํํํ๋ฉฐ, ํจ์จ์ ์ํด ํค๋ ๋ฐ ํธ๋ ์ผ๋ฌ ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค!
๋ํ ์์๋ค์ ์ผ์ ํ ์์์ ์ํด ์ ๋ ฌ (์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์ ๋ฑ)๋์ด ์ ์ฅ๋๋ค.
์ฑ๋ฅ
๋ชจ๋ O(|A| + |B|) ์๊ฐ์ ์ํ๋๋ฉฐ, ์ด๋ addLast ์์ ์ O(1) ์๊ฐ์ ์ํํ๋ค๋ ์ ์ ํ์ ๋ณด์ฅ๋๋ค.
์งํฉ์ ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํ, ํน์ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํํ ๊ฒฝ์ฐ C์ ๋ง์ง๋ง ๋ ธ๋ ์์น๋ฅผ ๊ด๋ฆฌํ๋ค.
ํฉ์งํฉ, ๊ต์งํฉ, ์ฐจ์งํฉ, ์์๊ณผ ๋ถ๋ถ์งํฉ์ ์์ฌ์ฝ๋๋ฅผ ํ์ธํ์.
ํฉ์งํฉ์ ์์ฌ์ฝ๋
๊ต์งํฉ์ ์์ฌ์ฝ๋
์ฐจ์งํฉ์ ์์ฌ์ฝ๋
์์๊ณผ ๋ถ๋ถ์งํฉ์ ์์ฌ์ฝ๋
class Node:
def __init__(self,data,prev=None,next = None):
self.data = data
self.prev = prev
self.next = next
#์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌ์ฑ๋ ์งํฉ
class DLset:
def __init__(self):
self.header = Node("Header")
self.trailer = Node("Trailer",self.header)
self.header.next = self.trailer
self.setsize = 0
def isEmpty(self):
if self.setsize ==0:
return True
else:
return False
def printset(self):
if self.setsize == 0:
print("๊ณต์งํฉ")
else:
target = self.header
for i in range(self.setsize):
target = target.next
print(target.data,end=" <=> ")
# def member(self,e):
# if self.setsize == 0:
# return False
# else:
# target = self.header
# for i in range(self.setsize):
# target = target.next
# if target.data == e:
# return True
# return False
def member(self,e):
if self.setsize ==0:
return False
target = self.header.next
while True:
a = target.data
if a<e:
if target.next == None:
return False
else:
target = target.next
elif a>e:
return False
else:
return True
def addelem(self,e):
# if self.setsize==0:
# newnode = Node(e,self.header,self.trailer)
# self.header.next= newnode
# self.trailer.prev = newnode
# else:
# target = self.header
# newnode = Node(e) #์ฝ์
ํ ๊ฑฐ ์์ฑ
# for i in range(self.setsize):
# target = target.next
# target.next.prev
# target.next = newnode #์ฐ๊ฒฐ1
# newnode.prev = target #์ฐ๊ฒฐ2
# print(f"before : {self.trailer.prev.prev.data}")#" <=> {self.trailer.prev.data}")" <=> {self.trailer.data}")
newnode = Node(e,None,self.trailer)#Newnode_prev : None / Newnode_next = trailer
prev_trailer = self.trailer.prev
newnode.prev = prev_trailer#Newnode_prev : ์ ์ trailer์ ์ฐ๊ฒฐ๋์๋ ๋
ธ๋ / Newnode_next = trailer
prev_trailer.next = newnode
self.trailer.prev = newnode #trailer์ค์ ์๋ฃ
#print(f"After : {self.trailer.prev.prev.data} <=> {self.trailer.prev.data} <=> {self.trailer.data}")
self.setsize +=1
def removeElem(self, e):
if self.setsize==0:
print("Invalid position")
else:
target = self.header
for i in range(self.setsize):
target = target.next
if target.data == e:
break
prevnode = target.prev
nextnode = target.next
d = target.data
prevnode.next = nextnode
nextnode.prev = prevnode
del(target)
self.setsize -=1
def union(self,B):
c = []
while (not self.isEmpty()) and (not B.isEmpty()):
a = self.header.next.data
b = B.header.next.data
if a<b:
c.append(a)
self.removeElem(a)
elif a>b:
c.append(b)
B.removeElem(b)
else:
c.append(a)
self.removeElem(a)
B.removeElem(b)
while not self.isEmpty():
a = self.header.next.data
c.append(a)
self.removeElem(a)
while not B.isEmpty():
b = B.header.next.data
c.append(b)
B.removeElem(b)
return c
def intersect(self,B):
c = []
while (not self.isEmpty()) and (not B.isEmpty()):
a = self.header.next.data
b = B.header.next.data
if a<b:
self.removeElem(a)
elif a>b:
B.removeElem(b)
else:
c.append(a)
self.removeElem(a)
B.removeElem(b)
while not self.isEmpty():
a = self.header.next.data
self.removeElem(a)
while not B.isEmpty():
b = B.header.next.data
B.removeElem(b)
return c
def subtract(self,B):
c = []
while (not self.isEmpty()) and (not B.isEmpty()):
a = self.header.next.data
b = B.header.next.data
if a<b:
c.append(a)
self.removeElem(a)
elif a>b:
B.removeElem(b)
else:
self.removeElem(a)
B.removeElem(b)
while not self.isEmpty():
a = self.header.next.data
c.append(a)
self.removeElem(a)
while not B.isEmpty():
b = B.header.next.data
B.removeElem(b)
return c
def subset(self,B):
if self.setsize ==0:
return True
target = self.header.next
while True:
if B.member(target.data):
if target.next == None:
return True
else:
target = target.next
else:
return False
>>> A = DLset()
>>> B = DLset()
>>> A.addelem(1)
>>> A.addelem(2)
>>> A.addelem(3)
>>> B.addelem(2)
>>> B.addelem(3)
>>> B.addelem(4)
>>> A.union(B)
[1, 2, 3, 4]