/**Inserta un bloque en la Organización hash dinámica*/ private bool InsBloque(CBloque b) { CCubeta cubetaAux, nuevaCubeta; CBloque bAux; int entrada; bool res; cubetaSel = entrada = ConvertDecimal(tHashExt, b.ConvertClaveToBinary());//Se determina su posición en la tabla Hash cubetaAux = tHashExt.getAtEntrada(entrada).getCubeta();//Se lee la cubeta em la entrada corrrespondiente if ((res = Repetidos(b, cubetaAux)) == false)//Validación para repetidos if (cubetaAux.InsertaClave(b.getDir(), FuncionHash(b)) == true) { //Se escribe la cubeta con la nueva información getArchivo().EscribeCubeta(cubetaAux); getArchivo().EscribeBloque(b, b.getDir()); } else { //Se checan los prefijos de asociación entre la tabla hash y una de las cubetas if (tHashExt.getPrefAsociacion() == cubetaAux.getPrefAsoc()) { tHashExt.incPrefAsociacion(); tHashExt.Incrementate(getArchivo()); } //Inicialización de la nueva cubeta nuevaCubeta = new CCubeta(-1, TAM_CUBETA); cubetaAux.IncPrefAsoc(); nuevaCubeta.setPrefAsoc(cubetaAux.getPrefAsoc()); getArchivo().EscribeCubeta(cubetaAux); nuevaCubeta.setDir(getArchivo().ENDF()); ActualizaEntradas(cubetaAux, nuevaCubeta); getArchivo().EscribeCubeta(nuevaCubeta); //Se sacan todas las claves de la cubeta que se partio y se //Redistribuyen en todas las cubetas y la nueva cubeta creada. for (int i = 0; i < cubetaAux.getTamaño(); i++) { bAux = getArchivo().leerBloque(cubetaAux.getAtDirBloque(i), tamBloque); bAux.setTamAtri(tamAtri); bAux.setTipoCA(tipoDato); bAux.setDesp(desp); bAux.setTamBlo(tamBloque); cubetaAux.eliminaClave(i, cubetaAux.getAtDirBloque(i)); getArchivo().EscribeCubeta(cubetaAux); res = InsBloque(bAux); } b.setDir(getArchivo().ENDF()); InsBloque(b); } return (res); }
/**Crea cada uno de los nodos de arbol en forma recursiva, asindo un recorrido en preorden * y va agranagando todos estos nodos al nuevo archivo*/ public long generaArbolRec(CArchivo aO, CArchivo aD, int tamBloque, long dirCab) { CNodo nodoAux, nuevoNodo; CBloque bloqueAux,bloqueNuevo; long dirNodo = -1; int LS; if (dirCab != -1) { nodoAux = aO.leerNodo(dirCab); nuevoNodo = creaNodo(aO,aD,nodoAux); if (nodoAux.getTipoNodo() == HOJA || nodoAux.getTipoNodo() == RAIZHOJA) LS = nodoAux.getNumElemnt(); else LS = nodoAux.getNumElemnt() + 1; for (int i = 0; i < LS; i++) if (nodoAux.getTipoNodo() == HOJA || nodoAux.getTipoNodo() == RAIZHOJA) { bloqueAux = aO.leerBloque(nodoAux.getAtDirNodo(i), tamBloque); bloqueNuevo = new CBloque(); bloqueNuevo.setBloque(bloqueAux.getBloque()); bloqueNuevo.setTamBlo(tamBloque); bloqueNuevo.setDir(aD.ENDF()); aD.EscribeBloque(bloqueNuevo, aD.ENDF()); nuevoNodo.setAtDirNodo(i, bloqueNuevo.getDir()); } else nuevoNodo.setAtDirNodo(i,generaArbolRec(aO,aD,tamBloque,nodoAux.getAtDirNodo(i))); aD.escribeNodo(nuevoNodo); dirNodo = nuevoNodo.getDir(); } return(dirNodo); }