Algorithm 在算法中使用Find Union数据结构
我试图解决以下算法问题: 假设我们有一个数据结构,允许我们插入元素,删除并写入最小元素。假设我们知道一系列Algorithm 在算法中使用Find Union数据结构,algorithm,data-structures,union-find,Algorithm,Data Structures,Union Find,我试图解决以下算法问题: 假设我们有一个数据结构,允许我们插入元素,删除并写入最小元素。假设我们知道一系列n命令,它们要么是I(k)(插入k),要么是D(删除最小值并输出) 我们的任务是决定每个D命令将返回哪个数字。例如,对于序列: I(2) D I(5) I(4) I(3) D D I(1) D D 结果应该是 2 3 4 1 5 目标(或提示)是使用Find Union数据结构实现优于O(nlog(n))的复杂性,该结构允许我们在O(na(n))中进行n集、查找和联合,其中a(n)是逆阿
n
命令,它们要么是I(k)
(插入k),要么是D
(删除最小值并输出)
我们的任务是决定每个D
命令将返回哪个数字。例如,对于序列:
I(2) D I(5) I(4) I(3) D D I(1) D D
结果应该是
2 3 4 1 5
目标(或提示)是使用Find Union数据结构实现优于O(nlog(n))
的复杂性,该结构允许我们在O(na(n))
中进行n
集、查找和联合,其中a(n)
是逆阿克曼函数
这不是家庭作业——我正在准备考试,这项练习已经有两个多小时的困难了
如果有任何进一步的提示,我将不胜感激
编辑:我忘了添加一个关键假设。我们插入的所有数字都在1..n范围内
进一步编辑:事实证明,我不是第一个遇到这个问题的人;它被称为离线最小问题,任何感兴趣的人都可以做进一步的阅读不确定这个观察是否有用,但有时约束有助于创造力:很明显,命令
I(k1)I(k2)。。。我(kn)D。。。D
相当于通过kn
对k1
进行排序,仅使用比较无法在快于O(n log(n))
的情况下进行排序。所以在某个时候,你必须对看起来不像比较的键执行一些操作。@DanielWagnerEdit:我忘了添加一个重要的假设。我们插入的所有数字的范围为1..n
。这放松了常规案例排序的限制。不确定union find数据结构如何帮助降低时间复杂性!你提出这个问题了吗?这个问题对我来说毫无意义。在这种情况下,优先级队列就是合适的工具。这会给你O(n logn)的复杂性。目前还不清楚问题陈述中的什么技巧或漏洞可以使union find数据结构更高效。如果你说数字取自集合[1…n],那就不是同一个问题了。您应该声明每个数字只插入一次!不确定这个观察是否有用,但有时约束有助于创造力:很明显,命令I(k1)I(k2)。。。我(kn)D。。。D
相当于通过kn
对k1
进行排序,仅使用比较无法在快于O(n log(n))
的情况下进行排序。所以在某个时候,你必须对看起来不像比较的键执行一些操作。@DanielWagnerEdit:我忘了添加一个重要的假设。我们插入的所有数字的范围为1..n
。这放松了常规案例排序的限制。不确定union find数据结构如何帮助降低时间复杂性!你提出这个问题了吗?这个问题对我来说毫无意义。在这种情况下,优先级队列就是合适的工具。这会给你O(n logn)的复杂性。目前还不清楚问题陈述中的什么技巧或漏洞可以使union find数据结构更高效。如果你说数字取自集合[1…n],那就不是同一个问题了。您应该声明每个数字只插入一次!