8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions.

这道题让我们实现一个简单的哈希表,我们采用了最简单的那种取余映射的方式来实现,我们使用Cell来保存一对对的key和value的映射关系,然后每一个格子都用一个list链表来保存所有的余数为该格子序号的Cell,我们设定格子总数为10,然后我们用泛式编程来适用于所有的参数类型,然后实现哈希表的基本存数和取数的功能。现在大多数的哈希表都是用二叉搜索树来实现的,但是用BST的话取数就是不是O(1)的时间复杂度了(如果我们以后很多的collision的话),但是BST的好处就是省空间,不需要建立超大的数组来保存映射。

  1. template<typename K, typename V>
  2. class Cell{
  3. public:
  4. Cell(K k, V v): _key(k), _value(v) {}
  5. bool equivalent(Cell *c) {
  6. return equivalent(c->getKey());
  7. }
  8. bool equivalent(K k) {
  9. return _key == k;
  10. }
  11. K getKey() { return _key; }
  12. V getValue() { return _value; }
  13.  
  14. private:
  15. K _key;
  16. V _value;
  17. };
  18.  
  19. template<typename K, typename V>
  20. class Hash {
  21. public:
  22. Hash() {
  23. _items.resize(_MAX_SIZE);
  24. }
  25. int hashCodeOfKey(K key) {
  26. return sizeof(key).size() % _items.size();
  27. }
  28. void put(K key, V value) {
  29. int x = hashCodeOfKey(key);
  30. if (_items[x] == nullptr) {
  31. _items[x] = new list<Cell<K, V>*> ();
  32. }
  33. list<Cell<K, V>*> *collided = _items[x];
  34. for (auto a : *collided) {
  35. if (a->equivalent(key)) {
  36. collided->remove(a);
  37. break;
  38. }
  39. }
  40. Cell<K, V> *cell = new Cell<K, V>(key, value);
  41. collided->push_back(cell);
  42. }
  43. V get(K key) {
  44. V v;
  45. int x = hashCodeOfKey(key);
  46. if (_items[x] == nullptr) {
  47. return v;
  48. }
  49. list<Cell<K, V>*> *collided = _items[x];
  50. for (auto a : *collided) {
  51. if (a->equivalent(key)) {
  52. return a->getValue();
  53. }
  54. }
  55. return v;
  56. }
  57.  
  58. private:
  59. const int _MAX_SIZE = ;
  60. vector<list<Cell<K, V>*>*> _items;
  61. };

[CareerCup] 8.10 Implement a Hash Table 实现一个哈希表的更多相关文章

  1. DHT(Distributed Hash Table,分布式哈希表)

    DHT(Distributed Hash Table,分布式哈希表)类似Tracker的根据种子特征码返回种子信息的网络. DHT全称叫分布式哈希表(Distributed Hash Table),是 ...

  2. 散列表 (Hash table,也叫哈希表)

    散列表是根据关键字(Key value)而直接访问在内存存储位置的数据结构.也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度.这个映射函数称做散列函数,存放记录 ...

  3. Implement the hash table using array / binary search tree

    今天在复习Arrays and String 时看到一个很有趣的问题.希望跟大家分享一下. Implement the hash table using array / binary search t ...

  4. [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组

    13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...

  5. Redis原理再学习04:数据结构-哈希表hash表(dict字典)

    哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...

  6. PHP内核探索之变量(3)- hash table

    在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...

  7. 散列表(Hash Table)

    散列表(hash table): 也称为哈希表. 根据wikipedia的定义:是根据关键字(Key value)而直接访问在内存存储位置的数据结构.也就是说,它通过把键值通过一个函数的计算,映射到表 ...

  8. hash table

    Hash Table,叫做哈希表,也叫做散列表.概念:通过某种对应关系h,使得每一个元素和储存位置一一对应.这种对应关系称为哈希函数.它最大的优点就是插入.搜索和删除得很快(O(1)).碰撞(Coll ...

  9. 哈希表(hash)详解

     哈希表结构讲解: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...

随机推荐

  1. UVa 106 - Fermat vs Pythagoras(数论题目)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  2. Burp Suite安装及详细使用教程-Intruder模块详解

    01 介绍 安装要求: Java 的V1.5 + 安装( 推荐使用最新的JRE ), 可从这里免费 http://java.sun.com/j2se/downloads.html Burp Suite ...

  3. JavaScript Patterns 4.6 Immediate Object Initialization

    ( { // here you can define setting values // a.k.a. configuration constants maxwidth : 600, maxheigh ...

  4. subline 快捷键

    subline 快捷键  安装 pretty css  html  后1,CTRl+ shift +H 格式化代码

  5. 烂泥:KVM虚拟机的关机与开启

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 我们在开启与关闭KVM虚拟机时,一般是通过start.shutdown.reboot等命令来进行.但是有时候我们会发现在使用shutdown.reboo ...

  6. Android开发学习总结(一)——搭建最新版本的Android开发环境

    Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...

  7. poj 3159 Candies 差分约束

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 22177   Accepted: 5936 Descrip ...

  8. hdu 4856 Tunnels (记忆化搜索)

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. kafka basic commands

    kafka-server-start.sh config/server.properties & kafka-server-stop.sh kafka-topics.sh    --creat ...

  10. Cassandra 分布式集群

    1 实施Cassandra集群,并验证集群功能正常,抓图实验过程 2 为什么说对于布隆过滤器有"确定某个元素是否在某个集合中的代价和总的元素数目无关"?误判率和元素数目有关吗?为什 ...