๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต

์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต - [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]

 

728x90