POJ 3349 第一道雜湊

2021-06-08 07:25:30 字數 1559 閱讀 5458

題目在 

其實在面試中雜湊表是經常被問到的乙個題目,不過實戰程式設計中運用的卻很少,因為很少有效率瓶頸。

這個題目就一道典型的可以用雜湊表可以加速的題目。

題目大意:每片雪花有 6 個角長度的值,對於不同的雪花而言,這些值可能被反轉,並且開頭的長度未必是一致的

例如 1 2 3 4 5 6和 4 3 2 1 6 5,雖然他們表面上不同,但是經過反轉和偏移以後,就是相同的雪花。 

在輸入資料中如果有相同的雪花,則輸出yes,否則輸出no。

這個題目為什麼適合用雜湊表呢,個人覺得主要乙個原因是資料不好排序,因為六片花瓣順序被打亂了,如果資料不能有效的排序,自然就不能有效的檢索。

但是這些資料雖然 卻可以比較容易找到乙個雜湊函式,將 被打亂的相同資料 對映到同乙個雜湊值上。 然後在針對小規模的資料做檢索,能很高的提高效率。

這裡我們採用linking的方式來處理衝突。

另外關於雜湊函式的選擇 這裡使用 將所有資料加起來然後求餘數的方法來做,對於函式函式的研究,可能有更好的雜湊方法~ 不過這個題目這個做法足夠了

source code

problem: 3349 user: hopeztm

memory: 6776k time: 1297ms

language: c++ result: accepted

source code

#include #include const int prime=999983;

struct snowflake

};struct entry

};entry hashdata[prime + 1];

int gethashcode(const snowflake &flake)

return s;

}bool flakesame(const snowflake &flake1,const snowflake &flake2)

; 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++)

}if( k == 6)

}//reverse

for( i = 0, j = 11; i < 6; i++, j--)

for(i = 0; i < 6; i++)

}if( k == 6)

}return false;

}bool insertintohash(snowflake &flake)

else

previous = p;

p = p->next;

} previous->next = &flake;

return true; }}

snowflake snowflakes[100001];

int nflakes;

int main()

}} if(duplicate)

else

}return 0;

}

poj1042 黑書第一道貪心題

題意就不說了,主要講講思路以及注意的地方。思路 是按黑書上給出的思路編的,主要是貪心 列舉。因為每個池塘只能走一次,可以列舉前1,2,3,n個池塘之間所能釣的最大魚數。我們可以將路程一次性處理完畢,這樣就可以瞬移.每次瞬移到魚最多的池塘釣魚就好。有點遺憾,他們說可以用dp做,想了許久,沒想明白dp怎...

pwn題解第一道

今天聽說了乙個 pwnable.kr。很適合初學者,就試著做了一道題目。第一道題目,按照網頁上給的鏈結,使用putty鏈結工具聯入。輸入ls命令檢視檔案內容。很開心的看到了flag檔案,於是直接開啟,果然不出所料,我是沒有許可權開啟的。然後檢視了一下fd.c的 include include inc...

課堂第一道題

includevoid funstr char str1 main void funstr char str1 printf n printf s hello world hello world hwhello world hello world process exited after 4.466...