简单介绍了Hash及其相关的概念,简单应用Hash编写一个词典程序,并对词典的查找效率进行评估.
什么是哈希?
Hash,可以翻译为散列,也可音译为哈希,下文统一使用Hash.
http://c.biancheng.net/view/3437.html这个教程很好的介绍了Hash的原理.
一个Hash表的简单实现
键值对
1 | template<class Key, class T>//模板列表,一个是类型Key(键),一个是类型 T(值). |
HashMap
模板列表
1 | template<class Key, class T, class HashFunc> |
这个类中,有三个模板,Key,T和HasFunc
类型重新定义
1 | typedef typename list<key_value_pair<const Key, T> >::iterator hash_list_itr; |
把list<key_value_pair<const Key, T> >的这个类里面的迭代器,重新命名为hash_list_itr
常量
1 | const static int DEFAULT_SIZE; //默认的大小尺寸 |
构造函数
1 | hash_map() |
默认构造器,给count赋值为0,length赋值了常量DEFAULT_SIZE = 211.
而buckets是一个list,存储了键值对,键值对的两个数据类型是Key和T,长度为DEFAULT_SIZE.
void check_for_expansion()函数
该函数判断当前的哈希图是否需要扩容
1 | void check_for_expansion() |
操作符重载”==”
1 | bool operator== (const hash_map<Key, T, HashFunc>& other)//参数为另一个hash_map |
int size()函数
1 | int size() |
这个函数直接返回count即可
迭代器
friend class hash_map<Key, T, HashFunc>;
首先是hash_map的友元
成员变量
1 | unsigned index, length;//地址和长度 |
操作符重载-“==,!=,++,*,[]”
1 | bool operator== (const iterator& other) const |
begin()函数
1 | // Postcondition: an iterator positioned at the beginning |
返回的迭代器指向hash_map的开始的位置,但是迭代器内部的index变量是最后一个元素的地址.
end()函数
1 | // Postcondition: an iterator has been returned that can be used |
该函数返回一个迭代器,迭代器里的list_itr指向buckets的最后一个元素
insert()函数
1 | pair<iterator, bool> insert(const key_value_pair<const Key, T>& x) |
首先,参数是一个键值对x. 函数首先分析这个键值对的key值是否已经存在,如果存在,返回键值对<迭代器,布尔值>,迭代器指向哈希表中的这个key值,布尔值为false.
如果没有,则在哈希表中创建该键值对.
find()函数
1 | iterator find(const Key& key) |
在哈希表里面寻找是否已经存在和参数key值相同的key值
erase()函数
1 | void erase(iterator itr) |
调用list类里面的erase.
析构函数
1 | ~hash_map() |
实验部分
drive.h
hash_func
1 | unsigned long operator() (const string key); |
对()操作符进行重载,参数是string类型的变量key.
HashMapDriver类
1 | class HashMapDriver |
实验要求
- 实现readAndProcess() 和 testDictionary()
- 设计实现哈希函数类hash_func
- 对你的词典进行效率测试.修改hash map类以获取你所实现的英文词典的如下信息:
- 装填因子,即存储单词的数目/散列表数组的长度
- 所有IELTS词汇表中的单词在查找时的比较次数的最大值和平均值
上述两个指标可以在一定程度上反映你所实现的英文词典的查找效率。