/// <summary>
        /// Operácia nájdi záznam s kľúčom K.
        /// Efektivnost: 1 prenos.
        /// //
        /// Adresar je kratky =>
        ///     pocas spracovania v operacnej pamati
        ///     => vyhladanie zaznmau vyzaduje standartne jeden blokovy prenos
        ///         (plus pripadny vyvovalny prenos z buffera do suboru).
        /// Adresar sa nachadza v operacnej pamati.
        ///     => je to jednorozmenre pole adries (celociselnych honot).
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public Record Search(Record hladanyZaznam)
        {
            Record findRecord = null;
            //vypocitaj prvych D bitov hodnoty hesovacej funkcie
            //D bit -> Hlbka adresara
            //vypocitaj I=hD(K)
            int hash           = ((Record)hladanyZaznam).GetHash();
            int indexvAdresari = IndexSubAdresara(hash, HlbkaSuboru);
            //V bloku P[i] najdi zaznam s klucom K.
            int   adresaBlokuVSubore = Adresar[indexvAdresari];
            Block block = Subor.ReadBlok(adresaBlokuVSubore);

            //pomocou adresara spristupni blok P[i]
            // spristupni prvych D bitov
            //I preved na cele cislo
            //toot je index v adresari na tkorom sa nachadza adresa
            //miesta v subore, kde sa nachadza blok,ktory by mal
            //obsahovat hladany zaznam

            foreach (var x in block.PoleRecordov)
            {
                if (x.Equals(hladanyZaznam))
                {
                    return(x);
                }
            }

            return(findRecord);
        }
        public override string ToString()
        {
            string        s  = $"{nameof(HlbkaSuboru)}: {HlbkaSuboru}, {nameof(PocetBlokov)}: {PocetBlokov}, {nameof(VelkostZaznamu)}: {VelkostZaznamu}, {nameof(MaxPocetZaznamovVBloku)}: {MaxPocetZaznamovVBloku}";
            StringBuilder sb = new StringBuilder();

            //vypisem jednotlive bloky
            //prechadzam vsetky bloky a postupne ich citam zo suboru.
            s += "\nAdresar: ";
            //for (int i = 0; i < PocetBlokov; i++)
            //{
            //   //Block _prvyBlock = Subor.ReadBlok(i);
            //   // sb.AppendLine("Blok " + i + "\t" + _prvyBlock.ToString());
            //    s += Adresar[i] + ", ";
            //}
            foreach (var a in Adresar)
            {
                s += a + ", ";
            }
            int i = 1;

            foreach (var adresa in Adresar)
            {
                if (adresa != -1)
                {
                    Block b = Subor.ReadBlok(adresa);
                    sb.AppendLine("Block c: " + (i++));
                    sb.AppendLine(b.ToString());
                }
            }

            return(s + sb.ToString());
        }
