python数据结构学习笔记-2016-11-20-01-直方图ADT
2016-12-31 18:46
826 查看
11.6 直方图(histograms)
11.6.1 直方图ADT
直方图ADT所包含的方法如下:
Histogram(catSeq):创建直方图,catSeq为指定的分类,每一个分类的频数初始化为零;
getCount(category):返回给定分类的频数;
incCount(category):给定分类的频数加一;
totalCount():返回所有分类的频数之和;
iterator():直方图的迭代器。
建立直方图
从文件中读取数据,建立一个直方图。
直方图的实现
使用散列表来实现。
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)。
相应的遍历,可以对二维数组遍历,但效率太低。可以单独储存一个链表,用以记录当前的所有颜色。
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)。
相应的遍历,可以对二维数组遍历,但效率太低。可以单独储存一个链表,用以记录当前的所有颜色。
相关文章推荐
- python数据结构学习笔记-2016-11-18-01-散列表ADT
- python数据结构学习笔记-2016-11-05-01-队列ADT及其实现
- python数据结构学习笔记-2016-10-15-01-矩阵ADT
- python数据结构学习笔记-2016-11-11-01-递归
- python数据结构学习笔记-2016-10-17-01-集合
- python数据结构学习笔记-2017-01-08-01-N皇后问题、迷宫问题和跳马问题的递归解决
- python数据结构学习笔记-2016-11-27-01-二叉树
- python数据结构学习笔记-2016-10-27-02-使用单链表实现包ADT
- python数据结构学习笔记-2016-10-22-01-评价python列表
- python数据结构学习笔记-2016-12-04-01-Morse电码
- python数据结构学习笔记-2016-12-03-01-堆排序
- python数据结构学习笔记-2016-10-07-01-完善后的mydate.py
- python数据结构学习笔记-2016-11-09-01-文本编辑器
- python数据结构学习笔记-2016-11-23-01-归并排序
- python数据结构学习笔记-2016-10-28-01-带尾指针的链表和排序链表
- python数据结构学习笔记-2016-10-24-01-排序列表
- python数据结构学习笔记-2016-11-02-01-栈的应用
- python数据结构学习笔记-2016-11-26-01-链表排序
- python数据结构学习笔记-2016-11-24-01-快速排序
- python数据结构学习笔记-2016-12-10-01-AVL树