实现直接地址表

时间:2010-01-03 19:08:57

标签: algorithm hash hashtable clrs

我被Introduction to Algorithms练习11.1-3作为家庭作业,其内容如下:

  

建议如何实现直接访问表,其中存储元素的键不需要是不同的,并且元素可以具有卫星数据。所有三个字典操作(插入,删除和搜索)都应该在O(1)时间内运行。不要忘记Delete将参数指向要删除的对象,而不是键。

好吧,Insert没有问题,因为它只是意味着在表中的适当位置创建一个链表(如果它还不存在)并向其添加元素。给定键的搜索可以返回与键匹配的任何元素,因此它只是意味着我们需要返回表中匹配列表的头部。

我的问题是删除操作。如果我修改了对象以在链接列表中添加指向其节点的指针,那么我可以在 O(1)中删除,但我不确定我是否可以更改对象。有没有办法在不改变给定对象的情况下这样做?

5 个答案:

答案 0 :(得分:6)

这是Cormen书中的一个问题吗?据我了解,通过阅读该书中的前几段,您存储在直接访问表中的对象是“您的”对象。因此,您可以按照建议将指针存储到表中的双向链表,每个列表元素都有一个指向用户对象的指针。然后,字典SEARCH操作返回一个列表元素,用户必须使用另一个步骤来获取他的对象。同样,DELETE操作采用指向列表元素的指针。

这有意义吗?我不想破坏你的作业!

答案 1 :(得分:3)

我们可以在直接地址表的每个索引处使用双链接列表。 插槽j将包含指向列表头部的指针,其中包含具有键值j的所有元素,如果没有这样的元素,则插槽j包含NIL。 在列表的头部插入x只需要O(1)时间。 SEARCH-它可以返回与给定键匹配的任何元素,因此返回列表的头部只需要O(1)时间。 删除 - 由于我们使用了双链表,我们可以使用指向前一个和下一个节点的指针在O(1)时间内删除一个元素。

答案 2 :(得分:1)

我认为您可以利用卫星数据作为辅助密钥进行映射。然后它是一种2级哈希表。关注DELETE操作,首先我们使用主键。当存在重复的主键时,我们使用辅助键来获取对象。因此总时间仍为O(1)。

答案 3 :(得分:0)

哈希表可以为您提供一定的帮助。一旦你开始有collsions,那么它变成O(1 + k / n),其中k是键的数量,n是你的表大小。如果您执行计划的哈希调整大小并重新哈希,那么您可能能够逃脱这一点。不知道这是否会影响您的效率等级,因为在插入,删除或搜索期间不会发生这种情况。

通过简单地将哈希引用指针设置为null,可以实现不更改对象的删除。不会直接更改对象,但会更改对象容器。

我认为对于您提供的大多数限制,可以通过某种方式实现哈希表来绕过它们。 http://en.wikipedia.org/wiki/Hash_table#Performance_analysis上有关于如何实现哈希表的更多信息。

答案 4 :(得分:0)

最重要的部分..“实现一个直接访问表,其中存储元素的键不需要是不同的”和“O(1)时间内的字典操作。

  
    

如果元素相等,则在O(1)时间内也不可能插入(因为Q表示元素不必是不同的)。

         

对于删除部分,您必须获取键和对象才能到达特定对象,并假定还有卫星数据中的密钥,以覆盖特定对象。

  

我认为只有2个以上的想法对O(1)时间有意义。