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)。
        相应的遍历,可以对二维数组遍历,但效率太低。可以单独储存一个链表,用以记录当前的所有颜色。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值