Chatbox

Các bạn vui lòng dùng từ ngữ lịch sự và có văn hóa,sử dụng Tiếng Việt có dấu chuẩn. Chúc các bạn vui vẻ!
21/10/2013 21:10 # 1
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
[code OLP ACM -2013] Problem B - Cuckoo Hashing


 Problem B
Cuckoo Hashing
 
One of the most fundamental data structure problems is
the dictionary problem: given a set D of words you want to
be able to quickly determine if any given query string q is
present in the dictionary D or not. Hashing is a well-known
solution for the problem. The idea is to create a function
h : §¤ ! [0..n − 1] from all strings to the integer range
0, 1, .., n − 1, i.e. you describe a fast deterministic program
which takes a string as input and outputs an integer between
0 and n−1. Next you allocate an empty hash table T of size
n and for each word w in D, you set T[h(w)] = w. Thus, given a query string q, you only
need to calculate h(q) and see if T[h(q)] equals q, to determine if q is in the dictionary.
Seems simple enough, but aren’t we forgetting something? Of course, what if two words
in D map to the same location in the table? This phenomenon, called collision, happens
fairly often (remember the Birthday paradox: in a class of 24 pupils there is more than
50% chance that two of them share birthday). On average you will only be able to put
roughly
p
n-sized dictionaries into the table without getting collisions, quite poor space
usage!
A stronger variant is Cuckoo Hashing1. The idea is to use two hash functions h1 and
h2. Thus each string maps to two positions in the table. A query string q is now handled
as follows: you compute both h1(q) and h2(q), and if T[h1(q)] = q, or T[h2(q)] = q, you
conclude that q is in D. The name “Cuckoo Hashing” stems from the process of creating
the table. Initially you have an empty table. You iterate over the words d in D, and
insert them one by one. If T[h1(d)] is free, you set T[h1(d)] = d. Otherwise if T[h2(d)] is
free, you set T[h2(d)] = d. If both are occupied however, just like the cuckoo with other
birds’ eggs, you evict the word r in T[h1(d)] and set T[h1(d)] = d. Next you put r back
into the table in its alternative place (and if that entry was already occupied you evict
that word and move it to its alternative place, and so on). Of course, we may end up
in an infinite loop here, in which case we need to rebuild the table with other choices of
hash functions. The good news is that this will not happen with great probability even if
D contains up to n/2 words!
 
Input specifications
On the first line of input is a single positive integer 1 · t · 50 specifying the number of
test cases to follow. Each test case begins with two positive integers 1 · m · n · 10000
on a line of itself, m telling the number of words in the dictionary and n the size of the
hash table in the test case. Next follow m lines of which the i:th describes the i:th word
di in the dictionary D by two non-negative integers h1(di) and h2(di) less than n giving
1Cuckoo Hashing was suggested by the danes R. Pagh and F. F. R¨odler in 2001
6 NCPC 2007 Problem B: Cuckoo Hashing
the two hash function values of the word di. The two values may be identical.
 
Output specifications
For each test case there should be exactly one line of output either containing the string
“successful hashing” if it is possible to insert all words in the given order into the
table, or the string “rehash necessary” if it is impossible.
 
Sample input
2
3 3
0 1
1 2
2 0
5 6
2 3
3 1
1 2
5 1
2 5
 
Output for sample input
successful hashing
rehash necessary
 

 



======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
21/10/2013 21:10 # 2
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
Phản hồi: [code OLP ACM -2013] Problem B - Cuckoo Hashing


#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
int t;
void process(){
        while (t-- > 0) {
            int m,n;
            cin>>m>>n;
            int h[m][2];
            int used[n];
            memset(used,-1,sizeof(used));
            bool infinitive = false;
            for (int i = 0; i < m; i++) {
                cin>>h[i][0];
                cin>>h[i][1];
                if (used[h[i][0]] == -1) {
                    used[h[i][0]] = i;
                } else if (used[h[i][1]] == -1) {
                    used[h[i][1]] = i;
                } else if (!infinitive) {
                    int temp = h[i][0];
                    int index = i;
                    while (used[temp] != -1 && !infinitive) {
                        int temp2 = used[temp];
                        used[temp] = index;
                        index = temp2;
                        temp = h[index][0] + h[index][1] - temp;
                        if (index == i && h[index][0] == temp) {
                            infinitive = true;
                        }
                    }
                    used[temp] = index;
                }
            }
            if (infinitive) {
                cout<<"rehash necessary"<<endl;
            } else {
                cout<<"successful hashing"<<endl;
            }
        }
    }
int main(){
    freopen("cuckoohashing.txt","r",stdin);
    cin>>t;
    process();
    return 0;
}

 
 


======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
Copyright© Đại học Duy Tân 2010 - 2024