增量键,减量键,查找最大键,查找最小键(以O(1)时间为单位)

问题描述 投票:0回答:3

在面试中有人问我这个问题,但无法解决。设计一个执行以下操作的数据结构

Inc(Key)->取得一个键并将其值增加1。如果该键第一次出现,则将其值设为1。

Dec(Key)->取得一个密钥并将其值减1。假定其值为最小1。

Findmaxkey()->返回具有与其对应的最大值的键。如果有多个这样的键,那么您可以输出其中任何一个。

Findminkey()->返回具有与其对应的最小值的键。如果有多个这样的键,那么您可以输出其中任何一个。

您必须在O(1)时间内完成所有操作。

提示:面试官要我使用带有双向链表的字典(哈希图)。

algorithm dictionary data-structures hashmap doubly-linked-list
3个回答
0
投票

这是我的答案,但我仍然不确定我是否没有违反面试官所想到的任何情况。

我们将保留一个LinkedList,其中每个元素都有其对应的键和值,以及指向其上一个和下一个元素的指针,并且始终按值排序。我们将每个键的指针存储在LinkedList中。此外,对于我们看到的每个新数字,我们添加两个元素以查看每个数字的开始和结束元素,并将存储指向它们的指针。由于我们为每个操作最多添加两个额外的元素,因此仍然是O(1)。

现在,对于每个操作(例如增量),我们可以使用字典找到对应于此键的元素在LinkedList中的位置(假设字典以O(1)的时间复杂度工作),现在,我们在其中找到最后一个元素具有相同值的LinkedList(我们可以使用与该值的末尾相对应的元素来完成此操作,并向后移一个元素),然后交换这两个指针(这只是一次简单的交换,并且此交换不会影响其他元素)我们将该元素与下一个元素交换两次,以使它属于下一个数字的段(我们可能也需要添加该数字),需要跟踪的最后一件事是最小值和最大值如果要更改的元素是当前的最小值或最大值并且没有相同值的数字(LinkedList中该值的开始和结束元素是连续的),则必须更新

仍然,我认为这种方法可以改进。


0
投票

关键是问题只要求dec(1)或inc(1)。因此,该算法仅需要向前或向后移动一个块。这是一个很重要的先决条件,并提供了很多信息。


0
投票

数据结构可以如下构造:

© www.soinside.com 2019 - 2024. All rights reserved.