コード例 #1
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void CompartirHaciaLaDerecha(NodoStar Sharing, int[] Camino, Bebida Nuevo)
        {
            var sube = Sharing.Datos[Sharing.Datos.Length - 1];

            Sharing.Datos[Sharing.Datos.Length - 1] = Nuevo;
            SortDatos(Sharing.Datos);

            EscribirHijo(Sharing.id, Sharing);

            var padre = SeekPadre(Sharing.Padre);
            var baja  = padre.Datos[Indice(padre, Nuevo)];

            padre.Datos[Indice(padre, Nuevo)] = sube;
            SortDatos(padre.Datos);
            EscribirPadre(padre.id, padre);

            var Shared = SeekHijo(Camino[0]);

            if (!EstaLleno(Shared))
            {
                for (int i = 0; i < Shared.Datos.Length; i++)
                {
                    if (Shared.Datos[i] == null)
                    {
                        Shared.Datos[i] = baja;
                        SortDatos(Shared.Datos);
                        EscribirHijo(Shared.id, Shared);
                        break;
                    }
                    // si quedan por mover, recursivo
                }
            }
        }
コード例 #2
0
ファイル: NodoStar.cs プロジェクト: MarlonRoches/Bstar
        public NodoStar ReadNodo(string NodoSerializado)
        {
            //es sensible al tipo de json que le envie
            var devolver = new NodoStar(7, false);
            var splited  = NodoSerializado.Split('|');

            //padre o no
            if (int.Parse(splited[1]) == 0)
            { // es raiz
                devolver = new NodoStar(7, false);
            }
            else
            {//es hoja
                devolver = new NodoStar(7, true);
            }
            //poner id
            devolver.id    = int.Parse(splited[0]);
            devolver.Padre = int.Parse(splited[1]);
            //poner Datos
            var contador = 2;

            for (int i = 0; i < devolver.Hijos.Length; i++)
            {
                devolver.Hijos[i] = int.Parse(splited[contador]);
                contador++;
            }
            //poner hijos
            for (int i = 0; i < devolver.Datos.Length; i++)
            {
                var des = splited[contador].Replace("0", "");
                devolver.Datos[i] = JsonConvert.DeserializeObject <Bebida>(des);
                contador++;
            }
            return(devolver);
        }
コード例 #3
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void CompartirHaciaLaIzquierda(NodoStar Sharing, int[] IndiceHermano, Bebida Nuevo)
        {
            var padre            = SeekPadre(Sharing.Padre);
            var HermanoIzquierdo = SeekHijo(IndiceHermano[0]);

            var listaactual = Sharing.Datos.ToList <Bebida>();

            listaactual.Add(Nuevo);
            listaactual.Sort((x, y) => x.Nombre.CompareTo(y.Nombre));
            var datoBaja = padre.Datos[Indice(padre, Nuevo) - 1];
            var sube     = listaactual[0];

            listaactual.Remove(listaactual[0]);
            Sharing.Datos = listaactual.ToArray();
            padre.Datos[Indice(padre, Nuevo) - 1] = sube;
            for (int i = 0; i < HermanoIzquierdo.Datos.Length; i++)
            {
                if (HermanoIzquierdo.Datos[i] == null)
                {
                    HermanoIzquierdo.Datos[i] = datoBaja;
                    break;
                }
            }
            EscribirHijo(Sharing.id, Sharing);
            EscribirHijo(HermanoIzquierdo.id, HermanoIzquierdo);
            EscribirPadre(padre.id, padre);
        }
コード例 #4
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void InsertarEnHoja(NodoStar actual, Bebida Nuevo)
        {
            var index = Indice(actual, Nuevo);

            if (actual.Hijos[index] == 0)
            {
                // se inserta
                var contador = 0;
                foreach (var item in actual.Datos)
                {
                    if (EstaLleno(actual))
                    {
                        CompartirDato(actual, Nuevo);
                        break;
                    }
                    else if (actual.Datos[contador] == null)
                    {
                        actual.Datos[contador] = Nuevo;
                        SortDatos(actual.Datos);
                        EscribirHijo(actual.id, actual);

                        break;
                    }
                    contador++;
                }
            }
            else
            {
                //recursivo
                InsertarEnHoja(SeekHijo(actual.Hijos[index]), Nuevo);
            }
        }