Ejemplo n.º 3
0
    private void Generovanie()
    {
        Dalej = false;
        Otazky otazky = Subor.Next();

        if (otazky == null)
        {
            Vyhodnotenie();
        }
        else
        {
            Otazka.text = otazky.Otazka;

            System.Random rand           = new System.Random();
            List <Toggle> randomtlacidla = Tlacidla.OrderBy(c => rand.Next()).Select(c => c).ToList();
            ColorBlock    color          = randomtlacidla[0].colors;
            color.normalColor      = Color.white;
            color.highlightedColor = Color.white;


            for (int i = 0; i < randomtlacidla.Count; i++)
            {
                if (i == 0)
                {
                    randomtlacidla[i].GetComponentInChildren <Text>().text  = otazky.NextSpravna();
                    randomtlacidla[i].GetComponentInChildren <Text>().color = Color.black;
                    Spravna        = randomtlacidla[i];
                    Spravna.isOn   = false;
                    Spravna.colors = color;
                }
                else
                {
                    randomtlacidla[i].GetComponentInChildren <Text>().text  = otazky.NextNespravna();
                    randomtlacidla[i].GetComponentInChildren <Text>().color = Color.black;
                    randomtlacidla[i].isOn   = false;
                    randomtlacidla[i].colors = color;
                }
            }

            /*
             * List<int> Indexy = new List<int>();
             *
             * //Vytvorenie listu s počtom indexov
             * for (int i = 0; i < Tlacidla.Count; i++)
             *  Indexy.Add(i);
             *
             * //Vybratie nahodneho tlačidla pre spravnu odpoved
             * System.Random random = new System.Random();
             * int temp = random.Next(Indexy.Count);
             *
             * Tlacidla[Indexy[temp]].GetComponentInChildren<Text>().text = otazky.NextSpravna();
             * Tlacidla[Indexy[temp]].GetComponentInChildren<Text>().color = Color.black;
             * Spravna = Tlacidla[Indexy[temp]];
             * Spravna.isOn = false;
             * ColorBlock color = Spravna.colors;
             * color.normalColor = Color.white;
             * color.highlightedColor = Color.white;
             * Spravna.colors = color;
             * Indexy.RemoveAt(temp);
             *
             *
             * //Vybratie zvyšných odpovedí
             * while (Indexy.Count != 0)
             * {
             *  temp = random.Next(Indexy.Count);
             *  Tlacidla[Indexy[temp]].GetComponentInChildren<Text>().text = otazky.NextNespravna();
             *  Tlacidla[Indexy[temp]].GetComponentInChildren<Text>().color = Color.black;
             *  Tlacidla[Indexy[temp]].isOn = false;
             *  Tlacidla[Indexy[temp]].colors = color;
             *  Indexy.RemoveAt(temp);
             *
             * }
             */
            Button.GetComponentInChildren <Text>().text = "Vyhodnotiť";
        }
    }
        /// <summary>
        /// Metoda zobrazi informacie hashovatelneho suboru.
        /// </summary>
        /// <returns></returns>


        #region Methods
        /// <summary>
        /// Operacia Vloz.
        /// Efektivnost: 1 prenos, v pripade preplenia 2 prenosy.
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public bool Insert(Record data)
        {
            bool vlozene = false;

            while (!vlozene)
            {
                //
                //        00   01  10   11      hlbka suboru 2 = hlbka heshovacieho suboru => D
                //      | 0 | 0 |  1  | 2 |     Adresar - dynamicke pole celych cisiel
                //        \  /     |     \
                //       block1   b2      b3
                //hlbka:    1      2       2           Hlbky blokov => d
                //        0 bla    10 mb  11 st        Bloky dat
                //        0 hee    10 na  11 wt

                //vypocitam hash vkladaneho recordu.
                //vypocitam index v adresari
                int index       = IndexSubAdresara(data.GetHash(), HlbkaSuboru);
                int adresaBloku = Adresar[index];
                //nacitam blok zo suboru - na zadanej adrese.
                Block block = Subor.ReadBlok(adresaBloku);

                //  Console.WriteLine("Index v adresari: " + index + ", z hash funkcie: "+ data.GetHash() + ", hlbka suboru: " + HlbkaSuboru + ", hlbka bloku: " + block.Hlbka);

                // 1. Ak sa blok preplni
                //     => nebuduj skupinu preplnujucich blokov, namiesto toho
                //     => zvacsi adresovy priestor tak, aby sa adresovali bloky
                //         a nie skupiny blokov.
                if (block.JePlny())
                {
                    // 2. Pri preplneni alokuj novy blok
                    //     => prirad mu adresu v adresari.

                    // 3. Adresovy priestor zvacsi, tak ze ho
                    //     =>  zdvojnasobis (D = D + 1)
                    //             => alokujes nove pole vacsie o 100%
                    //             => kazda honota z povodneho pola sa nakopiruje dvakrat
                    //     => zaktualizujes adresy v adresari.

                    //ak hlbka bloku je rovnaka ako hlbka suboru
                    //d == D
                    if (block.Hlbka == HlbkaSuboru)
                    {
                        //zdvojnasob adresar
                        ZdvojnasobAdresar();
                        HlbkaSuboru++;
                        //  Console.WriteLine("Bol zdvojeny adresar a zvysena hlbka suboru na: " + HlbkaSuboru);
                    }

                    int hlbkanova = block.Hlbka + 1;

                    int   adresaNovehoBloku = Subor.AlokujNovyBlock();
                    Block novyBlock         = new Block(MaxPocetZaznamovVBloku, hlbkanova, _tempRecord);

                    //podla bajtu na danej adrese v recorde prerozdelim - 0 povodny, 1 - novy blok.
                    block.Hlbka = hlbkanova;

                    PrerozdelenieBlokov(block, hlbkanova, novyBlock);
                    //zaktualizujem adresy v adresari
                    ZaktualizujAdresyAdresara(data, block, adresaNovehoBloku, adresaNovehoBloku);

                    //zapisem prerozdelenie blokov do suboru.
                    Subor.WriteBlok(adresaNovehoBloku, novyBlock);
                    Subor.WriteBlok(adresaBloku, block);
                    vlozene = false;
                }
                else
                {
                    //vloz zaznam
                    block.PridajRecord(data);
                    Subor.WriteBlok(adresaBloku, block);
                    vlozene = true;
                }
            }
            return(vlozene);
        }