Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
Java 使用list.retainal最坏的情况是什么 静态列表公用(字符串[]A,字符串[]B){ Collection listone=newarraylist(Arrays.asList(A)); 列表排序=新的ArrayList(Arrays.asList(B)); 已排序。保留(列表一); 返回排序; }_Java_List_Arraylist_Collections_Big O - Fatal编程技术网

Java 使用list.retainal最坏的情况是什么 静态列表公用(字符串[]A,字符串[]B){ Collection listone=newarraylist(Arrays.asList(A)); 列表排序=新的ArrayList(Arrays.asList(B)); 已排序。保留(列表一); 返回排序; }

Java 使用list.retainal最坏的情况是什么 静态列表公用(字符串[]A,字符串[]B){ Collection listone=newarraylist(Arrays.asList(A)); 列表排序=新的ArrayList(Arrays.asList(B)); 已排序。保留(列表一); 返回排序; },java,list,arraylist,collections,big-o,Java,List,Arraylist,Collections,Big O,我试着寻找API源代码;但是我找不到list.Retainal方法的任何内容 然而,我相信它是O(n)。正确吗?答案取决于作为参数传递到retainal的集合类型。以下是来自以下方面的实现: 注意:ArrayList,它不会在执行时删除单个元素,而是重写要保留在列表初始部分的元素,然后在O(1)中一次性删除所有“尾部”元素。结合上面的HashSet,这将为您提供一个时间上为O(M+N)、空间上为O(M)的算法。最坏的情况似乎是O(大小A*大小B)或O(nm)。这是因为保留所有查看已排序的中的每个

我试着寻找API源代码;但是我找不到list.Retainal方法的任何内容


然而,我相信它是O(n)。正确吗?

答案取决于作为参数传递到
retainal
的集合类型。以下是来自以下方面的实现:


注意:
ArrayList
,它不会在执行时删除单个元素,而是重写要保留在列表初始部分的元素,然后在O(1)中一次性删除所有“尾部”元素。结合上面的
HashSet
,这将为您提供一个时间上为O(M+N)、空间上为O(M)的算法。

最坏的情况似乎是
O(大小A*大小B)
O(nm)
。这是因为保留所有查看已排序的
中的每个项目,并将其与
列表中的每个项目进行比较(使用迭代器)


在最坏的情况下,如果没有类似的项目,那么这种情况就会发生。但是,如果排序后的
中的所有项都在
listone
的迭代器末尾,那么这也会“几乎”发生。
e.remove()
对于
ArrayList
也是线性的。我认为这取决于“保留对象”的类型以及指定的集合。最好的例子是线性的,比如一个
LinkedList
retainee和一个指定的
HashSet
@msandiford谢谢你的评论!我添加了更多信息来解释这一点。@dasblinkenlight:
ArrayList
有自己的非默认
retainal
实现,在O(NM)中运行@LouisWasserman啊,你说得对,这就是我建议OP应该做的算法。
static List<String> common(String[] A, String[] B){
    Collection<String> listone = new ArrayList<String>(Arrays.asList(A));
    List<String> sorted = new ArrayList<String>(Arrays.asList(B));
    sorted.retainAll( listone );
return sorted;
}
public boolean retainAll(Collection<?> c) {
    boolean modified = false;
    Iterator<E> e = iterator();
    while (e.hasNext()) {
       if (!c.contains(e.next())) {
           e.remove();
           modified = true;
       }
   }
   return modified;
}
Set<String> temp = new HashSet<String>(b);
a.retainAll(temp);