Python的Huffman編碼的實現

     編程,一扯到算法的問題,就容易混亂,畢竟人的思惟和計算機的思惟,有時候轉換起來總會以爲什麼地方不對勁。huffman算法寫過不少次了,但有時候本身也老是會被搞混了,最近學了個新語言--python,因此本身也稍微嘗試了一下。python

class HuffmanItem:
    item = ""
    value = 0
    marked = False
    code = ""
    left = -1
    right = -1
    def __init__(self,item="",value=0):
        self.item = item
        self.value = value
class Huffman:
    arr = []
    result = []
    def __init__(self):
        self.initArr()
    def initArr(self):
        self.addItem("a",15)
        self.addItem("b",7)
        self.addItem("c",6)
        self.addItem("d",6)
        self.addItem("e",5)
    def addItem(self,item,value):
        if item and value > 0:
            self.arr.append(HuffmanItem(item,value))
    def initResult(self):
        for i in self.arr:
            self.result.append(i)
        for i in range(len(self.arr),2*len(self.arr)-1):
            self.result.append(HuffmanItem())
    def clearItem(self):
        self.arr = []
        self.result = []
    def getMinItem(self):
        index = 0
        value = 0
        item = ""
        for i in range(len(self.result)):
            if not self.result[i].marked and self.result[i].value > 0:
                if value == 0 or self.result[i].value < value:
                    index = i
                    value = self.result[i].value
                    item = self.result[i].item
        self.result[index].marked = True
        #print [index,value,item]
        return [index,value,item]
    def calcHuffman(self):
        index = len(self.arr)
        self.initResult()
        while index < len(self.result):
            ret1 = self.getMinItem()
            left = ret1[0]
            value1 = ret1[1]
            item1 = ret1[2]
            ret2 = self.getMinItem()
            right = ret2[0]
            value2 = ret2[1]
            item2 = ret2[2]
            self.result[index].item = item1+item2
            self.result[index].value = value1+value2
            self.result[index].left = left
            self.result[index].right = right
            index += 1
    def huffmanCoding(self,index,code):
        self.result[index].code += code
        left = self.result[index].left
        right = self.result[index].right
        if left >= 0:
            self.huffmanCoding(left,self.result[index].code+"0")
        if right >= 0:
            self.huffmanCoding(right,self.result[index].code+"1")
    def printResult(self):
        self.calcHuffman()
        index = len(self.result)
        self.huffmanCoding(index-1,"")
        info = ""
        count = 0
        for i in range(len(self.arr)):
            item =self.result[i]
            info += "{%s,%d,huffmanCode:%s} " \
                    %(item.item,item.value,item.code)+"\r\n"
            count += 1
        print info
        self.clearItem()
Huffman().printResult()


    代碼粘貼完了,說說本身的對這個算法的感悟吧,首先是在原有數組(長度爲n)的基礎上構造一個新數組(長度爲2n-1)。這個新數組的前n個元素和原有數組徹底一致,後面的n-1個元素初始化爲空。而後還須要有一個重新數組中還沒被標記的元素中篩選出最小元素的方法,調用該方法兩次,選擇出兩個所謂的最小值元素,用這兩個元素構造出一個新元素,把新元素填充到新數組的最後面,同時該新元素也成爲了一個能夠被篩選的對象,那兩個最小值元素也成爲了該新元素的左右孩子。依次循環到不能再進行選擇了,新數組也就構造完成了。以後就能夠從最後一個元素開始,對全部的元素進行huffman編碼了,這裏就是一個遞歸的操做,能夠看代碼理解,提及來會比較囉嗦。算法

    總結:本不太習慣在網上寫博客,印象中好像這應該是第一篇博文,並且仍是用比較繁瑣的語言在說這歷史悠久的huffman編碼,其中主要也是因爲本身不喜歡用僞代碼的方式描述,並且本身的所感所悟,也更傾向於用文字去闡述,哪怕是講算法,哪怕是文字顯得很乏味。編程

相關文章
相關標籤/搜索