在我正在编写的程序中,我想开发一种哈希算法,该算法可以将RGB颜色,字符串或二者都映射到唯一且相对较小的索引。开发哈希算法:将RGB颜色ID和字符串转换为Int
这里的目标是减少尽可能多的碰撞,保证没有两种颜色通过算法是类似的(感知;例如红色,蓝色,橙色)。
由于我的知识有限,数组似乎是直接访问数据结构的最佳选择,但我不想创建一个令人难以置信的大数组。鉴于我必须在C++中为数组分配内存,我在开发这样的算法时遇到了问题。
任何提示,感激!
在我正在编写的程序中,我想开发一种哈希算法,该算法可以将RGB颜色,字符串或二者都映射到唯一且相对较小的索引。开发哈希算法:将RGB颜色ID和字符串转换为Int
这里的目标是减少尽可能多的碰撞,保证没有两种颜色通过算法是类似的(感知;例如红色,蓝色,橙色)。
由于我的知识有限,数组似乎是直接访问数据结构的最佳选择,但我不想创建一个令人难以置信的大数组。鉴于我必须在C++中为数组分配内存,我在开发这样的算法时遇到了问题。
任何提示,感激!
您可以使用std::map
按颜色或标签访问Subject
。不需要为此开发自己的哈希算法,只需要创建比较运算符,在这种情况下应该很容易,假设您使用RGB颜色的32位整数,而label
使用std::string
。
编辑:其实你不需要做任何东西比图(无运营商定制),就这么简单:
typedef map<int, MyClass*, greater<int> > IntClassMap;
typedef map<std::string, MyClass*, greater<std::string> > StrClassMap;
IntClassMap inttable;
StrClassMap strtable;
void adding_the_data(){
inttable[0x11223344] = myclasspointer1;
inttable[0x11223345] = myclasspointer2;
inttable[0x11223346] = myclasspointer3;
strtable["test string1"] = myclasspointer1;
strtable["test string2"] = myclasspointer2;
strtable["test string3"] = myclasspointer3;
}
void accessing_example(){
strtable["test string1"]->something;
}
std::map
是非常快的,我不认为你需要(或找到)比这更快的解决方案。
为什么选择更大的比较器有什么具体原因吗?从我所能看到的情况来看,它默认较少。 – 2012-07-07 15:38:07
@JTCho,因为某种原因,我总是使用更多的东西,我不记得了,我想我遇到了一些问题,所以我选择“更大”来解释一些不为人知的神秘原因。但我想它也适用于'less'。 – Rookie 2012-07-07 15:52:37
我明白了。感谢您的帮助!这是非常赞赏。 – 2012-07-07 16:53:59
RGB颜色是否每个颜色元素有8位? (总共24位)。然后我没有看到它散列的点。另外,为什么不使用CRC32呢?你可以用它来散列任何数据。但是正如所说的,它没有意义用CRC32来散列小于或等于32位的数据。 – Rookie 2012-07-07 14:55:44
它有每个元素8位。请原谅我的问题,但为什么没有必要对它进行散列呢?正如你所看到的,我仍然在搞清楚什么东西。 – 2012-07-07 14:59:31
你能解释一下这一切的目的吗?我无法理解为什么你需要散列。你只是想通过一些随机值访问某个数组元素,例如你想要做些什么:'elements [“color_string_here”] = 1337'和'elements [0xFE63AA37CB] = 1337',然后访问那个元素并获得'1337'的价值......? – Rookie 2012-07-07 15:01:44