コード例 #5
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public int Indice(NodoStar Actual, Bebida Nuevo)
        {
            var iActualndice  = 0;
            var listacomparar = new List <Bebida>();

            foreach (var item in Actual.Datos)
            {
                if (item != null)
                {
                    listacomparar.Add(item);
                }
            }


            for (iActualndice = 0; iActualndice <= listacomparar.Count; iActualndice++)
            {
                if (iActualndice == listacomparar.Count)
                {
                    break;
                }
                else if (String.Compare(Nuevo.Nombre, listacomparar[iActualndice].Nombre) == -1)
                {
                    break;
                }
            }

            return(iActualndice);
        }
コード例 #6
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public bool EstaLleno(NodoStar Actual)
        {
            for (int i = 0; i < Actual.Grado - 1; i++)
            {
                if (Actual.Datos[i] == null)
                {
                    return(false);
                }
            }
            SortDatos(Actual.Datos);

            return(true);
        }
コード例 #7
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void Insertar(Bebida Nuevo)
        {
            var FILE   = new FileStream(GlobalPath, FileMode.Open);
            var lector = new StreamReader(FILE);

            if (IdPAdre == 1 && !primeraSeparecion) // aun no se parte
            {
                var linea = lector.ReadLine();
                linea = lector.ReadLine();
                FILE.Close();
                Raiz = Raiz.ReadNodo(linea);
                var contador = 0;
                for (int i = 0; i <= Raiz.Datos.Length; i++)
                {
                    if (i == Raiz.Datos.Length)
                    {
                        PrimeraSeparacion(Raiz, Nuevo);
                        break;
                    }
                    //insertando en la raiz
                    if (Raiz.Datos[i] == null)
                    {
                        Raiz.Datos[contador] = Nuevo;
                        SortDatos(Raiz.Datos);

                        var escritor = new StreamWriter(GlobalPath);
                        escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" +
                                           $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" +
                                           $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}");
                        escritor.WriteLine(Raiz.WriteNodo());
                        escritor.Close();
                        break;
                    }
                    else
                    {
                        contador++;
                    }
                }
            }
            else
            {
                FILE.Close();
                InsertarEnHoja(SeekPadre(IdPAdre), Nuevo);
            }
        }
コード例 #8
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        //idpadre|grado|siguiente|tamañopadre|tamañohijo

        public ArbolStar(int _grado, string _path)
        {
            var file   = new FileStream(_path, FileMode.OpenOrCreate);
            var lector = new StreamReader(file);
            var linea  = lector.ReadLine();

            GlobalPath = _path;
            if (linea == null)
            {//nuevo arbol
                LargoPadre = new NodoStar(_grado, false).WriteNodo().Length;
                LargoHijo  = new NodoStar(_grado, true).WriteNodo().Length;
                IdPAdre    = 1;
                Siguiente  = IdPAdre + 1;
                Grado      = _grado;
                Raiz       = new NodoStar(Grado, false);
                lector.Close();
                var escritor = new StreamWriter(GlobalPath);
                Raiz.id     = IdPAdre;
                Raiz.Grado  = _grado;
                Raiz.esHoja = false;
                escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" +
                                   $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" +
                                   $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}|");
                escritor.WriteLine(Raiz.WriteNodo());
                escritor.Close();
            }
            else
            {//arbol cargado
                var aMetaData = linea.Split('|');
                //0raiz
                IdPAdre = int.Parse(aMetaData[0]);
                //1grado
                Grado = int.Parse(aMetaData[1]);
                //2siguiente
                Siguiente = int.Parse(aMetaData[2]);
                //3largo padre
                LargoPadre = int.Parse(aMetaData[3]);
                //4largohijo
                LargoHijo = int.Parse(aMetaData[4]);
                Raiz      = new NodoStar(_grado, false);
            }
            file.Close();
        }
コード例 #9
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public int PuedeRecibir(NodoStar Prestamista)
        {
            var datos = new List <Bebida>();

            for (int i = 0; i < Prestamista.Grado - 1; i++)
            {
                if (Prestamista.Datos[i] != null)
                {
                    datos.Add(Prestamista.Datos[i]);
                }
            }
            if (datos.Count > ((2 * Grado) - 1) / 3)
            {
                return(Prestamista.id);
            }
            else
            {
                return(99);
            }
        }
