在Java中实现可比较项的两个已排序列表之间的差异

卡洛斯·路易斯(Carlos Luis)

在Java中实现一种方法来计算L1和L2之间的差异()。L1 \ L2 = {x | x∈L1和x∉L2}。

到目前为止,这是我的实现:

public static <AnyType extends Comparable<? super AnyType>> 
    void difference(List<AnyType> L1, List<AnyType> L2, List<AnyType> Difference){

        if(L1 == null){
            Difference = null;
        }
        else if(L2 == null){
            Difference = L1;
        }
        else if(L1.size()==0 || L2.size()==0){
            Difference = L1;
        }
        else{
            Iterator<AnyType> it1 =L1.listIterator();
            Iterator<AnyType> it2 =L2.listIterator();

            AnyType a = it1.next();
            AnyType b = it2.next();

            while(true){
                if(a.compareTo(b)>0){
                    if(it2.hasNext()){
                        b = it2.next();
                    }
                    else{
                        Difference.add(a);
                        while(it1.hasNext()){
                            a = it1.next();
                            Difference.add(a);
                        }
                        break;
                    }
                }
                else if(a.compareTo(b)<0){
                    Difference.add(a);
                    if(it1.hasNext()){
                        a = it1.next();
                    }
                    else break;
                }
                else {
                    if(it1.hasNext()){
                        a =it1.next();
                    }
                    else break;
                }
            }
        }
        System.out.println("Difference Set: " + Arrays.toString(Difference.toArray()));
    }


这不是简单的解决方案,而是实现两个嵌套的for循环并将正确的元素保存到结果列表中,该解决方案是O(n ^ 2)
另一种可能的解决方案是使用二进制搜索来搜索第二个列表,该算法将为O(n * Log(n))
此处实现的解决方案,尝试仅浏览一次列表并在第一遍中完成,这将是O (n)线性。
该算法运行良好,但是感觉它仍然可以使用一些优化,感觉就像意大利面条代码大声笑。有什么指针可以帮助我优化这一点吗?

詹姆士·坦纳

我看到的第一件事是您a.compareTo(b)对循环中的每个迭代执行两次。而是使用compareTo一次并将结果存储在两个if语句中。

其次,使用一致的命名方案,例如objA和,iterA而不是ait1这只会使其更容易理解。就此而言,不要害怕更长的名称。listA比起l1可能会有几个额外的字符,但值得一读。(此外,请不要忘记您不应该以大写字母开头的变量,这L1是双重不妙的。)

最后,发表评论评论评论我知道这种算法,因此我可以很好地遵循代码,但是它远不能自我记录。对每个if语句进行注释并循环,以记录条件是什么,为什么要检查以及如何对结果进行处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:两个列表之间的差异

使用Java中的可比较按两个字段升序和降序对对象列表进行排序

从字母顺序列表中重新排序两个值。枚举/比较器

比较python中的两个列表并打印差异

检测两个序列之间的差异

给定两个间隔的排序列表,返回两个列表之间的重叠间隔

比较两个列表并获得差异

Java - 获取两个列表之间的差异

计算python中两个列表的元素之间的差异

如何在Java 8中比较两个日期之间的分钟差异,同时还要考虑时区差异?

比较两个文件并在 Java 中打印差异

获得两个列表之间的差异

找出两个列表之间的差异

在 C 中合并两个排序列表

比较两个列表并对已添加和已删除条目进行排序

如何遍历python中的列表并获取每两个关闭项之间的比较值的布尔列表?

比较两个无序列表以了解各个元素的差异

比较两个列表排序

比较和排序两个列表

在 Java 中合并两个排序列表,参考问题

Java中两个日期之间的天数差异?

两个单词列表之间的比较

算法:两个有序列表之间的差异,按顺序和组成

使用linq检索具有重复项的两个列表之间的差异

Java中两个大小不相同的数组列表如何比较大小和打印差异

比较linux中的两个未排序列表,在第二个文件中列出唯一列表

PHP比较两个日期之间的差异

使用Javascript比较两个表之间的差异

在Python中比较两个列表列表,并找出具有相同索引的列表之间的差异