雜湊表大家都在資料結構中學習過,應該是查詢最快的一種資料結構了,最好的情況下可以達到線性的時間複雜度。
鍵key的狀態碼如果為 vt_undefined 的話那麼就是這個槽位沒有被占用或者已經被刪除了
值value的狀態碼有vt_true和vt_false兩種,只要這個槽位已經被占用過了,那麼value的狀態碼就是vt_true
所以在進行線性探測的時候
下面是obj_map.h的**
接下來是obj_map.c的**#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
//######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...