コード例 #10
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void EscribirPadre(int _idPadre, NodoStar PadreNuevo)
        {
            var file   = new FileStream(GlobalPath, FileMode.Open);
            var reader = new StreamReader(file);
            var linea  = string.Empty;
            var index  = file.Position;

            for (int i = 0; i < _idPadre; i++)
            {
                linea  = reader.ReadLine();
                index += linea.Length + 1;
            }
            file.Position = index + 2;
            int indicearchivo = Convert.ToInt32(index);

            //sobre escribe el hijo
            SortDatos(PadreNuevo.Datos);
            file.Write(Encoding.ASCII.GetBytes(PadreNuevo.WriteNodo()), 0, (PadreNuevo.WriteNodo()).Length);
            file.Close();
        }
コード例 #11
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void PartirHaciaLaDerecha(NodoStar Hijo, NodoStar Hermano, Bebida Nuevo)
        {
            var padre        = SeekPadre(Hijo.Padre);
            var NuevoHermano = new NodoStar(Grado, true)
            {
                Padre = Hijo.Padre,
                id    = Siguiente
            };

            Siguiente++;
            var lista = new List <Bebida>();

            //llenamos la lista
            foreach (var item in padre.Datos)
            {
                if (item == null)
                {
                    break;
                }
                else
                {
                    lista.Add(item);
                }
            }
            foreach (var item in Hijo.Datos)
            {
                if (item == null)
                {
                    break;
                }
                else
                {
                    lista.Add(item);
                }
            }
            foreach (var item in Hermano.Datos)
            {
                if (item == null)
                {
                    break;
                }
                else
                {
                    lista.Add(item);
                }
            }
            lista.Add(Nuevo);
            var array = lista.ToArray();

            SortDatos(array);
            lista = array.ToList <Bebida>();
            var minimo       = ((2 * Grado) - 1) / 3;
            var listaPadre   = new List <Bebida>();
            var listaHijo    = new List <Bebida>();
            var listaHermano = new List <Bebida>();
            var listaNuevo   = new List <Bebida>();

            for (int i = 0; i < minimo; i++)
            {
                listaHijo.Add(lista[0]);
                lista.Remove(lista[0]);
            }
            listaPadre.Add(lista[0]);
            lista.Remove(lista[0]);
            for (int i = 0; i < minimo; i++)
            {
                listaHermano.Add(lista[0]);
                lista.Remove(lista[0]);
            }
            listaPadre.Add(lista[0]);
            lista.Remove(lista[0]);
            for (int i = 0; i < minimo; i++)
            {
                listaNuevo.Add(lista[0]);
                lista.Remove(lista[0]);
            }
            for (int i = 0; i < Hijo.Datos.Length; i++)
            {
                if (listaHijo.Count != 0)
                {
                    Hijo.Datos[i] = listaHijo[0]; listaHijo.Remove(listaHijo[0]);
                }
                else
                {
                    Hijo.Datos[i] = null;
                }
            }
            for (int i = 0; i < Hermano.Datos.Length; i++)
            {
                if (listaHermano.Count != 0)
                {
                    Hermano.Datos[i] = listaHermano[0]; listaHermano.Remove(listaHermano[0]);
                }
                else
                {
                    Hermano.Datos[i] = null;
                }
            }
            for (int i = 0; i < NuevoHermano.Datos.Length; i++)
            {
                if (listaNuevo.Count != 0)
                {
                    NuevoHermano.Datos[i] = listaNuevo[0]; listaNuevo.Remove(listaNuevo[0]);
                }
                else
                {
                    NuevoHermano.Datos[i] = null;
                }
            }
            for (int i = 0; i < padre.Datos.Length; i++)
            {
                if (listaPadre.Count != 0)
                {
                    padre.Datos[i] = listaPadre[0]; listaPadre.Remove(listaPadre[0]);
                }
                else
                {
                    padre.Datos[i] = null;
                }
            }
            for (int i = 0; i < padre.Hijos.Length; i++)
            {
                if (padre.Hijos[i] == 0)
                {
                    padre.Hijos[i] = NuevoHermano.id;
                    break;
                }
            }
            EscribirMetaData();
            EscribirPadre(padre.id, padre);
            EscribirHijo(Hijo.id, Hijo);
            EscribirHijo(Hermano.id, Hermano);
            EscribirHijo(NuevoHermano.id, NuevoHermano);
        }
