当前位置: 首页 > 面试题库 >

在Java中的HashSets上使用方法keepAll的时间和空间复杂度是多少?

邓开济
2023-03-14
问题内容

例如下面的代码:

public int commonTwo(String[] a, String[] b)
{
    Set common = new HashSet<String>(Arrays.asList(a));
    common.retainAll(new HashSet<String>(Arrays.asList(b)));
    return common.size();
}

问题答案:

让我们仔细阅读一下代码。该方法retainAll继承自AbstractCollection(至少在OpenJDK中),并且看起来像这样:

public boolean retainAll(Collection<?> c) {
    boolean modified = false;
    Iterator<E> it = iterator();
    while (it.hasNext()) {
        if (!c.contains(it.next())) {
            it.remove();
            modified = true;
        }
    }
    return modified;
}

这里要注意一个大问题,我们循环this.iterator()调用c.contains。因此,时间复杂度是n调用到c.containsn = this.size()最多n调用it.remove()

重要的是该contains方法是在 另一个 方法上调用的Collection,因此复杂度取决于 另一个 方法的复杂度Collection
contains

因此,虽然:

Set<String> common = new HashSet<>(Arrays.asList(a));
common.retainAll(new HashSet<>(Arrays.asList(b)));

O(a.length),因为HashSet.containsHashSet.remove都是O(1)(摊销)。

如果您要打电话

common.retainAll(Arrays.asList(b));

然后,由于O(n) containsArrays.ArrayList此将成为O(a.length * b.length)-即通过花费O(n)的阵列复制到HashSet您实际拨打电话来retainAll要快得多。

就空间复杂度而言,不需要任何额外的空间(IteratorretainAll,但是在您分配两个HashSet实际上完全成熟的新实现时,从空间角度来说,您的调用实际上是相当昂贵的HashMap

还可以注意两点:

  1. 没有理由HashSet从中的元素分配a- 可以使用也O(1)从中间删除的便宜集合LinkedList。(更便宜的内存以及建立时间-不会建立哈希表)
  2. 创建新的集合实例并仅返回时,所做的修改会丢失b.size()


 类似资料:
  • 我有一个算法可以检查是否可以解决游戏行。游戏行是一个正整数数组,其中最后一个元素为 0。游戏标记从索引 0 开始,沿着数组移动它所在的整数指示的步数。 例如,[1,1,0]返回true,而[1,2,0]返回false。标记也可以向左或向右移动以解决游戏。也就是说,[3,3,2,2,0]是可解的。 我尝试了一些游戏行示例,并计算了最坏情况下的时间复杂度: 其他情况下给我的数字,我找不到与输入大小的关

  • 主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内

  • 问题陈述:给定一个非空字符串s和一个包含非空单词列表的字典字词,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。 我的解决方案: 我不确定时间和空间的复杂性。我认为它应该是2^n,其中n是给定字符串s的长度。谁能帮我证明时间和空间的复杂性? 我还有以下几个问题: 如果我不在GetAllSences函数中使用memo,那么在本例中时间复杂度是多少? 还有比这更好

  • 问题内容: 我写了以下课程: 然后,在我的方法中,我创建了一个,向其中添加了一些具有“ X”和“ angle”字段的对象。 然后,我使用: 这种排序方法的复杂性是什么? 问题答案: 您可能已经阅读了有关Collections排序的文档,但是这里适合您: 排序算法是一种修改的mergesort(如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。该算法提供了有保证的n log(n)性能。

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。

  • 问题内容: 我在Java类中有一个私有的LinkedList,并且经常需要检索列表中的最后一个元素。列表需要缩放,所以我试图确定在进行更改时是否需要保留对最后一个元素的引用(以实现O(1)),或者LinkedList类是否已经通过getLast()调用完成了此操作。 LinkedList.getLast()的big-O成本 是多少 , 有记载吗? (即,我是否可以依靠此答案,或者即使它是O(1),