Я постараюсь быть максимально ясным. Я уже реализовал свое решение, и оно работает, мне просто нужно знать, будет ли лучше использовать другую структуру данных вместо хэш-таблицы
Это вопрос колледжа, но я уже подчинился учителю, и он работает, я просто хотел посмотреть, поступит ли кто-нибудь по-другому.
Итак, вот в чем проблема:
С учетом изображения (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,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, который представляет собой массив объектов Patches.
например, * 1 020 *
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];
Хэш-таблица допускает коллизии, каждая позиция в таблице имеет список элементов.
Извините, если оно слишком большое, просто хотелось прояснить. Также извините, если мой английский недостаточно хорош!
спасибо.