让 map 为2D哈希图(带有两个键), array 为2D动态数组。
我们可以说 map 需要比 array 更多的内存来存储信息吗? 我们可以说 map 比 array 更快地检索信息吗? 使用这两种数据结构中是否存在其他优缺点?
答案 0 :(得分:0)
害怕最好的答案是,“它取决于”。
如果您将二维数组视为空间分区NxM网格,就像哈希表一样,它可能非常稀疏(某些单元格将只是未被占用)。所以两者都可能浪费大量内存。
与哈希映射不同,我们不必将密钥对冗余地存储到这样的2D结构中,因此可能存在一些潜在的好处。然而,这是一种不公平的比较,因为哈希集也不会,我们不一定需要具有键/值对的关联结构,只需要键。
哈希表在一天结束时仍然是一维数据结构,因为除了在哈希函数中将其映射到一维位置之外,键的配对方面是无关紧要的。
实际上,我已经看到二维分区网格倾向于优于哈希表。这不是一个保证,因为涉及的因素太多(包括实现者的技能),但在“平均”场景中它可能对哈希表略有优势。
主要原因是由于冲突:哈希表必须将这些密钥对映射到一维索引中,因此除非您的表非常稀疏(在这种情况下更多的内存),否则它会因更多冲突而更容易降低性能,更少的缓存命中率也会降低性能等)或者除非你只是为这些密钥对提供了很棒的哈希函数。
2D网格往往更容易提供更“稳定”的性能而不会出现偏斜和降级。当你有很多2D“点”位于相同的网格单元中时理论上哈希表可能解析为不同的存储桶时,它面临着最糟糕的情况,但通常比哈希表更容易避免这种情况和/或适应这种情况。可能会因为更不可预测的原因而开始接收很多冲突。但是,如果使用2D网格,通常需要使用链接方法(并且可能使用一些微优化来重新分配单元格中的元素以用于空间局部性)涉及列表指针/引用,因为方法不太实用以这种方式解决碰撞。
您可以更灵活地将2D网格作为奖励,例如最近邻搜索或搜索搜索范围内的“点”。搜索不一定是完全匹配。
虽然散列表有一些好处,但在某些情况下可能非常好。它不要求您事先了解钥匙的范围。使用网格,您必须事先知道您的密钥的范围是[0,10000]
,例如哈希表可以处理(-inf,+inf)
范围,因此对于非常动态的情况,它可能非常有用,在这种情况下,您无法预测任何有关您提前插入的数据的信息。