我试过两种方法。
使用 HashMap 计算每个项目的计数,然后导航地图
HashMap<Integer, Integer> doc_counts = new HashMap<Integer, Integer>(); for (int i = 0; i < p; ++i) { int doc = alld[i]; Integer count = doc_counts.get(doc); if (null == count) count = 0; doc_counts.put(doc, count + 1); } // to now it cost 200ms already for (Entry<Integer, Integer> item : doc_counts.entrySet()) { heapCheck(h, hsize, item.getKey(), item.getValue()); // heap sort top hsize items }
首先对数组进行排序,然后使用堆排序获得前 N 个。
Arrays.sort(alld, 0, p); // the sort costs about 160ms int curr = alld[0]; int count = 0; for(int i = 0; i < p; i++) { int doc = alld[i]; if(doc == curr) { ++count; } else { ++nHits; //curr += base; heapCheck(h, hsize, curr, count); curr = doc; count = 1; } } // // Handle the last document that was collected. heapCheck(h, hsize, curr, count);
对一个有 1,600,000 个元素的数组进行测试表明,第二种方法花费了大约 170 毫秒,并且大部分时间都花在了排序上(大约 160 毫秒),第一种方法花费了 200 毫秒,即使只是将所有元素添加到 HashMap 中。如何提高性能、找到更快的映射或排序函数或将其更改为并行函数以使用多线程?