найти ближайшего соседа в рекурсивной манере поиска в глубину

Я пытаюсь найти ближайшего соседа в рекурсивной манере поиска в глубину. Прежде чем перейти к этому моменту, необходимо включить много элементов, поэтому для простоты я включил только тот раздел, с которым у меня в настоящее время возникают проблемы.

Моя идея состоит в том, чтобы найти ближайшего соседа к данной точке на основе некоторого порогового расстояния, я решил разделить процесс на два метода. Один, чтобы действительно найти, существует ли ближайший сосед, и другой метод, чтобы просто вызывать эту функцию снова и снова рекурсивно.

У меня есть ArrayList с двойными значениями, которые я рассматриваю как точки... если возвращается 0,0, это означает, что я не нашел ближайшего соседа (интересно, действительно ли я использую Object, может сделать это после очистки логики).

/**
 * 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(), я получаю исключение нулевого указателя.

Заранее благодарю за любую помощь.


person add-semi-colons    schedule 04.11.2009    source источник


Ответы (2)


Такое ощущение, что вы делаете это более сложным, чем это должно быть.

Если я правильно понимаю, у вас есть ряд одномерных точечных данных. Вы пытаетесь классифицировать эти точки по группам, где внутри группы расстояние между любой парой точек меньше «порогового расстояния».

Я бы начал с сортировки одномерных точечных данных. Начиная с первого элемента, я создаю кластерный объект для этого элемента. Если дельта между первым элементом и вторым элементом меньше порога, я добавляю его в кластер. Теперь смотрю на дельту между вторым и третьим; продвижение по отсортированным данным и создание нового кластера для классификации вещей, когда я нахожу дельту, превышающую пороговое значение, до тех пор, пока я не окажусь в конце данных.

Это решает проблему или я пропустил ключевое требование?

person Mikeb    schedule 04.11.2009
comment
Спасибо за быстрый ответ, вы правильно поняли первую часть, пока у меня есть одномерные точечные данные. Но стоит ли ставить псевдокод всего алгоритма? Похоже, поставив только два раздела, вы могли бы запутать всех. - person add-semi-colons; 04.11.2009
comment
1.1 Начальная точка P рекурсивный поиск ближайшего соседа P → P' 1.2 если найден ближайший сосед P' 1.2.1 Добавить P' в кластер Ck 1.2.2 Обновить пороговое значение расстояния, рассчитанное на основе среднего расстояния между каждой парой точек в кластер. 1.2.3 будет сделан рекурсивный вызов, чтобы найти соседа P' 1.3 иначе 1.3.1 вернуться к точке P - person add-semi-colons; 04.11.2009
comment
Я все еще не вижу необходимости в рекурсии. Если набор данных отсортирован, то единственная другая точка, которая может быть ближе, чем P (от P'), — это следующий элемент. - person Mikeb; 04.11.2009
comment
Вот полный псевдокод, который я собрал перед началом кодирования. Это поиск кластеров внутри кластеров. Итак, A = {3, 1, 9, 2, 4, 32, 3.2}, скажем, я выбираю 9, я ищу ближайшего соседа в тот момент, когда я нахожу ближайший, равный 4, тогда я хочу сделать рекурсивный вызов с 4 (ДФС). - person add-semi-colons; 04.11.2009
comment
Извините, я не могу поместить весь псевдокод, так как он длиннее 600 символов. - person add-semi-colons; 04.11.2009

Взгляните на Лучший критически важный для производительности алгоритм для решения ближайшего соседа. Я надеюсь, что это помогает.

person Kaveh Shahbazian    schedule 04.11.2009
comment
Спасибо, это похоже на то, что я пытаюсь сделать. Я посмотрю на это. - person add-semi-colons; 05.11.2009