【发布时间】:2020-07-12 17:12:39
【问题描述】:
所以我正在尝试创建一个算法来解决从 k 个排序的双向链表中删除最小值的问题。在这里,我们有 k 个排序的双向链表,其中 n 是所有列表中所有元素的总和。我们希望能够在 O(logk) 时间内移除最小值,并且只需要 O(n)是时候初始化数据结构了。
我正在考虑创建一个最小堆,其中元素是每个列表的第一个元素(因此一次只有 k 个元素在堆中),但我不完全确定从那里去哪里,特别是添加其余元素放入堆中。谁能帮我解决这个问题?
【问题讨论】:
-
O(log n) 时间甚至不足以遍历您拥有的链表。但除此之外,是的,将事物扔进以列表中的最小值为键的二进制堆中是个好主意。
-
啊等一下,我意识到我打错了,假设是 O(n) 时间来初始化数据结构。关于如何考虑列表中不在堆中的其他元素,您有什么建议吗?例如,假设我有 2 个列表 A = {1, 1, 2, 3} 和 B = {2, 3, 4, 5}。堆将包含元素 {1, 2},如果您调用 remove min 一次,将返回 1。如果你再次调用它,那么将返回 2,但它应该是 1,因为 A 有一个重复项。我不知道我该怎么做
-
@oliviah 堆将是一个链表堆,具有比较前导值的比较操作。现在您编写一个函数,从堆中拉出具有最小元素的列表,将该列表的尾部插入堆中(假设尾部非空),然后返回提取的值。
-
你知道每个列表的长度还是必须迭代才能知道?
标签: algorithm linked-list heap doubly-linked-list minimum