【发布时间】:2019-04-27 13:46:31
【问题描述】:
我有以下作业问题: 假设给定两个包含 n 个元素的序列 S1 和 S2,可能包含重复项,并在其上定义了全序关系。描述一种确定 S1 和 S2 是否包含相同元素集的有效算法。分析这个方法的运行时间
为了解决这个问题,我使用retainAll 和HashSet 比较了两个数组的元素。
Set1.retainAll(new HashSet<Integer>(Set2));
这将在恒定时间内解决问题。 是否需要在retainAll 步骤之前对两个数组进行排序以提高效率?
【问题讨论】:
-
排序顺序与基于散列的集合无关。
-
老实说,我在这里没有看到任何算法,所以我认为这无论如何都会导致分配失败。
-
retainAll如果我们有两个不同的序列S1 = (1,2,3)和S2 = (1,1,2,3),你认为它们包含相同的元素集吗? -
和往常一样,首先将这个不是视为一个编程问题,而是一个谜题。假设我给了你两副牌,每副牌里有 200 件物品。我问你它们是否包含相同的卡片。你会怎么做?假设我给了你两副 1000 张牌——然后呢?这个问题给了你一个线索:你可以对卡片进行排序,只要你告诉我排序需要多长时间。
-
单行并不总是意味着时间=1。
HashSet构造需要O(n),retainAll也是如此(通常,它需要O(n²),但使用HashSet,它更快)。此外,您的线路根本不会产生任何结果。+++通常,散列比使用顺序要快,但您已经获得了可比较的元素。所以你应该使用订单。
标签: java performance processing-efficiency coding-efficiency