Java中的可排序Iterable高效排序结构
我已经浏览了(可能有几十个)StackOverflow问题,但我认为我没有找到我想要的 我想要一个具有以下属性的Java结构:Java中的可排序Iterable高效排序结构,java,collections,sorted,Java,Collections,Sorted,我已经浏览了(可能有几十个)StackOverflow问题,但我认为我没有找到我想要的 我想要一个具有以下属性的Java结构: 分类 宜人的 支持泛型 O(logn)(或更好)插入和移除 O(logn)(或更好)元件访问 允许重复条目 为什么??我正在实现一个k-最近距离算法。对于数据收集中的每个点,我需要找到距离第k个最近点的距离。该算法通过迭代每对点,计算它们之间的距离,然后将该距离添加到每个点的最近距离排序结构中(如果该距离比该列表中的其他元素更近)。下面是一些代码来演示: ArrayLi
ArrayList<SortedThing<Double>> nearestDistances = new ArrayList<SortedThing<Double>>(numPoints);
for (int i = 0; i < numPoints; i++) {
nearestDistances.add(new SortedThing<Double>(k));
}
for (int point = 0; point < numPoints; point++) {
for (int otherPoint = point+1; otherPoint < numPoints; otherPoint++) {
double distance = computeDistance(point, otherPoint);
if (nearestDistances.get(point).size < k)
nearestDistances.get(point).add(distance);
else if (nearestDistances.get(point).last() > distance) {
nearestDistances.get(point).removeLast();
nearestDistances.get(point).add(distance);
}
if (nearestDistances.get(otherPoint).size < k)
nearestDistances.get(otherPoint).add(distance);
else if (nearestDistances.get(otherPoint).last() > distance) {
nearestDistances.get(otherPoint).removeLast();
nearestDistances.get(otherPoint).add(distance);
}
}
}
ArrayList nearestDistances=新的ArrayList(numPoints);
对于(int i=0;i距离){
nearestdistance.get(point.removeLast();
最近距离。获取(点)。添加(距离);
}
if(最近距离。获取(其他点)。大小distance){
nearestdistance.get(otherPoint.removeLast();
最近距离。获取(其他点)。添加(距离);
}
}
}
在建议使用以下任何内置Java类之前,以下是我不想使用它们的原因:
有人知道这样的结构吗?最近我一直在思考这个问题,Java没有提供任何这样的结构,这让我感到很奇怪。如果您正在进行最近邻搜索,那么您可能需要使用;(在.jar文件的\bak目录中查找源代码) 否则,我建议使用树映射,其中的值是重复键的数量(1表示没有重复,2表示一个重复,等等)
Map Map=newtreemap();
if(地图容器(图例)){
map.put(键,map.get(键)+1);
}否则{
地图放置(图例1);
}
从中检查
TreeBag
使用TreeMap
保存条目。仅用于记录,如果允许重复,TreeSet将是理想选择。宾果!我不知道我怎么没有想到这一点。非常感谢你!关于k-d树,还有一点:我不想使用任何类型的索引结构(如k-d树)对点进行排序,因为我需要在许多不同的维度组合上多次进行k-最近距离搜索。谢谢,这会起作用,但是我想我会坚持使用Zim Zam建议的TreeMap实现,因为它需要处理的工作更少。它在概念上与TreeBag
内部使用TreeMap
相同。是的,我理解。使用TreeMap更简单,因为我不需要下载任何东西(我所说的“更少的工作”)。
Map<Key, Integer> map = new TreeMap<>();
if(map.containsKey(key)) {
map.put(key, map.get(key) + 1);
} else {
map.put(key, 1);
}