【发布时间】:2017-10-18 06:23:00
【问题描述】:
我想删除数据中的重复值。我知道这是 stackoverflow 中经常观察到的问题,但我的问题有点不同,因为现在我正在处理非常大的数据。因此,我必须在我的代码中考虑最多的执行时间。
如下sn-p,我做了一个简单的删除重复值的代码。
// Suppose that the dataset is very huge so that
// multi-node resources should be necessary.
String[] data = new String[10_000_000];
HashMap<String, String> uniqueItems = new HashMap<>();
for (int i = 0; i < data.length; i++) {
if (uniqueItems.containsKey(data[i])) {
uniqueItems.remove(data[i]);
uniqueItems.put(data[i], "inserted");
} else {
uniqueItems.put(data[i], "inserted");
}
}
但是,我不喜欢它,因为我认为其他更好的数据结构或不同的算法可以比我的代码有效地删除重复。
所以我想寻找更好的方法来在数据很大时快速删除重复值。
如果您能告诉我删除重复值的最快方法,我将不胜感激。
另外,我想知道重复值的数量是否会影响性能。我的意思是如果重复值是原始数据的 50%,那么最佳算法和数据结构的选择会改变吗?如果是这样,我想找到一种可以在一般情况下取得良好性能的方法。
【问题讨论】:
-
您会考虑使用
Set吗? -
例如参见 stackoverflow.com/questions/40717681/… 和 stackoverflow.com/questions/16693408/…。或者使用 hadoop/map-reduce:stackoverflow.com/questions/38065737/… ... 那么您又花了多少时间进行研究?
-
为什么要删除然后重新插入重复的项目?
-
对于非常大的数据集,也许修改后的合并排序会在发现所有重复项后立即删除它们可能会很好。
-
用
Set<String> uniques = new HashSet<>(Arrays.asList(data));替换整个东西。
标签: java optimization hashmap time-complexity hashset