决定何时使用哈希表

时间:2016-10-18 07:53:19

标签: c++ performance hashtable

我正在通过以下要求解决竞争性编程问题:

我必须保持一个unqiue 2d点(x,y)的列表,唯一点的数量将小于500.

我的想法是将它们存储在哈希表中(C ++无序设置为特定的),每次节点出现时我都会查找表,如果节点不在那里,我会插入它。

我也知道我不会做超过500次查找的事实。 所以我看到一些解决方案只是搜索数组(未排序)并在插入之前检查节点是否已经存在。

我的问题是,是否有任何合理的方法可以猜测何时我应该使用哈希表而不是手动搜索键而不必对其进行基准测试?

3 个答案:

答案 0 :(得分:3)

  

我的问题是,是否有任何合理的方法可以猜测何时我应该使用哈希表而不是手动搜索键而不必对其进行基准测试?

我猜你熟悉基本的算法和算法。 time complexity和C ++ standard containers并知道运气哈希表访问是O(1)

如果哈希表代码(或一些平衡的树代码,例如使用std::map - 假设键上有一个简单的顺序)更具可读性,我更愿意仅仅因为可读性原因。

否则,您可能会考虑approximate timing for various operations on a PC进行猜测。顺便说一下,整个http:///norvig.com/21-days.html页面值得一读。

基本上,内存访问比CPU中的其他内容访问慢得多。 CPU cache非常重要。具有高速缓存故障的典型存储器访问需要从DRAM模块获取数据比某些基本算术运算或机器指令慢几百倍(例如,在寄存器中添加两个整数)。

在实践中,只要您的数据很小(例如,少于一千个元素),就没那么重要了,因为在这种情况下它很可能位于L2缓存中。

在数组中搜索(线性)非常快(因为非常缓存友好),高达数千个(小)元素。

IIRC,Herb Sutter在一些视频中提到,即使在一个向量中插入一个元素实际上 - 但是非直观地 - 更快(考虑到移动切片所需的时间)比插入它进入一些平衡的树(或者可能是一些其他容器,例如哈希表),最多可容纳数千个小元素的容器。这是典型的平板电脑,台式机或服务器微处理器,具有多兆字节缓存。 YMMV。

如果你真的那么在乎,你就无法避免基准测试。

请注意,500对整数可能适合L1缓存!

答案 1 :(得分:2)

我的经验法则是假设处理器每秒可处理10 ^ 9次操作。

在您的情况下,只有500个条目。最高为O(N ^ 2)的算法可能是安全的。通过使用像vector这样的连续数据结构,您可以利用快速缓存命中。哈希函数有时在常数方面也是昂贵的。但是,如果数据大小为10 ^ 6,则安全复杂度可能仅为O(N)。在这种情况下,您可能需要考虑单个查找的O(1)hashmap。

答案 2 :(得分:0)

您可以使用Big O Complexity粗略估算效果。对于哈希表,在最坏的情况下,搜索元素在O(1)和O(n)之间。这意味着,在最好的情况下,您的访问时间与地图中的元素数量无关,但在最坏的情况下,它取决于哈希表的大小。

二叉树具有保证的搜索复杂度O(nlog(n))。这意味着,搜索元素总是取决于数组的大小,但在最坏情况下,它比哈希表更快。

您可以在这个方便的网站上查找一些Big O Complexities:http://bigocheatsheet.com/