modified hash_test
This commit is contained in:
parent
ce6c488b2a
commit
cc36a3dc0f
Binary file not shown.
Before Width: | Height: | Size: 75 KiB |
Binary file not shown.
Before Width: | Height: | Size: 102 KiB |
|
@ -1,58 +1,76 @@
|
||||||
# 基于cortex-m3-emulator实现哈希表并测试验证##
|
# 基于cortex-m3-emulator实现哈希表并测试验证
|
||||||
|
|
||||||
## 1. 简介
|
## 1. 简介
|
||||||
利用c语言实现了哈希表(HashMap),包括添加键值对(Put),获取键对应的值(Get), 删除健(Delete),清空哈希表(Clear), 迭代遍历哈希表(hashMapIterator)等功能
|
利用c语言实现了哈希表(HashMap),包括添加键值对(Put),获取键对应的值(Get), 删除健(Delete),清空哈希表(Clear), 迭代遍历哈希表(hashMapIterator)等功能操作。
|
||||||
操作。
|
|
||||||
|
|
||||||
利用数组(Entry)作为存储空间,利用链表(*next)解决冲突。当哈希表的大小超过数组大小后,为避免发生冲突过多的情况,可以对哈希表扩容。
|
利用数组(Entry)作为存储空间,利用链表(*next)解决冲突。当哈希表的大小超过数组大小后,为避免发生冲突过多的情况,可以对哈希表扩容。
|
||||||
|
|
||||||
## 2. 数据结构设计说明
|
## 2. 数据结构设计说明
|
||||||
键值对结构
|
**键值对结构**
|
||||||
typedef struct entry {
|
typedef struct entry {
|
||||||
void * key; // 键
|
void * key; // 键
|
||||||
void * value; // 值
|
void * value; // 值
|
||||||
struct entry * next; // 冲突链表
|
struct entry * next; // 冲突链表
|
||||||
}*Entry;
|
}*Entry;
|
||||||
|
|
||||||
哈希结构
|
**哈希结构**typedef struct hashMap {
|
||||||
typedef struct hashMap {
|
|
||||||
int size; // 当前大小
|
|
||||||
int listSize; // 有效空间大小
|
|
||||||
HashCode hashCode; // 哈希函数
|
|
||||||
Equal equal; // 判等函数
|
|
||||||
Entry list; // 存储区域
|
|
||||||
Put put; // 添加键的函数
|
|
||||||
Get get; // 获取键对应值的函数
|
|
||||||
Remove remove; // 删除键
|
|
||||||
Clear clear; // 清空Map
|
|
||||||
Exists exists; // 判断键是否存在
|
|
||||||
Boolean autoAssign; // 设定是否根据当前数据量动态调整内存大小,默认开启
|
|
||||||
}*HashMap;
|
|
||||||
|
|
||||||
包括以下函数功能,分别为:
|
int size,listSize;
|
||||||
`createHashMap`:创建一个哈希结构
|
|
||||||
`defaultPut`:添加键值对
|
HashCode hashCode; // 哈希函数
|
||||||
`defaultGet`:获取键对应值
|
|
||||||
`defaultRemove`:删除指定键的键值对
|
Equal equal; // 判等函数
|
||||||
`defaultExists`:判断键值是否存在
|
|
||||||
`defaultClear`:清空Map的函数类型
|
Entry list; // 存储区域
|
||||||
`resetHashMap`:重新构建哈希表
|
|
||||||
|
Put put; // 添加键的函数
|
||||||
|
|
||||||
|
Get get; // 获取键对应值的函数
|
||||||
|
|
||||||
|
Remove remove; // 删除键
|
||||||
|
|
||||||
|
Clear clear; // 清空Map
|
||||||
|
|
||||||
|
Exists exists; // 判断键是否存在
|
||||||
|
|
||||||
|
Boolean autoAssign; // 设定是否根据当前数据量动态调整内存大小,默认开启
|
||||||
|
|
||||||
|
}*HashMap;
|
||||||
|
|
||||||
|
|
||||||
## 3. 测试程序说明
|
## 3. 测试程序说明
|
||||||
测试了哈希表的插入键值对(Put),判断键是否存在(Exist),获取键对应的值(Get), 删除健(Delete),迭代遍历哈希表(hashMapIterator),清空哈希表(Clear)等操作。
|
测试了哈希表的插入键值对(Put), 其中哈希函数采用了平方取中法和直接取余法的结合
|
||||||
|
|
||||||
|
判断键是否存在(Exist),获取键对应的值(Get), 删除健(Delete),迭代遍历哈希表(hashMapIterator),清空哈希表(Clear)等操作。
|
||||||
|
|
||||||
并展示了利用链地址法解决哈希冲突的示例, 两个不同的人(Bob和Li Ming)的hashcode相同。
|
并展示了利用链地址法解决哈希冲突的示例, 两个不同的人(Bob和Li Ming)的hashcode相同。
|
||||||
|
|
||||||
## 4. 运行结果(##需结合运行测试截图按步骤说明##)
|
## 4. 运行结果
|
||||||

|
|
||||||
打开menuconfig之后,将test_hash_map开启(y),保存后退出
|
|
||||||
|
|
||||||

|
1. 清空之前的配置和编译结果
|
||||||
编译XiZi-cortex-m3-emulator.elf成功
|
|
||||||
|
|
||||||

|
<img src=".\img\1.png" style="zoom:80%;" />
|
||||||
启动qemu模拟Xiuos操作系统,验证TestHash注册Shell命令
|
|
||||||
|
|
||||||

|
2. 进行相应配置
|
||||||
执行TestHash命令,打印测试结果。
|
|
||||||
|
|
||||||
|
<img src=".\img\2.png" alt="image-20231007114803083" style="zoom:67%;" />
|
||||||
|
|
||||||
|
<img src=".\img\3.png" alt="image-20231007114813143" style="zoom:67%;" />
|
||||||
|
|
||||||
|
<img src=".\img\4.png" alt="image-20231007114820689" style="zoom:67%;" />
|
||||||
|
|
||||||
|
3. 编译代码,解决了一些编译错误
|
||||||
|
|
||||||
|
<img src=".\img\5.png" alt="image-20231007114837155" style="zoom:67%;" />
|
||||||
|
|
||||||
|
4. 烧录到xiuos模拟器上,运行
|
||||||
|
|
||||||
|
<img src=".\img\6.png" alt="image-20231007114846499" style="zoom: 50%;" />
|
||||||
|
|
||||||
|
5. 用shell命令测试代码运行结果
|
||||||
|
|
||||||
|
<img src=".\img\7.png" style="zoom:50%;" />
|
||||||
|
|
||||||
|
<img src=".\img\8.png" style="zoom:80%;" />
|
||||||
|
|
||||||
|
可以看到,HashCode映射的结果出现了一些改变,程序能正确无误的运行。
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 94 KiB |
Binary file not shown.
Before Width: | Height: | Size: 95 KiB |
Loading…
Reference in New Issue