자료ꡬ쑰 및 μ‹€μŠ΅

자료ꡬ쑰 및 μ‹€μŠ΅ - [5] μ§‘ν•© Set (1)

Mainyoung 2022. 1. 26. 21:06

μ§‘ν•© 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