散列表(HashTable)
2016-01-06 21:36
155 查看
散列表
i. 散列函数
i. 冲突解决
ii. 分离链表法
ii. 开放地址法
iii. 线性探测法
iii. 平方探测法
iii. 双散列
ii. 再散列
ii. 可扩散列
i. 装填因子:元素个数 / 散列表大小
C++实现
1. 冲突解决:分离链表法
散列函数:key % tableSize
View Code
i. 散列函数
i. 冲突解决
ii. 分离链表法
ii. 开放地址法
iii. 线性探测法
iii. 平方探测法
iii. 双散列
ii. 再散列
ii. 可扩散列
i. 装填因子:元素个数 / 散列表大小
C++实现
1. 冲突解决:分离链表法
散列函数:key % tableSize
/* 冲突解决:开放地址法 之 平方探测 散列函数:(key + collisionNum ^ 2) % TableSize 装填因子:散列大小 > 元素个数 × 2 */ #include <iostream> #include <vector> using namespace std; class HashTable { friend void dump(const HashTable&); public: HashTable(size_t size = 10) : _size(size) { _table = new vector<int>(_size); for (size_t i = 0; i < _size; i++) { _table->operator[](i) = NULL; } } void insert(int val) { for (unsigned i = 0; i < _size; i++) { if (_table->operator[]( _hash(val, i)) == NULL) { _table->operator[]( _hash(val, i)) = val; return; } } } int find(int val) const { for (unsigned i = 0; i < _size; i++) { if (_table->operator[](_hash(val, i)) == val) { return _table->operator[](_hash(val, i)); } } return NULL; } ~HashTable() { delete _table; } private: size_t _hash(size_t val, unsigned collision) const { return (val + collision * collision) % _size; //散列函数,平方探测 } vector<int>* _table; size_t _size; }; void dump(const HashTable& h) { vector<int>::const_iterator it = h._table->cbegin(); while (it != h._table->cend()) { cout << it - h._table->cbegin() << " " << *it++ << endl; } } int main() { HashTable h(10); h.insert(89); h.insert(18); h.insert(49); h.insert(58); h.insert(69); dump(h); cout << h.find(49) << endl; cout << h.find(58) << endl; return 0; }
View Code
相关文章推荐
- Makefile--隐含规则自动推dao(一)
- 完整项目实战备忘录的实现之知识点总结
- Scala基础
- matlab的log()函数默认是以e为底的
- Windows下多线程数据同步互斥的有关知识
- 16.shell脚本编程(1)
- Windows下多线程数据同步互斥的有关知识
- OpenMesh学习笔记3 半边数据结构
- 剑指offer-从尾到头打印链表
- 秒杀多线程第十篇 生产者消费者问题
- 周易六十四卦——屯卦
- nandflah 简介
- VB URL的编解码源码 GB2312 UTF-8编解码
- Java基础学习5_数组
- Java基础学习4_流程控制语句
- Java基础学习3_常用运算符
- Java基础学习1_Java基础
- Java基础学习2_变量与常量
- C++ 输入与输出的学习
- ios crash的原因与抓取crash日志的方法