Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的可排序Iterable高效排序结构_Java_Collections_Sorted - Fatal编程技术网

Java中的可排序Iterable高效排序结构

Java中的可排序Iterable高效排序结构,java,collections,sorted,Java,Collections,Sorted,我已经浏览了(可能有几十个)StackOverflow问题,但我认为我没有找到我想要的 我想要一个具有以下属性的Java结构: 分类 宜人的 支持泛型 O(logn)(或更好)插入和移除 O(logn)(或更好)元件访问 允许重复条目 为什么??我正在实现一个k-最近距离算法。对于数据收集中的每个点,我需要找到距离第k个最近点的距离。该算法通过迭代每对点,计算它们之间的距离,然后将该距离添加到每个点的最近距离排序结构中(如果该距离比该列表中的其他元素更近)。下面是一些代码来演示: ArrayLi

我已经浏览了(可能有几十个)StackOverflow问题,但我认为我没有找到我想要的

我想要一个具有以下属性的Java结构:

  • 分类
  • 宜人的
  • 支持泛型
  • O(logn)(或更好)插入和移除
  • O(logn)(或更好)元件访问
  • 允许重复条目
  • 为什么??我正在实现一个k-最近距离算法。对于数据收集中的每个点,我需要找到距离第k个最近点的距离。该算法通过迭代每对点,计算它们之间的距离,然后将该距离添加到每个点的最近距离排序结构中(如果该距离比该列表中的其他元素更近)。下面是一些代码来演示:

    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类之前,以下是我不想使用它们的原因:

  • PriorityQueue-无法访问其中的最后一个元素
  • 树集-不允许重复的距离
  • ArrayList-是的,我可以使用ArrayList,将所有n-1距离插入其中,在O(nlogn)时间内对其排序,然后删除第k个元素。但是,这需要O(n^2)空间而不是O(nk)空间
  • ArrayList—或者,我可以维护一个排序的ArrayList,删除最后一个元素并在正确的位置插入新元素,但是每次插入都需要O(k)时间,而O(logk)则需要找到插入的位置

  • 有人知道这样的结构吗?最近我一直在思考这个问题,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);
    }