我有一个数组,正在寻找重复项。
duplicates = false;
for(j = 0; j < zipcodeList.length; j++){
for(k = 0; k < zipcodeList.length; k++){
if (zipcodeList[k] == zipcodeList[j]){
duplicates = true;
}
}
}
但是,当没有重复项时,此代码不起作用。为什么?
原文由 Snowman 发布,翻译遵循 CC BY-SA 4.0 许可协议
在鼻子上回答..
编辑切换
.equals()
回到==
因为我读到你正在使用的地方int
在最初的问题中没有明确还要设置k=j+1
,将执行时间减半,但它仍然是 O(n 2 )。更快(在极限)方式
这是一种基于哈希的方法。您必须为自动装箱付费,但它是 O(n) 而不是 O(n 2 )。一个有进取心的人会去寻找一个原始的基于 int 的哈希集(我认为 Apache 或 Google Collections 有这样的东西。)
向惠勒鞠躬
有关或多或少的 O(n) 解决方案,请参阅 HuyLe 的回答,我认为这需要几个附加步骤:
或者只是为了紧凑
有关系吗?
好吧,所以我运行了一个小基准测试,到处都是不确定的,但这是代码:
使用 NSQUARED:
使用哈希集
与位集
比塞特赢了!
但仅差一点… .15ms 在
currentTimeMillis()
的误差范围内,并且我的基准测试中存在一些漏洞。请注意,对于任何超过 100000 的列表,您可以简单地返回true
因为会有重复。事实上,如果列表是随机的,您可以返回真正的 WHP 以获得更短的列表。道德是什么?在极限情况下,最高效的实现是:而且你不会经常犯错。