/**Elimina un bloque el forma logica y fisica*/ public bool EliminaBloque(CBloque b, CTablaHashExt tH) { CEntrada entradaAux; CCubeta cubetaAux; int numEnt; bool res, band = false ; numEnt = ConvertDecimal(tH,b.ConvertClaveToBinary());//Se obtiene la poscion de la entrada entradaAux = tH.getListEntradas()[numEnt];//Se carga la entrada cubetaAux = entradaAux.getCubeta(); //Se elimina la clave de cuebta leida res = cubetaAux.eliminaClave(FuncionHash(b), b, getArchivo()); getArchivo().EscribeCubeta(cubetaAux); tH.decNumReg(); getArchivo().EscribeTablaHashExt(tH); if (res == true)//Si es verdadero es porque la cubeta se quedo vacia if (tH.getPrefAsociacion() == 0) band = true; else if (cubetaAux.getPrefAsoc() == tH.getPrefAsociacion())//Se checa los estados de prefijos, en la cubeta y la tabla hash { entradaAux.setCubeta(tH.getAtEntrada(entradaAux.getEspejo()).getCubeta()); getArchivo().EscribeEntrada(entradaAux); entradaAux.getCubeta().DecPrefAsoc(); getArchivo().EscribeCubeta(entradaAux.getCubeta()); while (!tH.validaPrefijos()) tH.Doblate(getArchivo()); if (tH.getNumReg() == 0) band = true; } return (band); }
private void ImprimeTablaHash(long dir) { dGTablaHash.Rows.Clear(); dGCubeta.Rows.Clear(); tablaDatos.Rows.Clear(); btI.Text = ""; btIJ.Text = ""; if (dir != -1) { tHashExt = getArchivo().LeerTablaHashExt(dir); btI.Text = "i = " + tHashExt.getPrefAsociacion().ToString(); for (int nC = 0, i = 0; i < tHashExt.getListEntradas().Count; i++, nC++) { dGTablaHash.Rows.Add(); dGTablaHash.Rows[i].HeaderCell.Value = nC.ToString(); dGTablaHash.Rows[i].Cells[0].Value = tHashExt.getAtEntrada(i).getDirCubeta().ToString(); } ImprimeCubeta(0); } }
/**Convierte una clave primaria(Binaria) a su representación decimal*/ private int ConvertDecimal(CTablaHashExt tH , string cad) { int cont = cad.Length; int dec = 0; for (int i = tH.getPrefAsociacion(); i > 0 && cont != 0; i--, cont--) if (cad[cont - 1] != '0') dec = dec + (int)(Math.Pow(2, (double)(cad.Length - cont))); return (dec); }
/**Busca una cubeta en la tabla Hash Extendible*/ private int buscaCubeta(long dirCub, CTablaHashExt tH) { foreach (CEntrada e in tH.getListEntradas()) if (e.getDirCubeta() == dirCub) return (tH.getListEntradas().IndexOf(e)); return (-1); }
/**´Méetodo principal para llevar a cabo la inserción de algun bloque*/ public bool Alta_HashDinamica(CNodoEntidad e, CBloque b) { /** * \param e Entidad a la que pertrnece el bloque * \param b Bloque Nuevo bloque a insertar * \return Retorna Falso(Si tuvo exito), True(Si ya existe el bloque alguna cubeta) * */ CCubeta cubetaAux; CEntrada entradaAux; bool res = false; if (e.getApCabDatos() == -1) { tHashExt = new CTablaHashExt(); cubetaAux = new CCubeta(-1, TAM_CUBETA); entradaAux = new CEntrada(cubetaAux, -1); tHashExt.insEntrada(entradaAux); cubetaAux.setDir(getArchivo().ENDF()); getArchivo().EscribeCubeta(cubetaAux); entradaAux.setDirCubeta(cubetaAux.getDir()); entradaAux.setDir(getArchivo().ENDF()); getArchivo().EscribeEntrada(entradaAux); tHashExt.setCabEntradas(entradaAux.getDir()); tHashExt.setDir(getArchivo().ENDF()); getArchivo().EscribeTablaHashExt(tHashExt); e.setApCabDatos(tHashExt.getDir()); getArchivo().escribeEntidad(e, e.getDir()); } else tHashExt = getArchivo().LeerTablaHashExt(e.getApCabDatos()); b.setDir(getArchivo().ENDF()); if ((res = InsBloque(b)) == false) { tHashExt.incNumReg(); getArchivo().EscribeTablaHashExt(tHashExt); } return (res); }
/**Se lee una objeto de la clase CTablaHashExt que sera utilizada el la Hash Dinámica*/ public CTablaHashExt LeerTablaHashExt(long dir) { CTablaHashExt tExt; CEntrada entradaAux; CCubeta cubetaAux; long aux; int posCub; entradaAux = null; tExt = null; if (dir != -1) { tExt = new CTablaHashExt(); br.BaseStream.Seek(dir, SeekOrigin.Begin); tExt.setDir(br.ReadInt64()); tExt.setPrefAsociacion(br.ReadInt32()); tExt.setCabEntradas(br.ReadInt64()); tExt.setNumReg(br.ReadInt32()); aux = tExt.getCabEntradas(); while (aux != -1) { entradaAux = LeerEntrada(aux); cubetaAux = LeerCubeta(entradaAux.getDirCubeta()); if ((posCub = buscaCubeta(cubetaAux.getDir(), tExt)) == -1) entradaAux.setCubeta(cubetaAux); else entradaAux.setCubeta(tExt.getAtEntrada(posCub).getCubeta()); tExt.insEntrada(entradaAux); aux = entradaAux.getSigEntrada(); } } return (tExt); }
/**Se escribe la tabla hash extendible de la organización hash dinámica*/ public void EscribeTablaHashExt(CTablaHashExt t) { bw.BaseStream.Seek(t.getDir(), SeekOrigin.Begin); bw.Write(t.getDir()); bw.Write(t.getPrefAsociacion()); bw.Write(t.getCabEntradas()); bw.Write(t.getNumReg()); }
private List<int> buscaEntradas(CTablaHashExt tH, CCubeta cub) { List<int> L; int numEnt; L = new List<int>(); numEnt = (int)Math.Pow((int)2,((int)(tH.getPrefAsociacion()-cub.getPrefAsoc()))); foreach (CEntrada e in tH.getListEntradas()) if (numEnt > 0) { if (e.getCubeta() == cub) { L.Add(e.getID()); numEnt--; } } else break; return(L); }
private List<CCubeta> dameCubetas(CTablaHashExt tH) { List<CCubeta> L; L = new List<CCubeta>(); foreach (CEntrada e in tH.getListEntradas()) if (L.Contains(e.getCubeta()) == false) L.Add(e.getCubeta()); return (L); }
private CTablaHashExt creaTabla(CTablaHashExt tH) { CTablaHashExt nueva; CEntrada entAux; nueva = new CTablaHashExt(); nueva.setPrefAsociacion(tH.getPrefAsociacion()); nueva.setNumReg(tH.getNumReg()); foreach (CEntrada e in tH.getListEntradas()) { entAux = new CEntrada(); entAux.setID(e.getID()); entAux.setEspejo(e.getEspejo()); nueva.insEntrada(entAux); } return (nueva); }