題目在 http://blog.csdn.net/lyy289065406/article/details/6647351
其實在面試中雜湊表是經常被問到的一個題目,不過實戰編程中運用的卻很少,因為很少有效率瓶頸。
這個題目就一道典型的可以用雜湊表可以加速的題目。
題目大意:每片雪花有 6 個角長度的值,對於不同的雪花而言,這些值可能被反轉,並且開頭的長度未必是一致的
例如 1 2 3 4 5 6和 4 3 2 1 6 5,雖然他們表面上不同,但是經過反轉和位移以後,就是相同的雪花。
在輸入資料中如果有相同的雪花,則輸出yes,否則輸出no。
這個題目為什麼適合用雜湊表呢,個人覺得主要一個原因是資料不好排序,因為六片花瓣順序被打亂了,如果資料不能有效排序,自然就不能有效檢索。
但是這些資料雖然 卻可以比較容易找到一個雜湊函數,將 被打亂的相同資料 映射到同一個雜湊值上。 然後在針對小規模的資料做檢索,能很高的提高效率。
這裡我們採用linking的方式來處理衝突。
另外關於雜湊函數的選擇 這裡使用 將所有資料加起來然後求餘數的方法來做,對於函數函數的研究,可能有更好的雜湊方法~ 不過這個題目這個做法足夠了
Source CodeProblem: 3349User: hopeztmMemory: 6776KTime: 1297MSLanguage: C++Result: AcceptedSource Code#include <stdio.h>#include <string.h>const int prime=999983;struct Snowflake{int v[6];Snowflake *next;Snowflake(){next = NULL;}};struct Entry{Snowflake *pEntry;Entry(){pEntry = NULL;}};Entry hashData[prime + 1];int GetHashCode(const Snowflake &flake){int s = 0;for( int i = 0; i < 6; i++){s += flake.v[i] % prime;s %= prime;}return s;}bool FlakeSame(const Snowflake &flake1,const Snowflake &flake2){int v[12] = {0};memcpy(v, flake1.v, sizeof(flake1.v));memcpy(v+6, flake1.v, sizeof(flake1.v));int i,j,k;for(i = 0; i < 6; i++){for( j = i, k = 0; k < 6; k++, j++){if(v[j] != flake2.v[k]){break;}}if( k == 6){return true;}}//reversefor( i = 0, j = 11; i < 6; i++, j--){int tmp = v[i];v[i] = v[j];v[j] = tmp;}for(i = 0; i < 6; i++){for( j = i, k = 0; k < 6; k++, j++){if(v[j] != flake2.v[k]){break;}}if( k == 6){return true;}}return false;}bool InsertIntoHash(Snowflake &flake){int id = GetHashCode(flake);if(hashData[id].pEntry == NULL){hashData[id].pEntry = &flake;return true;}else{Snowflake *p = hashData[id].pEntry;Snowflake *previous;while(p){if(FlakeSame(*p, flake)){return false;}previous = p;p = p->next;}previous->next = &flake;return true;}}Snowflake snowflakes[100001];int nflakes;int main(){while(scanf("%d", &nflakes) != -1){bool duplicate = false;for( int i = 0; i < nflakes; i++){scanf("%d%d%d%d%d%d", snowflakes[i].v, snowflakes[i].v + 1, snowflakes[i].v + 2, snowflakes[i].v + 3, snowflakes[i].v + 4, snowflakes[i].v + 5);if(!duplicate){if(!InsertIntoHash(snowflakes[i])){duplicate = true;}}}if(duplicate){printf("Twin snowflakes found.\n");}else{printf("No two snowflakes are alike.\n");}}return 0;}