資料結構 手寫hashmap

2021-06-26 13:04:43 字數 2313 閱讀 7581

#define size 100 

//位址鏈個數,足夠大

class simhash

public:

simhash()

~simhash()

} delete map;

//清除陣列

}void insert(

int key,

int value)

node*p=map[hash(key)];

//確定位址鏈索引

node*q=

new node(key,value);

//建立節點

while(p&&p->next)p=p->next;

//索引到位址鏈末端

if(p)p->next=q;

//新增節點

else map[hash(key)]=q;

//位址鏈的第乙個節點

}void remove(

int key)

q=p;

p=p->next; }

}node* find(

int key)

return p; }

};首先,我們需要乙個node**型別的指標map記錄位址鏈陣列的位址,至於陣列大小,我們給乙個較大的值(這裡設定為100),為了簡化問題,不需要考慮插入時表滿等情況。在建構函式和析構函式內對map記憶體分配和撤銷。另外,節點的記憶體是動態增加的,因此析構時需要單獨處理每個位址鍊錶。

對於資料結構,最關鍵的便是插入、刪除、檢索操作,為此定義操作insert、remove、find。

檢索操作實現時,首先通過hash函式定位位址鍊錶的索引,然後在位址鍊錶上檢索鍵是否存在即可。

插入操作實現時,首先會檢索鍵是否存在,如果存在則僅僅更新對應節點的資料即可,否則建立新的節點,插入到鍊錶的結尾。對於空鍊錶需要做特殊處理。

刪除操作實現時,需要使用兩個指標記錄節點的位置資訊,當遇到滿足鍵的節點時,就將該節點從鍊錶內刪除即可。如果刪除鍊錶的第乙個節點,需要做特殊處理。

如果考慮雜湊表的鍵值型別、特殊鍵型別的hash對映(字串型別鍵如何對映為數值)、特殊鍵型別的比較處理(怎麼比較兩個自定義型別鍵是否相等)、索引運算過載這些問題的話,hash_map的實現就變得複雜了。不過這些在stl內實現的比較完整,若你感興趣可以多做了解。這裡我給出自己的乙個考慮以上問題的簡單hash_map實現。

struct str_hash

};

struct str_cmp

return !*str1&&!*str2; }

};template<

class k,

class t>

class hashnode

k key;

t data;

hashnode*next;

};template<

class k,

class t,

class h,

class c>

class hashmap

h h;

c c;

hashnode* _find(k key)

} return null; }

public:

size_t size;

//hash表容量

size_t count;

//元素個數

hashmap(size_t sz=

6):size(

6),div(

2),count(

0)map=

new hashnode*[div];

for(size_t i=

0;ifor(size_t i=

0;iwhile(

true)

else

break; }

}delete map; }

void insert(k key,t data)

} delete oldmap; }

hashnode*p=_find(key);

//已經存在,替換資料

if(p)p->data=data;

else

}void remove(k key)

} delete oldmap; }

size_t pos=hash(key);

//獲取桶號

for(hashnode*p=map[pos],*q=null;p;p=p->next)

q=p; }

}t& 

get(k key)

t&  operator(k key)

bool find(k key)

};

int main()

Java 資料結構 HashMap

hashmap 特點 1.map 無序不可重複 2.hash 通過map的key的hashcode的一次hash來決定儲存位置,通過key的 與equals方法來確定是否重複 原始碼分析 public v put k key,v value 如果 i 索引處的 entry 為 null,表明此處還沒...

hashMap的資料結構

在jdk8中,hashmap是用了陣列和鍊錶以及紅黑樹這三種資料結構 首先,在hashmap類中,都有乙個table陣列,我們在儲存資料時,對這個資料的hash值進行一系列的計算 計算出它在table中的位置 下標 並將它存放進去 然而,我們在hashmap是什麼 中提到,不同的物件的hash值可能...

關於HashMap的資料結構

一hashmap的資料結構 jdk1.8以前是陣列 鍊錶 jdk1.8以後是陣列 鍊錶 紅黑色 二資料結構的物理結構 是指資料的邏輯結構在計算機中的儲存形式 資料元素的儲存結構形式有如下兩種 兩種結構,各有優點和缺點,可以相互結合的運用 hashmap正好兩種資料結構都用到了 三陣列 hashmap...