c語言實現雜湊表

2021-09-10 14:08:11 字數 3394 閱讀 7509

雜湊表大家都在資料結構中學習過,應該是查詢最快的一種資料結構了,最好的情況下可以達到線性的時間複雜度。

鍵key的狀態碼如果為 vt_undefined 的話那麼就是這個槽位沒有被占用或者已經被刪除了

值value的狀態碼有vt_true和vt_false兩種,只要這個槽位已經被占用過了,那麼value的狀態碼就是vt_true

所以在進行線性探測的時候

下面是obj_map.h的**

#ifndef _object_map_h

#define _object_map_h

#include "header_obj.h"

#define map_load_percent 0.8

typedef struct entry; //key->value對

typedef struct objmap;

objmap* newobjmap(vm* vm);

void mapset(vm* vm, objmap* objmap, value key, value value);

value mapget(objmap* objmap, value key);

void clearmap(vm* vm, objmap* objmap);

value removekey(vm* vm, objmap* objmap, value key);

#endif

接下來是obj_map.c的**

//######part1 p128######

#include "obj_map.h"

#include "class.h"

#include "vm.h"

#include "obj_string.h"

#include "obj_range.h"

//建立新map物件

objmap* newobjmap(vm* vm)

//計算數字的雜湊碼

static uint32_t hashnum(double num)

//計算物件的雜湊碼

static uint32_t hashobj(objheader* objheader)

return 0;

}//根據value的型別呼叫相應的雜湊函式

static uint32_t hashvalue(value value)

return 0;

}//######part2 p129######

//在entries中新增entry,如果是新的key則返回true

static bool addentry(entry* entries, uint32_t capacity, value key, value value)else if(valueisequal(entries[index].key, key))

//開放探測定址,直接探測下乙個slot

index = (index + 1) % capacity;

}}//使物件objmap的容量調整到newcapacity

static void resizemap(vm* vm, objmap* objmap, uint32_t newcapacity)

//2.再遍歷老陣列,把有值的部分插入到新陣列

if(objmap->capacity > 0)

idx++;}}

//3.將老entry陣列空間**

deallocate_array(vm, objmap->entries, objmap->count);

objmap->entries = newentries; //更新指標為新的entry陣列

objmap->capacity = newcapacity; //更新容量

}//######part3 p131######

//在objmap中查詢key對應的entry

static entry* findentry(objmap* objmap, value key)

//以下開放定址探測

//用雜湊值對容量取模計算槽位slot

uint32_t index = hashvalue(key) % objmap->capacity;

entry* entry;

while(true)

//key為vt_undefined且value為vt_true表示探測鏈未斷,可以繼續探測(代表從雜湊表中刪除掉的元素)

//key為vt_undefined且value為vt_false表示探測鏈斷了,探測結束(代表雜湊表中這個slot沒有放入過元素)

if(value_is_undefined(entry->key) && value_is_false(entry->value))

//如果探測鏈沒斷就繼續向下探測

index = (index + 1) % objmap->capacity;

}}//在objmap中實現key與value的關聯,objmap[key]=value

void mapset(vm* vm, objmap* objmap, value key, value value)

resizemap(vm, objmap, newcapacity); //擴容

}//若建立了新的key則使objmap->count加1

if(addentry(objmap->entries, objmap->capacity, key, value))

}//從map中查詢key對應的value map[key]

value mapget(objmap* objmap, value key)

return entry->value;

}//######part4 p133######

//**objmap.entries所佔的空間

void clearmap(vm* vm, objmap* objmap)

//刪除objmap中的key,返回map[key]

value removekey(vm* vm, objmap* objmap, value key)

//設定開放定址的偽刪除

value value = entry->value;

entry->key = vt_to_value(vt_undefined);

entry->value = vt_to_value(vt_true); //值為真,偽刪除

objmap->count--;

if(objmap->count == 0) else if(objmap->count < objmap->capacity / (capacity_grow_factor) * map_load_percent)

resizemap(vm, objmap, newcapacity);

}return value;

}

雜湊表 C語言實現

這裡不講高深理論,只說直觀感受。雜湊表的目的就是為了根據資料的部分內容 關鍵字 直接計算出存放完整資料的記憶體位址。void list find by key list,key return p 為了解決根據關鍵字快速找到元素的存放位址,雜湊表應運而生。它通過某種演算法 雜湊函式 直接根據關鍵字計算...

雜湊表查詢 C語言實現

題目 給定乙個全部由字串組成的字典,字串全部由大寫字母構成。其中為每個字串編寫密碼,編寫的 方式是對於 n 位字串,給定乙個 n 位數,大寫字母與數字的對應方式按照 鍵盤的方式 2 a,b,c 5 j,k,l 8 t,u,v 3 d,e,f 6 m,n,o 9 w,x,y,z 4 g,h,i 7 p...

雜湊表的C語言實現

include include define hashsize 12 define nullkey 32768 typedef structhashtable int m 0 初始化雜湊表 int inithashtable hashtable h return 1 雜湊函式 int hash in...