資料結構之雜湊(poj3274)

2021-06-20 20:00:02 字數 1461 閱讀 9316

寒假集訓的時候學習了一下雜湊,但是一直沒有練習,這幾天找了幾道雜湊的題目,發現忘的差不多了。

做了幾道題之後發現雜湊真的是乙個很高效的資料結構,體驗到了資料結構的強大。

構建雜湊表示為了能夠更高效率的查詢,還記得小學的時候查字典嗎?其實雜湊就相當於那樣乙個東西,他把資料按照一定的雜湊函式生成乙個鍵值,然後把所有鍵值相同的存在乙個相同的陣列中,然後查詢的時候首先找它的鍵值,找到鍵值之後只用在鍵值相同的這個陣列中查詢就行了。

原理就是這樣,要想真正了解雜湊表,還要幾道題目練習,首先雜湊表可以用二維結構體儲存,因為你不知道每乙個鍵值後面有多少個元素,所以用二維結構體儲存的話後面一維的大小不好確定,而且有些題目對記憶體的要求比較嚴格,每個都開那麼大的話會浪費很多的記憶體,所以一般都會用乙個陣列鍊錶。但是鍊錶又不好寫。

那麼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...