雜湊演算法是一種便於查詢字串的演算法
模板傳送
雜湊演算法(hash)其實就是把字串轉化為自己想要的雜湊值,這個值由自己的來定義。
列如:
給你一堆字串,判斷裡面有多少個回文字串,聽起來很簡單是不是?但是要是這個字串的資料很大,而且你不能用c++函式的輔助呢?(這裡是舉個列子哈,畢竟雜湊的用處很廣)這裡就很容易超時,這時候我們就要將每個字串做出一定的處理,使得判斷是否為回文的時候只需要o(1)的時間就夠了。
正式介紹:
雜湊就是把題目給出的字串,做出乙個處理(類似進製轉換)。如:給你字串 abcd 與 abde。我們就可以定義乙個int hash[size]的陣列把每個字串轉化成int型別來儲存(因為這樣可以直接比較是否相等,字元陣列則不行)
雜湊值
我們再定義乙個進製num = 277(先可以理解為隨意定,後面再解釋為什麼不可以隨意)我們就可以這樣
char str[4]
="abcd"
;int ans =0;
for(
int i =
0;i <
4;i++
) ans = ans *
num(轉化進製)
+(str[i]
-'0'
);
這個ans就是雜湊值,再比較倆個字串的雜湊值相不相等就容易了,那麼問題隨之而來,當字串很長時,那豈不是要爆掉int了?這裡我們就要再定義乙個模數mod = 很大的乙個數,這樣就不會爆掉了(最好開unsigned long long)。
雜湊衝突
但是問題還是有,雜湊值一樣,難道字串就一點相等嗎?(如 3 + 7 = 10 和 5 + 5 = 10 一樣)無論多好的雜湊處理,都存在雜湊衝突,也就是存在這種雜湊值相等但是字串不等的情況。在這裡我們就是盡可能的降低這種雜湊衝突。
如何降低雜湊衝突
與你的進製和模數相關。眾所周知,ascill碼有230多(應該叭。。沒記那麼清楚),那麼這個進製一定要選得比他大,但是也不是過度的大,257,277,599,1533,2634198563(合理的隨意)這些都可以,但是不要選擇模數的因數(不然模數怎麼模,沒意義了)。
接下來就是模數的選擇了,最好找乙個超級大的質數,(不然很容易被隨機資料給卡掉了),這個質數多大呢?最好不要1e9以內,和題的資料很容易衝突,如果能找到乙個1e18的質數就是最好的事情了。如19999999999999997等等。
但是,這不代表你不會被卡,只要出題人夠狠,再好的雜湊等於白給,這裡只是講一種思路,一種轉化方法,可以延伸到很多難題上面(傷心,我還是這麼的菜)。
模板題很好,建議初學者去做做
這裡附上我的模板題**(看不看都差不多啦。。。)
#include
using
namespace std;
#define newnode (treenode *)malloc(sizeof(treenode))
#define mem(a,b) memset(a,b,sizeof(a))
const
int n =
5e5+5;
const
int inf =
0x3f3f3f3f
;const
double eps =
1e-10
;const
unsigned
long
long mod =
19999999999999997
;const
int ii =
3.1415926535
;typedef
long
long ll;
typedef
unsigned
long
long ull;
ull hash[
10050];
char str[
10050];
int num =
279;
ull hash
(char str)
intmain()
int sum = n;
sort
(hash+
1,hash+n+1)
;for
(int i =
1;i < n;i++)if
(hash[i]
== hash[i+1]
) sum--
; cout << sum << endl;
}
雜湊演算法 介紹
1 概念 在資訊保安技術中,經常需要驗證訊息的完整性,雜湊 hash 函式提供了這一服務,它對不同長度的輸入訊息,產生固定長度的輸出。這個固定長度的輸出稱為原輸入訊息的 雜湊 或 訊息摘要 message digest 乙個安全的雜湊函式h必須具有以下屬性 l h能夠應用到大小不一的資料上。2 h能...
雜湊演算法(Hash函式)簡單介紹
雜湊演算法的定義和原理 將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則,就是雜湊演算法。而通過原始資料對映之後得到的二進位制值串就是雜湊值。設計乙個優秀的雜湊演算法,需要滿足下面幾點要求 a.從雜湊值不能反向推導出原始資料 所以雜湊演算法也叫單向雜湊演算法 b.對輸入的資料比較...
Redis 雜湊 Hash 介紹與基本操作
redis的雜湊可以讓使用者將多個鍵值對存在乙個redis鍵裡面,可以把一些相關資料存在一起,就像關聯式資料庫的行。命令操作 hget hmget的單引數版本 一次操作乙個值 hset hmset的單引數版本 一次操作乙個值 hmget hmget key name key key 從雜湊裡面獲取乙...