手寫雜湊表

qq_42247231發表於2020-09-28

點選上方藍字關注我,我們一起學程式設計
歡迎小夥伴們分享、轉載、私信、讚賞

微信搜尋:程式設計筆記本
微信搜尋:程式設計筆記本
微信搜尋:程式設計筆記本

是的,在面試深信服的時候,面試官讓我 10min 手寫雜湊表(/微笑)。沒錯,我沒寫出來,於是我自己花了 20*10min 自己寫了一個簡單的雜湊表出來。在這裡貼出來,小夥伴可以提提意見,交流一波~

#include <bits/stdc++.h>
using namespace std;

#define MAXSIZE 10       // 雜湊值
#define UNIONSIZE 100    // 共用體的字元長度

/* 雜湊表底層連結串列節點 */
template<typename K, typename V>
struct Node {
    K key;
	V value;
	struct Node* next;
};

/* 用於計算雜湊值的共用體 */
template<typename K>
union Union {
    K key;
	char ch[UNIONSIZE];

	Union(K _key) : key(_key) {}
};

/* 雜湊表類 */
template<typename K, typename V>
class HashTable {
private:
    Node<K, V>* node[MAXSIZE];    // 底層連結串列

public:
    HashTable();                                // 建構函式
	int hash(const K key);                      // 雜湊函式
	Node<K, V>* lookup(const K key);            // 查詢函式
	void insert(const K key, const V value);    // 插入函式
	V get(const K key);                         // 訪問函式
};

/* 建構函式 */
/* 將雜湊表底層連結串列置空 */
template<typename K, typename V>
HashTable<K, V>::HashTable() {
	for (int i = 0; i < MAXSIZE; ++i) {
		node[i] = nullptr;
	}
}

/* 雜湊函式 */
/* 簡單地利用共用體進行雜湊計算 */
template<typename K, typename V>
int HashTable<K, V>::hash(const K key) {
    int hashValue = 0;
	unsigned int len = sizeof(key) > UNIONSIZE ? UNIONSIZE : sizeof(key);
	Union<K> u(key);

	for (int i = 0; i < len; ++i) {
		hashValue += u.ch[i];
	}

	return hashValue % MAXSIZE;
}

/* 查詢函式 */
template<typename K, typename V>
Node<K, V>* HashTable<K, V>::lookup(const K key) {
	Node<K, V>* nd;
	int hashValue = hash(key);

	for (nd = node[hashValue]; nd != nullptr; nd = nd->next) {
		if (nd->key == key) {
			return nd;
		}
	}

	return nullptr;
}

/* 插入函式 */
/* 若鍵已存在,則更新值;否則建立新的鍵值對 */
template<typename K, typename V>
void HashTable<K, V>::insert(const K key, const V value) {
	Node<K, V>* nd = lookup(key);

	if (nd == nullptr) {
		int hashValue = hash(key);
		nd = (Node<K, V>*)malloc(sizeof(Node<K, V>));
		nd->key = key;
		nd->next = node[hashValue];
		node[hashValue] = nd;
	}
	
	nd->value = value;
}

/* 訪問函式 */
/* 若鍵存在,則返回其值;若鍵不存在,則插入鍵值對,並將值置為該型別的零值 */
template<typename K, typename V>
V HashTable<K, V>::get(const K key) {
    V value = (V)(0);
	Node<K, V>* nd = lookup(key);

	if (nd == nullptr) {
		insert(key, value);
		nd = lookup(key);
	}
	
	return nd->value;
}


int main()
{
	HashTable<int, int> hashTable;

	hashTable.insert(1, 100);
	hashTable.insert(2, 200);

	cout << hashTable.get(1) << endl;
	cout << hashTable.get(2) << endl;
	cout << hashTable.get(3) << endl;

	return 0;
}

/*
編譯執行:

jincheng@DESKTOP$ g++ test.cpp -o test
jincheng@DESKTOP$ ./test
100
200
0
jincheng@DESKTOP$
*/

小夥伴們有什麼好的點子或者意見,記得參與討論告訴我哦~

微信搜尋:程式設計筆記本
微信搜尋:程式設計筆記本
微信搜尋:程式設計筆記本

相關文章