/**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); }
/**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); }
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); } }
/**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 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); }