Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
整数集ADT的摊销分析(Java考试)_Java_Algorithm_Data Structures_Time Complexity - Fatal编程技术网

整数集ADT的摊销分析(Java考试)

整数集ADT的摊销分析(Java考试),java,algorithm,data-structures,time-complexity,Java,Algorithm,Data Structures,Time Complexity,如果我没有误解摊销分析,那么这道试题真的很狡猾。所以我想我是误会了 “实现一个容量为n的集合ADT,它可以包含所有小于或等于n的正整数。要求: 新设置(n)-O(n) 插入(i)-O(1) 成员(i)-O(1) union(s)-O(1),其中s是相同类型的集合。如果愿意,可以销毁s 对操作进行运行时分析。如果需要,请使用摊销分析。” 您可以将其实现为大小为n的布尔数组。简单的豌豆。唯一困难的是联合行动。我无法理解,解决方案建议使用for循环执行“大小”和操作,这显然是O(n)。但是在for循环

如果我没有误解摊销分析,那么这道试题真的很狡猾。所以我想我是误会了

“实现一个容量为n的集合ADT,它可以包含所有小于或等于n的正整数。要求:

新设置(n)-O(n)

插入(i)-O(1)

成员(i)-O(1)

union(s)-O(1),其中s是相同类型的集合。如果愿意,可以销毁s

对操作进行运行时分析。如果需要,请使用摊销分析。”

您可以将其实现为大小为n的布尔数组。简单的豌豆。唯一困难的是联合行动。我无法理解,解决方案建议使用for循环执行“大小”和操作,这显然是O(n)。但是在for循环之后,他们将s的布尔数组设置为null,并声称这使得摊销运行时间O(1)

当然,如果您将新的集合与相同的集合合并n次,则平均运行时间为O(1),因为只有一个操作是O(n),其余操作是常量。但我们为什么要关心这个呢?你如何证明这一分析?做一个n倍的无意义操作如何成为摊销分析的公平基准?

让我们暂时忽略插入(i)和成员(i)查询,只关注创建新集合和形成联合

诀窍在于,如果在执行并集后销毁了,那么在新的集合创建和并集操作的任何序列中,执行的并集数永远不可能超过集合创建数:每个并集操作要求当前至少存在2个集合,并将存在的集合总数减少1

考虑任意顺序的c新集创建和u
因此,如果悲观地假设每一个集合创建都将被计入未来的联合操作中,那么每一个集合创建的成本将变为(或者说仍然是)O(n+1)+O(n+1)=O(n),而每一个联合操作的成本将变为O(1),这个甚至更高的成本将是新成本体系的上限(即永远不会低估),这是任何集合创建和联合操作序列的真实成本。

你说得对,这种说法似乎有点可疑。需要考虑使用n个不同集合执行n个并集运算的情况,并且即使在摊销分析下也应具有复杂性Θ(n)。你确定他们就是这么做的吗?也许你要分摊建造电视机的费用。也许联合的代价是较小集合的大小,并且每个元素都以恒定的代价添加。因此,如果使用大量元素进行联合,首先必须单独添加这些元素(许多低成本操作)。不确定这一点——只是第一印象。精彩的解释,但我仍然觉得这是一个非常狡猾的问题。。。如果我们任意销毁另一组,它是O(1)摊销,但如果我们不销毁,它是O(n)??我们添加了一行计算,它甚至不会影响正在操作的对象,并且可以提高运行时间?如果这不是律师的规则,我不知道什么是…这很棘手:)但有时情况下,这将是你所需要的全部,就像在某些情况下,可以在总数中添加一个数字,而不保留以前的总数。顺便说一句,如果你认为这是有帮助的,我会感谢你的支持;)