我有一个很大的名字列表(名字和姓氏):例如:
{ john a, david x, marry u, john b, david y, john c}
结果应该是(按名字分组,按名字的频率排序,不考虑姓氏。):
john b
john a
john c
david x
david y
marry u
我有一个非常大的列表(30M实例),所以我必须考虑算法的复杂性。
答案 0 :(得分:3)
Map<String, Integer> freq = new HashMap<String, Integer>();
for (String s: names):
first_name = Arrays.asList(s.split()).get(0).toLowerCase()
int count = freq.containsKey(name) ? freq.get(name) : 0;
freq.put(name, count + 1);
Arrays.sort(names, new Comparator<String>() {
public int compare(String s1, String s2) {
int c = freq.get(Arrays.asList(s1.split()).get(0).toLowerCase()) - Arrays.asList(s2.split()).get(0).toLowerCase();
return c;
}
});
基本上制作名字出现频率的直方图,然后将其用作自定义比较器。
这只是两个操作,所以你受到问题最复杂区域的复杂性的限制,并且因为直方图生成是线性的,所以我受到排序函数的限制,我认为nlogn
是{{1}}最好的你可以做分类。