字典查找与数组查找;数组分配与字典分配

时间:2012-03-21 05:04:43

标签: c# c++ arrays dictionary

你们中的任何人都可以告诉我词典结构的查找方法背后是什么 。我是说它是如何实现的?给定一个键,我们在字典中找到值。

1)我们知道并且数组查找是O(1)操作。那么字典怎么样?

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

使用字典可以进一步改进使用字典搜索(如果平均情况是哈希映射中不存在的对象)。

答案 1 :(得分:2)

术语dictionary非常通用,可以指任何类型的数据结构。你也没有说它是有序字典还是无序字典。有各种各样的二叉搜索树,n-ary树,哈希表,跳过列表等。

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

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

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

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

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