Hashtable涉及什么样的开销?

时间:2010-03-04 18:23:39

标签: hashtable

据我所知,由于分配是在运行时,因此必须涉及一些内务管理操作。但除此之外是什么开销?此外,当您需要存储整数元素出现在无限数字流中的次数时,创建哈希表Vs数组是否明智?

3 个答案:

答案 0 :(得分:3)

理论上,它取决于数字流中有多少唯一数字。但是我能想象的任何现实生活场景,阵列都会慢得多。您处理的数字越多,阵列解决方案就越慢。

HashTable通常保持相同的访问速度,无论它变得多大。对于“无限流”,我无法想象HashTable如何不是更好的解决方案。你打算怎么搜索阵列?

答案 1 :(得分:1)

正如Neil的评论所暗示的,哈希表实现的开销在很大程度上取决于哈希表的特定实现。但是,通常情况下,未使用的哈希值会产生存储开销,处理哈希冲突会产生存储和时间开销。当然,计算哈希值也会产生时间开销。

在回答您的第二个问题时,这很大程度上取决于您的数字流的详细信息以及您的计划的其他方面。需要考虑的一些问题:

  • 这些可能的数字是大还是小? (你需要创建一个多大的数组?)

  • 在可能的数字范围之外,您是否期望使用大部分数字,或只使用少数数字?如果您希望使用该范围内的大多数可能的数字,那么使用哈希表将不会为您节省太多空间。

  • 在开始之前,您知道可能的数字范围吗?或者这是未知的?哈希表可以更容易地处理未知范围。

  • 在此计划中节省存储空间有多重要?你能轻松地分配一个必要大小的数组吗?如果您可以轻松地分配数组,为什么还要使用哈希表呢?​​

  • 此程序的运行速度有多重要?数组通常会更快。

答案 2 :(得分:1)

哈希表非常快。就像一个实验一样,我在原始数组和c ++ hash_map之间大约减少了50倍(用#if编译双向编译并自己尝试)。

#include <ext/hash_map>
using namespace __gnu_cxx;

int main() {
#if 0
  hash_map<int,int> table;
  for (int i = 0; i < 256; i++) table[i] = 0;
#else
  int table[256];
#endif

  for (int i = 0; i < 100000000; i++) {
    table[i&0xff]++;
  }
}