例如下面的代码:
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.contains
,n = 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.contains
和HashSet.remove
都是O(1)
(摊销)。
如果您要打电话
common.retainAll(Arrays.asList(b));
然后,由于O(n)
contains
在Arrays.ArrayList
此将成为O(a.length * b.length)
-即通过花费O(n)
的阵列复制到HashSet
您实际拨打电话来retainAll
要快得多。
就空间复杂度而言,不需要任何额外的空间(Iterator
)retainAll
,但是在您分配两个HashSet
实际上完全成熟的新实现时,从空间角度来说,您的调用实际上是相当昂贵的HashMap
。
还可以注意两点:
HashSet
从中的元素分配a
- 可以使用也O(1)
从中间删除的便宜集合LinkedList
。(更便宜的内存以及建立时间-不会建立哈希表)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),