【发布时间】:2011-02-10 11:37:42
【问题描述】:
我会尽量说清楚。我已经实现了我的解决方案并且它有效,我只需要知道是否最好使用其他数据结构而不是哈希表
这是一个大学问题,但我已经提交给老师并且它有效,我只是想看看是否有人会做不同的事情。
所以,这就是问题所在:
给定图像(PPM 3,所有数据以 ASCII 格式存储在 RGB 中) 例如
P3
# The P3 means colors are in ASCII, then 3 columns and 2 rows,
# then 255 for max color, then RGB triplets
3 2
255
255 0 0 0 255 0 0 0 255
255 255 0 255 255 255 0 0 0
我需要将每个像素除以一个常数,即 2 的幂 (2,4,8…………64,128)
c= 32;
Pixel2(255/c,255/c,255/c) = Pixel2(7,7,7)
然后,我需要将所有像素转换为给定宽度的补丁,补丁将累积它包含的像素的RGB值
例如
w=3; imageW = 10; imageH=10;
Patch[0].r = Pixel[0].r + Pixel[1].r + Pixel[2].r +
Pixel[10].r + Pixel[11].r + Pixel[12].r +
Pixel[20].r + Pixel[21].r + Pixel[22].r;
Patch[0].g = Same for g component;
Patch[0].b = Same for b component;
Patch[1].r = Pixel[1].r + Pixel[2].r + Pixel[3].r +
Pixel[11].r + Pixel[12].r + Pixel[13].r +
Pixel[21].r + Pixel[22].r + Pixel[23].r;
etc…
然后,我需要计算图像中每个补丁的重复次数。 所以,我所做的是我有一个 Image 类,它从文件(ifstream)中读取图像,还有一个 Pixel 类,它具有 r、g、b 和 nAparations 组件。我读取像素,将它们除以给定的常数,然后得到累积像素值的补丁。
在此之后,我们的 Image 类中有一个数据向量,它是一个补丁对象数组 例如
data = [Patch0{r comp,g comp, b comp, 1 parition}, Patch1{r comp,g comp, b comp, 1 parition} …..];
现在,我所做的是使用哈希表,插入每个补丁,如果它已经插入,只需更新它的 nAppearances 组件,如果没有,插入它。 全部插入后,返回一个包含哈希表中所有元素的向量。 这个向量,每个补丁只会出现一次,它的 nAppearances 组件将包含每个补丁在图像中出现的次数。
还有其他方法吗?还是哈希表是最好的方法?
另外,你会使用什么样的哈希函数?目前我正在使用
hash = patch.r * 1 + patch.g *2 + patch.b*3;
tableSize = maximun number of patches (assuming no one repeats)
insert into table[hash%tableSize];
哈希表允许冲突,表中的每个位置都有一个元素列表。
对不起,如果它太大了,只是想清楚一点。如果我的英语不够好也很抱歉! 谢谢。
【问题讨论】:
-
嗯,我是这个课题的讲者之一,也是这个学生参加的编程大赛的组织者。随意帮助他,但假设学生必须自己解决比赛,或者只是阅读不同的编程资源而不使用对社区的主动查询。无论如何,当我检测到这个查询时,任何其他参与者都可以,并且完全禁止复制............
标签: c++ optimization hashtable repeat