获取列表常用值计数

时间:2011-12-14 11:30:01

标签: java list compare

我有两个ArrayList<Long>,每个大小约为5,00,000。我尝试过使用for循环使用list.contains(object),但这需要花费太多时间。我试过通过拆分一个列表并在多个线程中进行比较但没有找到有效的结果。

我需要不。两个列表中相同的元素。

任何优化方式?

5 个答案:

答案 0 :(得分:3)

l1成为第一个列表,l2成为第二个列表。在Big O表示法中,它在O(l1*l2)

中运行

另一种方法可能是将一个列表插入HashSet,然后对另一个列表中的所有其他元素进行测试(如果它存在于HashSet中)。这将大致给出2*l1+l2 -> O(l1+l2)

答案 1 :(得分:2)

您是否考虑过将这些元素放入HashSet?这将使查找更快。这当然只有在没有重复的情况下才有效。

如果您有重复项,则可以构造HashMap,其值为键,计数为值。

答案 2 :(得分:1)

一般机制是对两个列表进行排序,然后迭代排序列表以查找匹配项。

答案 3 :(得分:1)

当你有很多元素时,列表不是一个有效的数据结构,你在搜索元素时必须使用更有效的数据结构。 例如树或散列图!

答案 4 :(得分:0)

让我们假设列表1具有m个元素,列表2具有n个元素,m> n。如果元素没有数字排序,那么它们似乎不是,比较步骤的总数 - 即方法的成本 - 因子mxn - n ^ 2/2。在这种情况下,成本因素约为50000x49999。

保持两个列表的顺序将是最佳解决方案。如果订购了清单,那么这些清单的成本将是因子m。在这种情况下,大约是50000.当通过两个光标迭代两个列表时,将实现该最佳结果。此方法可以在代码中表示如下:

int i=0,j=0;
int count=0;
while(i<List1.size() && j<List2.size())
{
    if(List1[i]==List2[j])
    {
        count++;
        i++;
    }
    else if(List1[i]<List2[j])
        i++;
    else
        j++;
}

如果您可以随时保留列表,则此方法会有所不同。此外,我认为除非订购列表,否则不可能拆分和比较。