¿Cómo se convertiría esta Breadth-First-Search en un método estático en Java?

Buen esfuerzo en la traducción. Permítanme ofrecer mi código, luego una explicación:

import java.util.*;

class BreadthFirstSearch {
    public static ArrayList<String> BFS(
        Map<String, String[]> graph, String start, String target
    ) {
        Map<String, String> visited = new HashMap<>();
        visited.put(start, null);
        ArrayDeque<String> deque = new ArrayDeque<>();
        deque.offer(start);

        while (!deque.isEmpty()) {
            String curr = deque.poll();

            if (curr.equals(target)) {
                ArrayList<String> path = new ArrayList<>();
                path.add(curr);

                while (visited.get(curr) != null) {
                    curr = visited.get(curr);
                    path.add(curr);
                }

                Collections.reverse(path);
                return path;
            }

            for (String neighbor : graph.get(curr)) {
                if (!visited.containsKey(neighbor)) {
                    visited.put(neighbor, curr);
                    deque.offer(neighbor);
                }
            }
        }

        return null;
    }

    public static void main(String[] args) {
        Map<String, String[]> myGraph = new HashMap<>();
        myGraph.put(
            "lava", new String[] {"sharks", "piranhas"}
        );
        myGraph.put(
            "sharks", new String[] {"lava", "bees", "lasers"}
        );
        myGraph.put(
            "piranhas", new String[] {"lava", "crocodiles"}
        );
        myGraph.put(
            "bees", new String[] {"sharks"}
        );
        myGraph.put(
            "lasers", new String[] {"sharks", "crocodiles"}
        );
        myGraph.put(
            "crocodiles", new String[] {"piranhas", "lasers"}
        );
        System.out.println(BFS(myGraph, "crocodiles", "bees"));
        System.out.println(BFS(myGraph, "crocodiles", "crocodiles"));
        System.out.println(BFS(myGraph, "crocodiles", "zebras"));
    }
}

Salida

[crocodiles, lasers, sharks, bees]
[crocodiles]
null

Explicación

Tomé la decisión de diseño para evitar copiar una pathArrayList en cada nodo en el gráfico a favor de un visitedhash que almacena los nodos en childNode => parentNodepares. De esta manera, una vez que he localizado el nodo de destino, vuelvo sobre mis pasos para crear la ruta de una vez, en lugar de crear una ruta para cada nodo, la mayoría de los cuales finalmente no llevan a ninguna parte. Esto es más eficiente en espacio y tiempo; Python hace que sea demasiado fácil arruinar su complejidad de tiempo con el [] + []operador de concatenación de lista O (n).

Usar un child => parent visitedHashMap también es más simple de codificar en Java, que no tiene un peso ligero Pair/ Tuple/ structque pueda almacenar convenientemente diferentes tipos como nodos en la cola. Para hacer lo que está haciendo en Python al pasar una lista de 2 elementos a la cola, tendría que escribir su propia Pairclase, usar dos ArrayDeques o evitar los genéricos y usar la conversión, todo lo cual es feo (especialmente el por último, que tampoco es seguro).

Otro problema que noté en su código es el uso de una ArrayList como cola. La inserción y eliminación al principio de una lista es una operación O (n) ya que todos los elementos de la lista deben desplazarse hacia adelante o hacia atrás en la matriz subyacente para mantener la secuencia. La estructura de cola óptima en Java es un ArrayDeque , que ofrece O (1) agregar y quitar en ambos extremos y no es seguro para subprocesos, a diferencia de la colección Queue .

Del mismo modo, en Python, encontrará que el rendimiento es mejor utilizando la colección deque que ofrece una popleftoperación rápida para todas sus necesidades de colas. Además, en su implementación de Python, cada clave en su hash apunta a a set, lo cual está bien, pero parece una estructura innecesaria cuando lo haría una lista (ha cambiado a una matriz primitiva en Java). Si no está manipulando el gráfico y solo está iterando sobre los vecinos, esto parece ideal.

Tenga en cuenta que este código también supone que cada nodo tiene una clave en el hash que representa el gráfico, como lo hace su entrada. Si planea ingresar gráficos donde los nodos pueden no tener claves en el hash, querrá asegurarse de que graph.get(curr)esté envuelto con un containsKeycheque para evitar fallas.

Otra suposición que vale la pena mencionar: asegúrese de que su gráfico no contenga nulls, ya que el visitedhash se basa nullpara indicar que un niño no tiene padre y es el comienzo de la búsqueda.

Respuesta 1

Estoy desarrollando un Cliente usando HttpClient en Java para acceder a una Aplicación REST. En esto quiero pasar el nombre de dos parámetros (value = "Kiran") y la dirección (Value = "5th Corner / Road") como parámetros de ruta. ...

Tenía un requisito donde tengo un conjunto de cadenas que no se conocen de antemano (por ejemplo, "phy", "link", "maca") y tengo 2 programas en los que solo tengo 7 bits para enviar para comunicarme. .

Quiero dibujar una imagen que se mueva lentamente con coordenadas fraccionarias para que el movimiento sea más suave. La imagen es muy pequeña (5x7 píxeles). Pensé que Graphics2D podría tener una forma de dibujar una imagen en ...

Estoy usando el archivo testdata.properties para pasar valores a mis scripts de prueba de selenio. Cuando entro en chino Charachter: 成長 促進 japonés Charachter: `へ の コ ミ ッ ト メ ン ト en el archivo testdata.properties se muestra ...