python數據結構學習筆記-2016-11-20-01-直方圖ADT

        11.6 直方圖(histograms)

        11.6.1 直方圖ADT

        直方圖ADT所包含的方法如下:

  • Histogram(catSeq):創建直方圖,catSeq爲指定的分類,每一個分類的頻數初始化爲零;
  • getCount(category):返回給定分類的頻數;
  • incCount(category):給定分類的頻數加一;
  • totalCount():返回所有分類的頻數之和;
  • iterator():直方圖的迭代器。
        建立直方圖

        從文件中讀取數據,建立一個直方圖。

#-*-coding: utf-8-*-

# 建立直方圖

from maphist import Histogram

def letterGrade(grade):
    if grade >= 90:
        return 'A'
    elif grade >= 80:
        return 'B'
    elif grade >= 70:
        return 'C'
    elif grade >= 60:
        return 'D'
    else:
        return 'F'

def printChart(gradeHist):
    print "\tGrade Distribution"
    letterGrades = ('A', 'B', 'C', 'D', 'F')
    for letter in letterGrades:
        print " |"
        print "%s +"
        freq = gradeHist.getCount(letter)
        print '*' * freq
    print " |"
    print " +----+----+----+----+----+----+----+----"
    print " 0    5    10   15   20   25   30   35"

def main():
    gradeHist = Histogram("ABCDF")
    gradeFile = open('cs101grades.txt', 'r')
    for line in gradeFile:
        grade = int(line)
        gradeHist.incCount(letterGrade(grade))
    printChart(gradeHist)

if __name__ == "__main__":
    main()



         直方圖的實現
         使用散列表來實現。
#-*-coding: utf-8-*-

# 直方圖的實現

from hashmap import HashMap

class Histogram(object):
    def __init__(self, catSeq):
        self._freqCounts = HashMap()
        for cat in catSeq:
            self._freqCounts.add(cat, 0)

    def getCount(self, category):
        assert category in self._freqCounts, "Invalid histogram category."
        return self._freqCounts.valueOf(category)

    def incCount(self, category):
        assert category in self._freqCounts, "Invalid histogram category."
        value = self._freqCounts.valueOf(category)
        self._freqCounts.add(category, value+1)

    def totalCount(self):
        total = 0
        for cat in self._freqCounts:
            total += self._freqCounts.valueOf(cat)
        return total

    def __iter__(self):
        return iter(self._freqCounts)

       11.6.2 彩色直方圖
        彩色直方圖的方法:
  • ColorHistogram():創建空的彩色直方圖;
  • getCount(red, green, blue):返回給定顏色的頻數;
  • incCount(red, green, blue):將給定顏色的頻數加一;
  • totalCount():返回所有顏色的頻數;
  • iterator():迭代器。
        實現彩色直方圖的手段有很多。最直觀的就是使用三維數組,但是這種手段太耗費內存。另外就是python列表或鏈表,但如果是處理一個包含百萬種顏色的圖像,效率會變得很低下。
        閉散列法也不是一種特別好的選擇,因爲再散列次數太多。開散列法,如果散列函數設計得好,則是一種較好的選擇。
        本例可以使用開散列法,使用二維數組作爲底層數組,確定red參數和green參數,而數組中的鏈表結點則表示blue 參數。

        對於含n像素的圖像,其直方圖的構造器的時間複雜度是O(n)。因爲,確定底層數組的索引是O(1),但要確定blue參數,則需在鏈表進行搜索操作,所以時間複雜度是O(n)。
        相應的遍歷,可以對二維數組遍歷,但效率太低。可以單獨儲存一個鏈表,用以記錄當前的所有顏色。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章