以递归dfs方式查找最近邻居

时间:2009-11-04 18:15:52

标签: depth-first-search

我试图以递归深度优先的方式找到最近的邻居。在达到这一点之前涉及许多元素,为了保持简单,我只包括了我当前遇到麻烦的部分。

我的想法是根据一些阈值距离找到给定点的最近邻居,我决定将进程int分成两种方法。一个真正找到最近邻居是否存在以及其他方法只是递归地反复调用该函数。

我有一个带有双值的ArrayList,我把它视为点...如果返回0.0,意味着我找不到最近的邻居(想知道我是否真的使用了对象,可能会在清理逻辑后执行此操作)。

/**
 * Find the nearest neighbor based on the distance threshold.
 * TODO:
 * @param currentPoint current point in the memory.
 * @param threshold dynamic distance threshold.
 * @return return the neighbor.
 */

private double nearestNeighbor(double currentPoint) {

    HashMap<Double, Double> unsorted = new HashMap<Double, Double>();
    TreeMap<Double, Double> sorted = null; 
    double foundNeighbor = 0.0;

    for (int i = 0; i < bigCluster.length; i++) {
        if (bigCluster[i] != 0.0 && bigCluster[i] != currentPoint) {
            double shortestDistance = Math.abs(currentPoint - bigCluster[i]);
            if (shortestDistance <= this.getDistanceThreshold())
                unsorted.put(shortestDistance, bigCluster[i]);
        }
    }
    if (!unsorted.isEmpty()) {
        sorted = new TreeMap<Double, Double>(unsorted);
        this.setDistanceThreshold(avgDistanceInCluster());
        foundNeighbor = sorted.firstEntry().getValue();
        return foundNeighbor;
    } else {
        return 0.0;
    }
}

这是我的方法,我计划以递归的dfs方式调用上面的方法。

/**
 * Method will check if a point belongs to a cluster based on the dynamic 
 * threshold.
 */
public void isBelongToCluster(double point) {

    for (int i = 0; i < tempList.size(); i++) {

        double aPointInCluster = point;
        cluster.add(aPointInCluster);
        isVisited[i].visited = true;
        double newNeighbor = nearestNeighbor(aPointInCluster);
        if (newNeighbor != 0.0) {
            cluster.add(newNeighbor);
            if (i + 1 != tempList.size() && (isVisited[i].visited != true)) {
                isBelongToCluster(newNeighbor);
            }
        }

    }
    for (int i = 0; i < cluster.size(); i++) {
        if (cluster.get(i) != 0.0)
            System.out.println("whats in the cluster -> " + cluster.get(i));
    }
}

我正在努力的是递归深度优先搜索。除此之外,我的访客实施看起来并不合适。

这是我尝试处理访客的方式

public class VisitedPoint {

    public double point;
    public boolean visited;

    public VisitedPoint(double pointToCheck) {
        point = pointToCheck;
        visited = false;
    }
}

然后我会创建一个VisitedPoint对象,private VisitedPoint[] isVisited;但是当我在isBelongTo()方法中使用它时,我得到一个空指针异常。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

感觉就像你正在使它变得更加复杂。

如果我理解正确,你有一系列1维点数据。您正尝试将这些点分类为组,在组中,任何一对点之间的距离小于“阈值距离”。

我首先要对1维点数据进行排序。从第一个元素开始,我为该元素创建一个集群对象。如果第一个元素和第二个元素之间的增量小于阈值,则将其添加到集群。现在我来看看第二和第三之间的差异;沿着排序的数据前进,并创建一个新的集群,当我发现一个大于阈值的delta时,将事物分类,直到我在数据的末尾。

这是解决问题还是我错过了关键要求?

答案 1 :(得分:1)