¿Cuál es la mejor manera de implementar una lista cerrada para un algoritmo de búsqueda en C?

He hecho algunas pruebas sobre esto, y el mejor enfoque que encontré fue incluir el estado abierto / cerrado / visitado como una enumeración en el nodo de búsqueda en sí. Esto requiere un pase claro, pero en mis pruebas el aumento de velocidad al tener acceso directo a ese campo lo compensó en el peor de los casos.

Aquí está mi nodo de búsqueda de muestra para aclaración. (La lista conectada estaba implícita en una estructura de cuadrícula, por lo que no verá las conexiones enumeradas aquí).

clase pública GridNode
{
Estado de enumeración pública
{
CLEAR, // este nodo se puede usar para viajar a través de
BLOQUEADO // este nodo está bloqueado
}
Estado público m_status;
Punto público m_coord;
flotador público m_cost;

// estos son solo para búsqueda (solo para uso interno)
enumeración pública SearchState
{
NO USADO,
ABIERTO,
CERRADO
}

searchState público m_searchState; // ¿este nodo está abierto o cerrado?
public GridNode m_from; // el camino hacia este punto vino desde aquí
flotador público m_costSoFar; // G para A *
flotante público m_costEstimate; // F para A *

Public GridNode (int x, int y)
{
m_status = Status.CLEAR;
m_coord = nuevo punto (x, y);
m_cost = 1.0f;
m_searchState = SearchState.OPEN;
m_from = nulo;
m_costSoFar = 0.0f;
m_costEstimate = 0.0f;
}
}

Necesita darnos mucha más información que eso.

Por ejemplo, si no tiene un criterio bajo el cual pueda ordenar los datos en un árbol correctamente, entonces un árbol NO es la estructura de datos correcta para usar. Entonces está mucho mejor con una lista secuencial que se puede buscar fácilmente de forma secuencial.

La forma correcta de usar un árbol es crear algún tipo de valor clave para que pueda decidir cuál se bifurca en cada nivel del árbol, de modo que nunca busque más del árbol de lo necesario.

Por ejemplo, si estaba almacenando cadenas, entonces podría usar el alfabeto para ordenar. Con algo como al ser pospuesto al niño izquierdo, mientras que mz se va al niño derecho.

Si cree que necesita algún tipo de indicador para saber si ya ha buscado un nodo o no, está haciendo algo mal.

En cuanto a la profundidad, eso está determinado por cuántos niños permites. El mínimo es 2, donde tienes un árbol binario. Pero lo óptimo depende de qué tan rápido desea que funcione la búsqueda y cuántos elementos necesita almacenar. Un árbol B + es el mejor, y es común tener 32 hijos secundarios en cada nodo.

Si solo desea usar esa lista para verificar si un nodo se visita o no, puede almacenar el estado visitado / no visitado dentro del nodo o puede usar una tabla hash.

Dado que está utilizando C almacenando la información visitada / no visitada dentro del nodo de su gráfico, sería más fácil de implementar.

More Interesting

¿Cuál es el significado de la complejidad del tiempo pseudo polinomial? Vi que Knapsack se ejecuta en tiempo pseudo polinomial. Leí sobre esto aquí: tiempo pseudo-polinomial pero no puedo seguirlo. Quiero comprender el concepto de tiempo de ejecución pseudo polinomial y cómo se ejecuta la mochila en tiempo de pseudo polinomio.

¿Cuántos tipos de algoritmos SVM existen?

¿Necesito aprender algoritmos y estructuras de datos en la interfaz?

¿Qué algoritmo usa Arrays.sort?

Cómo contar el número de n rutas de borde que comienzan desde el nodo u en un DAG (gráfico acíclico dirigido)

Cómo analizar los detalles del problema en el concurso de codificación

¿Qué es el algoritmo de optimización de memoria?

¿Cuáles son las diferencias entre los algoritmos que realizan la búsqueda en un gráfico y los algoritmos que realizan la búsqueda en un árbol?

¿Cuáles son los problemas actuales que enfrentan los algoritmos de identificación automática de números de clúster?

Quicksort: ¿Cuál es el algoritmo de ordenación rápida?

Cómo escribir un programa para ingresar una cadena e imprimir el número de caracteres en minúscula y mayúscula en la cadena

¿Qué algoritmos se utilizan para el proceso de aprendizaje automático de Yandex?

¿Cómo funciona la recursividad en Java?

¿Cuál es el mejor sitio en línea para aprender estructuras de datos y algoritmos?

¿Es mejor representar aristas en un gráfico que sale de un vértice como miembros de una matriz dinámica o una lista vinculada?