【问题标题】:How to increase efficiency如何提高效率
【发布时间】: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


【解决方案1】:

我从您发布的代码中怀疑您错过了作业的重点。这个想法不是使用 Java 库来检查两个集合是否相等(为此,您可以使用 collection1.equals(collections2)。而是提出一个比较集合的算法。Java API 没有指定算法:它隐藏在实现中。

在不提供答案的情况下,让我举一个可行但不一定有效的算法示例:

for each element in coll1
    if element not in coll2
        return false
    remove element from coll2
return coll2 is empty

问题指定序列是有序的(即定义了总顺序关系),这意味着您可以比上面的算法做得更好。

一般来说,如果您被要求演示一种算法,最好坚持使用本机数据类型和数组 - 否则库类的实现会显着影响效率并将您想要收集的数据隐藏在算法本身上。

【讨论】:

  • 感谢大家的输入,这是我的新解决方案 1) 使用两个索引变量 i 和 j,将它们的初始值设置为 0 2) 如果 S1[i] 小于 S2[j ] 算法增加 i。 3) 如果 S1[i] 大于 S2[j],算法增加 j。 4) 如果两者相同,则打印其中一个,算法增加 I 和 j。我不确定如何避免重复并提高效率。我认为该算法需要 O(m +n) 时间
  • @user9589242 如果两个元素不相等,则不需要增加任一索引:此时您知道集合不包含相同的元素。另请注意,这假设集合首先排序。仅仅因为存在顺序关系并不意味着它已被应用。
  • 谢谢 sprinter 现在说得通了 :)
  • @user9589242 如果解决了您的问题,请接受答案
猜你喜欢
  • 2013-07-03
  • 2011-02-21
  • 2016-12-18
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-10-28
  • 2021-12-11
  • 2019-12-05
相关资源
最近更新 更多