Python Algorithm Study - Week 9, 10
2017-09-14
Problem Solving with Algorithms and Data Structures using Python ์ฑ ์ ์ฝ์ผ๋ฉฐ ์คํฐ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ์ฌ ์ฐ์ฌํฉ๋๋ค.
{
"data":{
"message":"Hello, world!"
}
}
The string "Hello, world!" is the payload, while the rest is protocol overhead.
List of Lists representation
myTree = ['a', ['b', ['d',[],[]], ['e',[],[]] ], ['c', ['f',[],[]], []] ]
Priority Queue
Heap
# Basic operations of binary min heap
BinaryHeap()
insert(k)
findMin() # ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฆฌํด๋ง ํ๋ค.
delMin() # ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฆฌํดํ๋ฉด์ ์ญ์ ํ๋ค.
isEmpty()
size()
buildHeap(list) # key ๊ฐ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ก์ด heap์ ๋ง๋ ๋ค.
The Structure Property
p
์ ์๋ฆฌ์ ์๋ค๊ณ ํ ๋, ์ด ๋
ธ๋์ left child๋ 2p
์๋ฆฌ์ ์๋ค. right child ์ ์๋ฆฌ๋ 2p+1
์ด๋ค. ๋น์ฐํ p์ ๋ถ๋ชจ ๋
ธ๋์ ์๋ฆฌ๋ p/2
์ด๋ค.The Heap Order Property
class BinHeap:
def __init__(self):
self.heapList = [0] # this zero is not used, but is there so that simple integer division can be used in later methods.
self.currentSize = 0
def insert(self,k):
self.heapList.append(k)
self.currentSize = self.currentSize + 1
self.percUp(self.currentSize)
def percUp(self,i): # i์๋ currentSize๊ฐ ๋ค์ด๊ฐ
while i // 2 > 0:
if self.heapList[i] < self.heapList[i // 2]: # ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฃ์ ๊ฐ๋ณด๋ค ๋ถ๋ชจ๋
ธ๋๊ฐ ํด๋,
self.heapList[i // 2], self.heapList[i] = self.heapList[i], self.heapList[i //2] # ๋ถ๋ชจ๋ ์์์ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ฃผ๊ณ
i = i // 2 # root๊น์ง ์ฌ๋ผ๊ฐ๋ค ์จ๋ค. ์ด๊ฑฐ ๋๋ฌธ์ (O(logn))
# ์ด ๊ณผ์ ์ ๊ฑฐ์น๋ ๋์ siblings์๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค!
...
def delMin(self):
retval = self.heapList[1] # __init__์์ ์ ์ผ ์ฒซ ๋
ธ๋๋ 0์ด๊ธฐ ๋๋ฌธ์ ์ค์ง์ ์ผ๋ก heap์ root๋ self.heapList[1] ์ด๋ค.
self.heapList[1] = self.heapList[self.currentSize] # ๊ฐ์ฅ ๋ง์ง๋ง ๊ฐ์ root์ ๋ฃ์ด์ค๋ค.
self.currentSize = self.currentSize - 1
self.heapList.pop() # leaf node ์๋ฆฌ๋ก ์ฎ๊ฒจ์จ ์ต์๊ฐ์ ์ ๊ฑฐ
self.percDown(1)
return retval
def percDown(self,i): # ์ค์!: i์๋ฆฌ์ ์๋ ๋
ธ๋์ ์์์ i*2๋๋ i*2+1์ด๋ค.
while (i * 2) <= self.currentSize: # ๋ง์ง๋ง ๋
ธ๋๊น์ง ๊ฒ์ฌ (1, 2, 4 ๊น์ง ๊ฐ)
mc = self.minChild(i) # self.heapList[i]์ ์์ ์ค์ ์์ ์์์ ์๋ฆฌ = mc
if self.heapList[i] > self.heapList[mc]: # ์์ ์์์ด ์๊ธฐ๋ณด๋ค ์๋ค๋ฉด...
self.heapList[mc], self.heapList[i] = self.heapList[i], self.heapList[mc] # ๊ทธ ์์๊ณผ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค.
i = mc # ์์ ๊ณผ์ ๋ฐ๋ณต
def minChild(self,i): # right node์ left node ์ค ๋ ์์ ๊ฒ ์ฐพ๊ธฐ
if i * 2 + 1 > self.currentSize:
return i * 2
else:
if self.heapList[i*2] < self.heapList[i*2+1]:
return i * 2
else:
return i * 2 + 1
...
def buildHeap(self,alist):
i = len(alist) // 2 # ๊ฐ์ฅ ๋ง์ง๋ง ๋
ธ๋์ ๋ถ๋ชจ ์๋ฆฌ
self.currentSize = len(alist)
self.heapList = [0] + alist[:]
while (i > 0):
self.percDown(i) # ๋ง์ง๋ง ๋
ธ๋ ์ค ์์ ๊ฒ๊ณผ ๋ถ๋ชจ ๋
ธ๋ ๋น๊ตํด์ ๋ถ๋ชจ๊ฐ ๋ ํฌ๋ฉด ์๋ฆฌ ๋ฐ๊ฟ
i = i - 1 # ์๊น ๊ทธ ๋ถ๋ชจ์ sibling ๋ ๋๊ฐ์ด ์๋ฆฌ๋ฐ๊ฟ ํด์ฃผ๊ธฐ