在輸入資料量比較大,時間要求比較高的情況下,判斷相等可以考慮雜湊的方法,比如,輸入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...