資料結構 Hashtable 閉雜湊

2021-08-10 13:22:57 字數 1738 閱讀 7220

雜湊表是常見資料結構中一種擁有高效插入,高效查詢的結構,時間複雜度為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 桶 雜湊表的大小最好是素數。雜湊表是乙個在時間和空間上做出權衡的經典例子。如果沒有記憶體限制,...