μλ£κ΅¬μ‘° λ° μ€μ΅ - [5] μ§ν© Set (1)
μ§ν© 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]