在我正在編寫的程序中,我想開發一種哈希算法,該算法可以將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