雜湊的一種用法 判斷相等

2021-06-28 09:45:19 字數 1381 閱讀 3599

在輸入資料量比較大,時間要求比較高的情況下,判斷相等可以考慮雜湊的方法,比如,輸入10w、100w,時間要求4000ms、7000ms,用普通方法肯定要tle的,這時就需要hash。

首先要構造hash表,這裡根據輸入量來確定hash table的大小,比如poj3349中輸入量最大12w,所以最壞情況每一種雪花都不相等需要12w個雜湊項,所以這裡設定hash_base=12w以上的最小素數=120007(後面hash函式使用直接取餘法)。

這裡的構造相對簡單,每次插入乙個資料,這個資料都看成乙個hashnode,並且用cur標記它是第幾個hashnode。hashnode除了要有指向下乙個hashnode的next指標外(如果兩個hashnode雜湊值相同,則對映到hash table的同乙個位址處),還要有判斷兩個hashnode是否相等的變數,這裡認為如果兩個hashnode的num陣列相等,就認為兩個hashnode是同一片雪花。

const int hash_base = 1200007;//100000*12以上的最小素數  

const int node_number = 1200010;//node個數

int hashtable[hash_base];

int cur;

struct hashnode;

hashnode node[node_number];

void inithashtable()

}

雜湊函式:

unsigned gethash(int num)  

return value%hash_base;

}

插入資料:

void inserthashnode(int num, unsigned value)  

node[cur].next = hashtable[value];

hashtable[value] = cur;

cur++;

}

程式的進行是一邊讀資料,一邊構建hash table,一邊判斷當前讀到的資料是否與已經在hash table中的資料相等進行的.

bool searchhash(int num)  

inserthashnode(num, value);

return false;

}

即如果發現該資料的雜湊值與其它衝突(hashtable[value]!=-1),就比較是否相等,不想等就插入到表中。

poj3247也是同樣模式,最大資料有10w個,即10w行,因此不能直接列舉找最大距離,必須用hash查詢相同行,找到相同行再比較最大距離,看是否更新最大距離。

alarm的一種用法。

alarm函式可以用於防止讀阻塞。但如果系統呼叫是自動重啟動的,當從sigalrm訊號處理程式返回時,read並不被中斷。在這種情形下,設定時間限制不起作用。一 源 cat n 10 10.c 1 include apue.h 23 static void sig alarm int sig no ...

Oracle update的一種用法

用於大資料量的更新,效率比較高,括號內的select語句為虛擬表,要求where欄位必須是主鍵或唯一索引 b.customer id和a.customer id 記錄一下,以後用得上。例子 update select a.city name,b.city name as new name from ...

中文編碼的一種用法

這裡通過乙個測試某些ip位址是否為特定 的例子來說明。我們假設該 的編碼用的是gb2312,並通過獲取該 的title作為檢測依據。usr bin env python encoding utf 8 略去獲取網頁的 re.ignorecase title 論壇標題 m re.search title...