Soy estudiante de informática y no soy capaz de resolver un problema presente en una de mis prácticas. Intentaré resumirlo lo mejor posible.
La práctica consiste en dada un URL inicial, una palabra y un grado máximo, mirar si esta palabra aparece en alguna de las urls generadas. Se utiliza la técnica de backtracking por recurrencia. Está claro que esto genera una serie de nodos (urls) en forma de árbol y este árbol crecerá verticalmente hasta llegar al grado máximo dado.
Bien, mi problema consiste en que debo tener en cuenta las urls visitadas en ciertos grados. Por ejemplo, si visito la web "marca.com" en el grado 1, no debería visitarla de nuevo en el grado 2. Pero si la visito en el grado 2, entonces si debería visitarla en el grado 1 de nuevo.
Para resolver el problema de las urls visitadas no debería utilizar un vector, pues en el peor de los casos la complejidad del algoritmo aumenta considerablemente.
Para ello me han propuesto utilizar un hashtable o hashmap, y éste es el problema, que hoy es la primera vez que utilizo una estructura de estas características y no tengo ni idea.
Lo que he hecho ha sido lo siguiente, pero no sé si es correcto:
Código:
Lo que hago es comprobar si la url pasada por parámetro ha sido visitada en un nivel superior o no. Si ha sido visitada entonces devuelvo true, sino false.[..] public int mihashCode(String url, int gradoActual) { int hash = 3; hash = 43 * hash + (url != null ? url.hashCode() : 0); hash = 43 * hash + gradoActual; return hash; } private boolean urlVisitada(String url, int gradoActual){ for(int i = 0; i<=gradoActual; i++){ if(hashtable.containsKey(mihashCode(url, i))){ return true; }else{ hashtable.put(mihashCode(url, gradoActual), 0); return false; } } return false; [..]
No sé si voy en buen camino y lo que más me preocupa es el método miHashCode que tal y como está definido podría asignar el mismo valor a claves distintas, aunque desconozco el nivel de probabilidad de que esto ocurra.
Gracias.