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