雜湊表是常見資料結構中一種擁有高效插入,高效查詢的結構,時間複雜度為o(1)。
閉雜湊雜湊的不足之處就是隨著衝突的資料增多,插入的效率也會隨之變慢,為了優化閉雜湊雜湊的效率,我們可以採取以下的方式:
>1.當插入的資料佔總大小的一定比率的時候,也稱負載因子,我們可以對雜湊表進行擴容,重新通過雜湊函式求得位置插入。
>2.我們可以採用素數表的形式,來減少雜湊衝突的可能。
>3.通過更好優化的雜湊函式,來減少衝突的可能。
每次擴容,帶來的也是巨大的開銷,首先要開闢新的空間,其次,重新插入需要通過雜湊函式重新求得新插入的位置。
1。我們通過對每個雜湊節點進行標記,三種標記分別為empty空白,delete刪除,exist存在。分別表示此處沒有插入過資料,插入過資料但當前位置資料已經刪除,此處存在資料。
2。當我們進行查詢的時候,如果前k值通過雜湊函式求得位置向後查詢,如果為empty則停下,當找到表的尾部,然後從0開始繼續查詢。
3。當我們插入的時候,同理求得插入位置,如果該位置已經有值,我們向後查詢,當遇到empty或者delete時,該位置沒有資料,在該位置插入。
我們在插入時,通過函式checkloadfactor()來檢測當前負載因子,當負載因子當到我們設定的比率時,我們採用對雜湊表進行擴,擴容的大小為每次素數表中的下乙個素數大小。
本次雜湊表中的雜湊函式,使用的是直接定值法。
#include
#include
using
namespace
std;
enum condition
;template
struct hashnode
};template
struct hashfun
};template
class hashtable
hashtable(const hashtable& h)
:size(0)
bool insert(k k, v v)
index++;
if (index>table.size())
}return
false;
}size_t hashfun(const k& k)
node* find(const k& k)
index++;
if (index>table.size())
}return null;
}bool erase(const k& pos)
return
false;
}private:
void checkloadfactor()
}void changecapacity()
}table.swap(newtable.table);
}size_t getnextprime(size_t pre)
;for (size_t index = 0; index<_primesize index>
return _primelist[_primesize - 1];
}private:
vector
table;
size_t size;
};
資料結構 HashTable
基本介紹 雜湊表管理學生資訊概圖 示例 data public class student public student int id,string name,string string address public class studentlinkedlist 如果鍊錶為空,直接將節點新增到鍊錶...
資料結構 字典hashtable
redis的資料庫就是使用字典來作為底層實現的,對資料庫的增 刪 查 改操作也是構建在對字典的操作之上的。舉個例子,當我們執行命令 redis set msg hello world 在資料庫中建立乙個鍵為 msg 值為 helloworld 的鍵值對時,這個鍵值對就是儲存在代表資料庫的字典裡面的。...
資料結構與演算法 Hash Table
參考自 談談 hash table 雜湊表是一種資料結構,實現key value的快速訪問。之前說過陣列可以實現快速隨機訪問,所以雜湊表肯定會使用到陣列。在這裡,我們把每乙個陣列的單元叫做乙個bucket 桶 雜湊表的大小最好是素數。雜湊表是乙個在時間和空間上做出權衡的經典例子。如果沒有記憶體限制,...