一个极简易 int 类型哈希表的实现

看了算法导论的影印版的哈希表时,开始还不太明白, 想了下后觉得似乎哈希表就是数组和链表的组合, 于是根据这个思路实现了一个最简易的哈希表。

这个其实我还是不太满意, 可能在以后会更新, 因为我觉得不满足 DRY 原则。

class HashTable
{
private:
    const size_t             initSize = 13;
    const int32_t            hashNum  = 13;

    vector<list<int32_t>>    hashTable;

    int32_t Hash (const int32_t& key) const
    {
        return (key % hashNum);
    }

    list<int32_t>::const_iterator
        GetTargetIter (const int32_t& value) const
    {
        auto key = Hash (value);
        return find (hashTable[key].cbegin (),
                     hashTable[key].cend (),
                     value);
    }

public:
    explicit HashTable ()
    {
        hashTable.resize (initSize);
    }

    decltype(hashTable) GetHashTable () const
    {
        return hashTable;
    }

    HashTable& operator=(const HashTable& otherTable)
    {
        hashTable = otherTable.GetHashTable ();
        return *this;
    }

    void Insert (const int32_t& value)    {        if (GetTargetIter (value) ==            hashTable[Hash (value)].cend ()) {            hashTable[Hash (value)].push_back (value);        }        else {            cerr << "Insert failed: The value already exists.\n";        }    }

    void Delete (const int32_t& value)
    {
        auto targetIter = GetTargetIter (value);
        auto key        = Hash (value);

        if (targetIter == hashTable[key].cend ()) {
            cout << "Cannot find " << value << " !\n";
        }
        else {
            hashTable[key].erase (targetIter);
            cout << "The " << value << " has been deleted!\n";
        }
    }

    void Search (const int32_t& value) const
    {
        if (GetTargetIter (value) ==
            hashTable[Hash (value)].cend ()) {
            cout << "Cannot find "<< value << " !\n";
        }
        else {
            cout << value << " is exist.\n";
        }
    }

    void Show () const
    {
        cout << "The values in the hash table are:\n";
        for_each (hashTable.cbegin (), hashTable.cend (),
                  [] (const list<int32_t>& l)
        {
            if (!l.empty ()) {
                for (const auto& val : l) {
                    cout << val << " ";
                }
                cout << endl;
            }
        });
    }
};
时间: 2024-10-14 04:53:04

一个极简易 int 类型哈希表的实现的相关文章

菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)

Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 31h, 2014 1.哈希表ngx_hash_t的优势和特点 哈希表是一种典型的以空间换取时间的数据结构,在没有冲突的情况下,对任意元素的插入.索引.删除的时间复杂度都是O(1).这样优秀的时间复杂度是通过将元素的key值以hash方法f映射到哈希表中的某一个位置来访问记录来实现的,即键值为key的元素必定存储在哈希

浅谈算法和数据结构: 十一 哈希表

在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是他们在平均以及最差情况下的时间复杂度: 可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度. 那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table) 什么是哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 哈希的思路很简单

_DataStructure_C_Impl:哈希表

#include<stdlib.h> #include<stdio.h> typedef int KeyType; //元素类型定义 typedef struct{ KeyType key; //keyword int hi; //冲突次数 }DataType; //哈希表类型定义 typedef struct{ DataType *data; int tableSize; //哈希表的长度 int curSize; //表中keyword个数 }HashTable; //构造一个

从头到尾彻底解析哈希表算法

说明:本文分为三部分内容,第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法. 第一部分:Top K 算法详解 问题描述 百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个.一个查询串的重复度越高,说明查询它的用户越多,也就是越热门.),请你统计最热门的10个查

数据结构与算法分析:哈希表

以下是阅读了<算法导论>后,对哈希表的一些总结: 哈希表又叫散列表,是实现字典操作的一种有效数据结构.哈希表的查询效率极高,在没有冲突(后面会介绍)的情况下可做到一次存取便能得到所查记录,在理想情况下,查找一个元素的平均时间为O(1)(最差情况下散列表中查找一个元素的时间与链表中查找的时间相同:O(n),但实际情况中一般散列表的性能是比较好的). 哈希表就是描述key-value对的映射问题的数据结构,更详细的描述是:在记录的存储位置和它的关键字之间建立一个确定的对应关系h,使每个关键字与哈希

哈希表的基本操作

散列(hash)表/哈希表 1.关键字和和存储的地址建立一个对应的关系:Add = Hash(key): 2. 解决冲突方法: (1)开放定址法 – 探测方式:线性探测.二次探测. (2)再哈希法 (3)分离链接法 – 利用链表的方式. (4)公共溢出区法 3.存储结构:用顺序存储来构建哈希表.构建结构数组 注意:使用不同的哈希函数得到的冲突次数不同. ---------------------------------------------------------------------- 除

C#中哈希表与List的比较

简单概念 在c#中,List是顺序线性表(非链表),用一组地址连续的存储单元依次存储数据元素的线性结构. 哈希表也叫散列表,是一种通过把关键码值映射到表中一个位置来访问记录的数据结构.c#中的哈希表有Hashtable,Dictionary,Hashtable继承自Map,实现一个key-value映射的关系.Dictionary则是一种泛型哈希表,不同于Hashtable的key无序,Dictionary是按照顺序存储的.哈希表的特点是:1.查找速度快,2.不能有重复的key. 创建过程 在c

php扩展开发-哈希表

什么是哈希表呢?哈希表在数据结构中也叫散列表.是根据键名经过hash函数计算后,映射到表中的一个位置,来直接访问记录,加快了访问速度.在理想情况下,哈希表的操作时间复杂度为O(1).数据项可以在一个与哈希表长度无关的时间内,计算出一个值hash(key),在固定时间内定位到一个桶(bucket,表示哈希表的一个位置),主要时间消耗在于哈希函数计算和桶的定位. 在分析PHP中HashTable实现原理之前,先介绍一下相关的基本概念: 如下图例子,希望通过人名检索一个数据,键名通过哈希函数,得到指向

Trie实践:一种比哈希表还快的数据结构

本文分为5部分.我从思考的角度,由浅到深带你认识Trie数据结构. 1.桶状哈希表与直接定址表的概念. 2.为什么直接定址表会比桶状哈希表快 3.初识Trie数据结构 4.Trie为什么会比桶状哈希表快 5.实际做实验感受下Trie , std::map , std::unordered_map的差距 6.最后的补充 1.桶状哈希表与直接定址表的概念. 先考虑一下这个问题:如何统计5万个0-99范围的数字出现的次数? 可以用哈希表来进行统计.如下: [cpp] view plaincopypri