寒假集訓的時候學習了一下雜湊,但是一直沒有練習,這幾天找了幾道雜湊的題目,發現忘的差不多了。
做了幾道題之後發現雜湊真的是乙個很高效的資料結構,體驗到了資料結構的強大。
構建雜湊表示為了能夠更高效率的查詢,還記得小學的時候查字典嗎?其實雜湊就相當於那樣乙個東西,他把資料按照一定的雜湊函式生成乙個鍵值,然後把所有鍵值相同的存在乙個相同的陣列中,然後查詢的時候首先找它的鍵值,找到鍵值之後只用在鍵值相同的這個陣列中查詢就行了。
原理就是這樣,要想真正了解雜湊表,還要幾道題目練習,首先雜湊表可以用二維結構體儲存,因為你不知道每乙個鍵值後面有多少個元素,所以用二維結構體儲存的話後面一維的大小不好確定,而且有些題目對記憶體的要求比較嚴格,每個都開那麼大的話會浪費很多的記憶體,所以一般都會用乙個陣列鍊錶。但是鍊錶又不好寫。
那麼vector就能解決這個問題,因為vector是乙個動態的儲存結構,下面來看一道題目。
陣列sum[i][j]表示從第1到第i頭cow屬性j的出現次數。
所以題目要求等價為:
求滿足sum[i][0]-sum[j][0]=sum[i][1]-sum[j][1]=.....=sum[i][k-1]-sum[j][k-1] (j中最大的i-j
將上式變換可得到
sum[i][1]-sum[i][0] = sum[j][1]-sum[j][0]
sum[i][2]-sum[i][0] = sum[j][2]-sum[j][0]
......
sum[i][k-1]-sum[i][0] = sum[j][k-1]-sum[j][0]
令c[i][y]=sum[i][y]-sum[i][0] (0初始條件c[0][0~k-1]=0
所以只需求滿足c[i]==c[j] 中最大的i-j,其中0<=jc[i]==c[j] 即二維陣列c第i行與第j行對應列的值相等,
那麼原題就轉化為求c陣列中 相等且相隔最遠的兩行的距離i-j。
這裡的這個轉化是很重要的,沒辦法轉化的話就別想雜湊了。題目坑點比較多。wa了好多次之後才ac。
ac**:
#include #include #include #include using namespace std;
const int n = 15000;
const int mod = 14997;
struct node
;vectorhash[n];
bool solve(node x,node y,int k)
sum=(sum+15000)%mod;
ans.count=i;
hash[sum].push_back(ans);
}if(n==1)
for(int i=0;i<15000;i++)}}
}hash[i].clear();
}printf("%d\n",max);
}return 0;
}
poj3274陣列的雜湊
poj3274 這道題做得坎坷啊,剛開始沒注意看hint,硬生生地一直看不懂題意。好不容易看懂題目後也沒什麼思路。參看別人的思路後了下面巨醜無比的 懶得改了。這道理給我的收穫就是,有些題目不能急,是需要先用數學推理一些等價關係後才會知道該用什麼演算法的。思路 sum i j 前i頭牛的feature...
poj 3274 數的雜湊
據說這題很經典噢 開始的分析也經典。題目的分析我就不多說了,具體可以參考 一看就很清楚了 感謝這位博主 但他用的hash函式我暫時是不能理解,說以沒用它的方法。自己寫了個簡單的hash方法,似乎還挺湊效,然後再處理衝突。一開始時,我是先hash一邊,然後再來個for迴圈來判斷每個hash值.tle。...
資料結構之雜湊
題目1 實現乙個簡單的雜湊結構 使用youlookdeliciousc的做法,即用拉鍊表來實現。技巧是vector來做為容器 struct node int len 1000 class myhashmap void put int key,int value pre cur cur cur nex...