예제 #1
0
        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);
            }
        }
예제 #2
0
        /**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);
        }
예제 #3
0
        /**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);
        }