【问题标题】:Dictionary lookup vs Array lookup; Array llocation vs dictionary allocation字典查找与数组查找;数组分配与字典分配
【发布时间】:2012-04-05 15:11:41
【问题描述】:

谁能告诉我字典结构查找方法的幕后花絮是什么 .我的意思是它是如何实现的?给定一个键,我们在字典中找到值。

1)我们知道,数组查找是 O(1) 操作。那么字典呢?

2)如果我存储的键值对都是整数,如果有大量这样的数据和空间是我关心的,哪个更可取?数组还是字典? 例如,我可以分配一个固定大小的数组。但是键值对可能不会占据整个数组。它的大小可能是数组的一半。但是数组分配应该是最大大小,因为我不知道某个键是否会出现。 让我澄清一下,让我们有键值对(10,1),(20,2),(30,3)。因此,如果我使用数组,那么我必须将其大小声明为 [30][2] 尽管它只占用 3 个条目。所以,在这种情况下,字典会更好。并不是说 30 可以是百万。那么其他条目会占用数组中的内存对吗?

【问题讨论】:

  • 一定要使用字典(或列表)。
  • 是的,我决定使用字典。

标签: c# c++ arrays dictionary


【解决方案1】:

字典通常以两种方式实现,哈希映射或二叉树。

1:如果字典是二叉树,那么搜索时间是二叉搜索,因此O(log n)。

如果字典是哈希映射,则搜索时间为 O(1)。 (对于具有相同哈希的键,可能会增加到 O(m))

2:你是对的,在这种稀疏数据集的情况下,字典将更好地利用空间。字典搜索的额外时间成本将相对较低。

使用诸如布隆过滤器之类的东西可以进一步改进字典搜索(如果平均情况是哈希映射中不存在的对象)。

【讨论】:

  • 请注意,.Net Dictionary 是作为 hashmap 实现的 - 所以 O(1) 查找。
  • 哦,太好了。我在 C# 中使用它。
【解决方案2】:

术语dictionary 非常通用,可以指代任何类型的数据结构。你也没有说它是有序字典还是无序字典。有各种以各种方式平衡的二叉搜索树,n-ary tree,hash表,skiplists等。

就阵列而言,直的扁平阵列在人口稀少时会浪费空间。但是,您可以实现多级数组。前几级是目录,只有叶级有小数组。

虚拟内存页表通常以这种方式实现。

因此,像 (hex) [0x123456] 这样的数组索引可能会被位掩码操作分解为 [0x12][0x34][0x56]。选择顶层目录,它是一个指向中间目录的指针数组,其中包含指向小表的指针数组。 (当然,实际上,代码必须遍历各个级别并注意丢失的目录和表,而不是直接索引!这就是重点:不要实例化整个树。)

不久前,我以这种方式在正则表达式引擎中实现了 Unicode 字符集,针对不同情况使用了几种不同深度的此类结构。

当然,这与您的常规 new int[foo] C++ 数组无关!但当然可以隐藏在一个看起来像数组的类后面。

【讨论】:

  • 我的字典没有排序。
  • “你的”字典?它是什么?如果它是你的字典,你为什么不知道它在内部是如何工作的? 困惑
猜你喜欢
  • 2010-10-28
  • 2016-08-07
  • 1970-01-01
  • 2013-07-28
  • 2014-07-21
  • 2017-04-15
  • 2012-05-16
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多