如何在数组中复制元素,包括 无序的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"}
答案 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中使用这个内存量。
对于这么大的任务,您可能必须考虑一个解决方案,该解决方案可以跨多台计算机分解工作,或者将工作放入文件中以便稍后处理。
你必须假设;
您拥有相对较少的唯一字符串。在这种情况下,您可以在内存中构建到目前为止所看到的单词。这些将适合记忆。 (或者你可以假设他们这样做)
将文件分解为可管理的大小。一种简单的方法是根据哈希码写入几百个工作文件。相同字符串的哈希码将是相同的,因此当您处理内存中的每个文件时,您知道它将包含所有重复项(如果有的话)。