查找并列出由10,000,000,00个元素组成的无序数组中的重复项

时间:2010-12-11 13:53:53

标签: java arrays

如何在数组中复制元素,包括 无序的10,000,000,00元素,待定?它们如何列出?

请确保在编写Java代码逻辑时注意性能。

逻辑的空间复杂性和时间复杂度是什么?

考虑一个示例数组DuplicateArray[],如下所示。

String DuplicateArray[] =  {"tom","wipro","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael",
"Bill","HP","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael",
"Bill","HP","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael",
"Agnus","wipro","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael",
"Obama","wipro","hcl","Ibm","rachael","tom","wipro","hcl","Ibm","rachael","rachael","tom","wipro","hcl","Ibm","rachael",
"Obama","HP","TCS","CTS","rachael","tom","wipro","hcl","Ibm","rachael","rachael","tom","wipro","hcl","Ibm","rachael"}

4 个答案:

答案 0 :(得分:2)

我建议你使用Set。最适合你的是HashSet。将您的元素逐一放入其中。并检查每次插入操作是否存在。

这样的事情:

HashSet<String>hs = new HashSet<String>();
HashSet<String>Answer = new HashSet<String>();
for(String s: DuplicateArray){
    if(!hs.contains(s))
        hs.add(s);
    else
        Answer.add(s);
}

代码取决于假设,数组元素的类型是String

答案 1 :(得分:1)

你去吧

class MyValues{
    public int i = 1;
    private String value = null;

    public MyValues(String v){
        value = v;
    }

    int hashCode()
    {
        return value.length;
    }

    boolean equals(Object obj){
        return obj.equals(value);
    }
}

现在迭代重复

private Set<MyValues> values = new TreeSet<MyValues>();
for(String s : duplicatArray){
    MyValues v = new MyValues(s);
    if (values.add(v))
    {
        v.i++;
    }
}

时间和空间都是线性的。

答案 2 :(得分:0)

预计会有多少重复?一些或与之间的条目数或其他东西相当?

你对这些价值观有什么了解吗?例如,他们来自某些特定字典吗?

如果没有,则遍历数组,构建一个HashSet,注意何时即将添加已存在的条目并将其保留在列表中。我看不出其他任何东西会更快。

答案 3 :(得分:0)

首先,你的意思是10,000,000,00十亿或十亿。如果您的意思是后者,则数组或Set中的元素数不能超过20亿。到目前为止,您的建议在这种情况下不起作用。要在内存中拥有100亿个字符串,至少需要640 GB和AFAIK,没有可用的服务器可以在单个JVM中使用这个内存量。

对于这么大的任务,您可能必须考虑一个解决方案,该解决方案可以跨多台计算机分解工作,或者将工作放入文件中以便稍后处理。

你必须假设;

  • 您拥有相对较少的唯一字符串。在这种情况下,您可以在内存中构建到目前为止所看到的单词。这些将适合记忆。 (或者你可以假设他们这样做)

  • 将文件分解为可管理的大小。一种简单的方法是根据哈希码写入几百个工作文件。相同字符串的哈希码将是相同的,因此当您处理内存中的每个文件时,您知道它将包含所有重复项(如果有的话)。