【问题标题】:Data Structure that supports queue like operations and mode finding支持类似队列的操作和模式查找的数据结构
【发布时间】:2013-10-03 22:15:07
【问题描述】:

这是大约 3 年前问我的一个面试问题,我在不久前就在思考这个问题。

设计一个支持以下操作的数据结构: insert_back()、remove_front() 和 find_mode()。最佳复杂度 必填。

我能想到的最佳解决方案是 O(logn) 用于插入和删除,O(1) 用于模式。这就是我解决它的方法:保留一个队列 DS 来处理插入和删除的元素。 还要保留一个最大堆排序的数组和一个哈希表。 哈希表包含一个整数键和指向该元素的堆数组位置的索引。堆数组包含一个有序对 (count,element),并在 count 属性上排序。

插入:将元素插入队列。从哈希表中找到堆数组索引的位置。如果不存在,则将元素添加到堆中并向上堆。然后将最终位置添加到哈希表中。增加该位置的计数并根据需要向上或向下堆化以恢复堆属性。

删除:从队列头部删除元素。从哈希表中,找到堆数组索引中的位置。减少堆中的计数并根据需要向上或向下重新堆以恢复堆属性。

查找模式:数组堆头部的元素 (getMax()) 将为我们提供模式。

有人可以提出更好的建议吗?我能想到的唯一优化是使用斐波那契堆,但我不确定这是否适合这个问题。

【问题讨论】:

  • 您描述的是Deque,它非常标准。
  • 但是双端队列(我认为是双端队列)如何跟踪数组中出现次数最多的元素?任何链接都会有所帮助。感谢您的及时回答
  • 啊,我道歉。我忽略了要求的Find_Mode 方面。我应该说你描述的结构是Deque。您可以看到基本实现中的所有操作都是 O(1) - 但是,find 不是其中之一......抱歉在这里浪费您的时间。
  • 再读一遍,我会实现一个基本的Deque类,这里所有的核心操作(PushFront/BackPopFront/Back和扩展数组大小都是O(1)。然后到这个类(正如我认为你在上面所说的那样)我会实现一个Find,它只是循环遍历Deque的条目,这将是O(n)。如果你想要更快,你可能不得不考虑使用Red-Black Tree某种...

标签: algorithm data-structures heap hashtable


【解决方案1】:

我认为所有操作都有O(1) 的解决方案。

您需要一个双端队列和两个哈希表。

第一个是链接哈希表,其中每个element 存储其count,按计数顺序存储next 元素和按计数顺序存储previous 元素。然后,您可以在恒定时间内查看该哈希表中下一个和上一个元素的条目。对于此哈希表,您还保留和更新计数最多的元素。 (element -> count, next_element, previous_element)

在每个不同数量的元素的第二个哈希表中,您将具有该计数的元素存储在第一个哈希表的范围的开头和结尾。请注意,此哈希表的大小将小于n(我认为是O(sqrt(n)))。 (count -> (first_element, last_element))

基本上,当您在双端队列中添加或删除元素时,您可以通过分析其nextprevious 元素以及新旧计数的值来找到它在第一个哈希表中的新位置在恒定时间内的第二个哈希表中。您可以使用链表算法在恒定时间内删除和添加第一个哈希表中的元素。您还可以在恒定时间内更新第二个哈希表和具有最大计数的元素。

如果需要,我会尝试编写伪代码,但它似乎很复杂,有很多特殊情况。

【讨论】:

  • 我同意这个答案,因为这是我向面试官提出的,而且更自然。但是,您也说过同样的话,我的面试官也说过“很难对此进行编码,并且可能在某些极端情况下可能无法正常工作”。因此,我认为这更容易实现,尽管速度较慢。
  • 我认为它适用于所有情况,但是,是的,编码可能真的很棘手,因此应该进行非常彻底的测试。
  • 我不明白:当一个值多次出现时,它会在您的第一个哈希表中出现一次还是多次?我会考虑多次,因为不同副本的下一个和上一个是不同的,但是当添加一个新副本时,您必须更新所有副本的计数,这可能是 O(N)。
  • 对不起,迟到的评论。它只发生一次。例如队列是 ('a', 'b', 'c', 'b', 'b', 'c')。那么第一个哈希表是 ('a'->(1, 'c', Null), 'b'->(3, Null, 'c'), 'c'->(2, 'b', 'a '))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2011-01-27
  • 2011-08-01
  • 2015-06-22
  • 2017-04-16
相关资源
最近更新 更多