【问题标题】:Simple hash table with vector带向量的简单哈希表
【发布时间】:2016-07-14 00:42:11
【问题描述】:

按照我的理解,实现哈希表,就是根据输入的字符串计算索引,然后直接返回,实现简单的键值存储。

如此简单的哈希函数可能看起来像

int hash( string name ){

    int index = 0;
    int hash = 0;
    for ( int i = 0; i < name.length() ;i++){
        hash += (int)name[i];
    }
    index = sizeOfArray % hash;
}

SizeOfArray 是具有预定义大小的指针数组。如果此索引不存在,则创建它。但是我如何用向量来实现呢?

向量没有预定义的大小。它们会自动生长。所以调用 sizeOfArray % hash 会改变每次向量都会增长。

表背后的逻辑是什么?即使随着向量/数组的增长,计算索引的最佳方法是什么?

【问题讨论】:

  • 为什么不简单地使用字符串*数组?而且,由于可能存在冲突,您最好使用字符串的链表(或向量)数组,因为多个字符串必须可附加到一个哈希键。顺便说一句,也许你做这个只是为了学习,这非常有用。但是哈希键是编译器附带的许多 STL 数据结构的基础。
  • 了解哈希表是个好主意,但不要为了学习目的而实现自己的哈希表,而不是在有 std::unordered_map 时。
  • 你可以告诉一个向量是一个特定的大小并且它们不会自动增长,除非你调用一个让它们增长的函数。
  • 另外,您的索引计算错误,应该反过来:hash % sizeOfArray
  • 线性散列不会导致查找的线性复杂度,它仍然是常数时间。

标签: c++ hash hashtable


【解决方案1】:

您可以使用vector&lt;list&lt;string&gt;&gt; 作为哈希表的基础数据结构。
此外,您的指数计算错误;而不是sizeOfArray % hash,应该是相反的。

vector<list<string>> hash_table;
const size_t hash_table_size = 100;
hash_table.resize(hash_table_size);

int hash( string name ){
    int index = 0;
    int hash = 0;
    for ( int i = 0; i < name.length() ;i++){
        hash += (int)name[i];
    }

    index = hash % hash_table.size();
    hash_table[index].push_back(name);
}

【讨论】:

  • OP 应该会觉得这很有帮助,但是 - 挑剔 - 它不应该是实际在表中插入数据的哈希函数:调用 hash 的单独插入函数应该这样做(并且可能也做% hash_table.size())。此外,您不应在未检查 name 是否已出现在其中的情况下将 push_back 放入存储桶。但是,我确信 OP 可以解决这些问题......
猜你喜欢
  • 2013-07-02
  • 2013-06-12
  • 2013-05-19
  • 2017-12-01
  • 2015-07-21
  • 2012-04-26
  • 2017-11-03
  • 2011-06-03
  • 2013-01-02
相关资源
最近更新 更多