buscar un árbol de búsqueda Binario

votos
0

Estoy tratando de encontrar un nombre dentro de una clave. Creo que está recuperándolo bien. sin embargo, está apareciendo como no encontrado. tal vez mi código está mal en alguna parte?

if (database.retrieve(name, aData))  // both contain the match

en main()

static void retrieveItem(char *name, data& aData)
{
cout << >>> retrieve  << name << endl << endl;
if (database.retrieve(name, aData))            // name and aData both contain the match
    cout << aData << endl;
else
    cout << not found\n;
cout << endl;
     }

     static void removeItem(char *name)
    {
cout << >>> remove  << name << endl << endl;
if (database.remove(name))
    cout << name <<  removed\n;
else
    cout << name <<  not found\n;
cout << endl;
    }

   int main()
   {
   #ifdef _WIN32
// request memory leak report in Output Window after main returns
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
   #endif

data    aData;


     << Database Of Great Computer Scientists\n\n;

database.insert(data(Ralston, Anthony));
database.insert(data(Liang, Li));
database.insert(data(Jones, Doug));
database.insert(data(Goble, Colin));
database.insert(data(Knuth, Donald));
database.insert(data(Kay, Alan));
database.insert(data(Von Neumann, John));
database.insert(data(Trigoboff, Michael));
database.insert(data(Turing, Alan));
displayDatabase(true);
retrieveItem(Trigoboff, Michael, aData);
retrieveItem(Kaye, Danny, aData);

removeItem(Ralston, Anthony);
displayDatabase(true);

recuperar la función ...

bool BST::retrieve(const char *key, data &aData, int parent) const
 {

for(int index=0; index < maxsize+1; index++)
{

    if (!items[index].empty) 
    {


        if ( items[index].instanceData == key )
        {
            aData.setName(key);
            return true;                   // doesn't return right away
        }


    }

}


 }

y definido en data.cpp

bool operator== (const data& d1, const data& d2)
{

return strcmp(d1.getName(), d2.getName()) == 0;

}

entonces este bit de código dentro de main () es donde dice que no se encuentra cuando creo que debería estar funcionando correctamente. Tanto el nombre como aData contienen el nombre correcto que se encontró.

static void retrieveItem(char *name, data& aData)
{
cout << >>> retrieve  << name << endl << endl;
if (database.retrieve(name, aData))            // name and aData both contain the match
    cout << aData << endl;
else
    cout << not found\n;
cout << endl;
     }
Publicado el 05/12/2009 a las 19:54
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

No soy un experto en C ++, pero ¿está realmente evaluando su operador ==? Está destinado a tomar dos referencias de datos de const, pero parece que usted está comparando cualquiera que sea el tipo de items[index].instanceDataes y a char*.

Sugiero que ingrese un poco de registro en el operador y vea si realmente se está llamando, sospecho que no.

Una opción para sacar temporalmente al operador == de la ecuación sería hacer explícita la comparación:

 if (strcmp(items[index].instanceData.getName(), key) == 0)
 {
     ...
 }

En otro punto, no puedo ver cómo esto realmente está haciendo una búsqueda binaria. Me parece que es solo una lista simple: estás haciendo una búsqueda lineal en retrievelugar de comparar la clave e ir hacia la izquierda o hacia la derecha en el árbol (o regresar "encontrado") según el resultado.

Respondida el 05/12/2009 a las 20:03
fuente por usuario

votos
0

No puedo asegurarlo sin ver el código para BST, pero parece estar mal:

for(int index=0; index < maxsize+1; index++)

Con las convenciones tradicionales, debería ser:

for(int index=0; index < maxsize; index++)

Además de eso, también parece que tu función devuelve verdadero o algún booleano indefinido. Probablemente deberías tener una return false;al final de BST :: recuperar.

Respondida el 05/12/2009 a las 21:58
fuente por usuario

votos
1

Debería utilizar BST para navegar por el árbol, sin pasar por encima de cada elemento de su matriz, como han dicho otros. Pruebe algo como:

bool retrieve(key, aData)
  retrieve(key, aData, parent)
  if (key == aData)
    return true
  else
    return false

bool retrieve(key, aData, parent)
  if (key == items[parent].name)
    aData.setName(key)
  else if (key < items[parent].name)
    retrieve(key, aData, 2*parent+1)
  else
    retrieve(key, aData, 2*parent+2)

Eso debería funcionar bien! :)

Respondida el 05/12/2009 a las 23:32
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more