コード例 #12
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void CompartirDato(NodoStar Actual, Bebida Nuevo)
        {
            var padre                   = SeekPadre(Actual.Padre);
            var IndicesHijos            = new List <int>();
            var indiceDelHijoACompartir = 0;

            //llenar lista de hijos disponibles
            foreach (var indicehijo in padre.Hijos)
            {
                if (indicehijo == 0)
                {
                    break;
                }
                else
                {
                    IndicesHijos.Add(indicehijo);
                }
            }
            IndicesHijos.ToArray();
            // encuentra el indice en el arreglo de hijos
            foreach (var item in IndicesHijos)
            {
                if (item == Actual.id)
                {
                    break;
                }
                else
                {
                    indiceDelHijoACompartir++;
                }
            }
            // izquierda


            var indiceizquierda = indiceDelHijoACompartir - 1;
            var indiceDerecha   = indiceDelHijoACompartir + 1;
            var caminoDerecha   = new List <int>();
            var caminoIzquierda = new List <int>();
            var intercambiado   = true;

            if (indiceizquierda >= 0 && intercambiado)
            {
                var lool = IndicesHijos[indiceDerecha];
                if (!EstaLleno(SeekHijo(lool)))
                {
                    caminoIzquierda.Add(IndicesHijos[indiceizquierda]);

                    CompartirHaciaLaIzquierda(Actual, caminoIzquierda.ToArray(), Nuevo);
                    intercambiado = false;
                }
                else
                {
                    //Partir Hacia la derecha
                    PartirHaciaLaDerecha(Actual, SeekHijo(lool), Nuevo);
                }
            }

            if (indiceDerecha <= IndicesHijos.Count && intercambiado)
            {
                var lool = IndicesHijos[indiceDerecha];
                if (!EstaLleno(SeekHijo(lool)))
                {
                    caminoDerecha.Add(IndicesHijos[indiceDerecha]);

                    CompartirHaciaLaDerecha(Actual, caminoDerecha.ToArray(), Nuevo);
                }
                else
                {
                    //Partir Hacia la derecha
                    PartirHaciaLaDerecha(Actual, SeekHijo(lool), Nuevo);
                }
            }
        }
コード例 #13
0
ファイル: ArbolStar.cs プロジェクト: MarlonRoches/Bstar
        public void PrimeraSeparacion(NodoStar Actual, Bebida Nuevo)
        {
            var lista = new List <Bebida>();

            foreach (var item in Actual.Datos)
            {
                lista.Add(item);
            }
            lista.Add(Nuevo);

            // escribir en el archivo todos los nodos disponibles del padre e hijos
            var hijo1 = new NodoStar(Grado, true)
            {
                Grado = Grado
            };

            hijo1.id = IdPAdre;
            var indice = 0;

            for (int i = 0; i < lista.Count / 2; i++)
            {
                hijo1.Datos[indice] = lista[i];
                indice++;
            }


            indice = 0;
            var hijo2 = new NodoStar(Grado, true);

            hijo2.id = Siguiente;
            Siguiente++;
            for (int i = (lista.Count / 2) + 1; i < lista.Count; i++)
            {
                hijo2.Datos[indice] = lista[i];
                indice++;
            }
            var raiznueva = new NodoStar(Grado, false)
            {
                id = Siguiente
            };

            lista.Sort((x, y) => x.Nombre.CompareTo(y.Nombre));
            raiznueva.Datos[0] = lista[(lista.Count / 2) + 1];
            IdPAdre            = Siguiente;
            raiznueva.Hijos[0] = hijo1.id;
            raiznueva.Hijos[1] = hijo2.id;
            hijo1.Padre        = raiznueva.id;
            hijo2.Padre        = raiznueva.id;
            Siguiente++;
            SortDatos(raiznueva.Datos);
            SortDatos(hijo1.Datos);
            SortDatos(hijo2.Datos);

            var escritor = new StreamWriter(GlobalPath);

            //metadata
            escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" +
                               $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" +
                               $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}|");
            // nodos
            escritor.WriteLine(hijo1.WriteNodo());
            escritor.WriteLine(hijo2.WriteNodo());
            escritor.WriteLine(raiznueva.WriteNodo());
            escritor.Close();
        }