public ReturningData SearchValue(string key) { var iterations = 0; var sw = new Stopwatch(); sw.Start(); //Вычисляем хеш ключа var hashCode = HashCalculator.CalculatePolynomHash(key); //Вычисляем индекс корзины. var index = hashCode % _buckets.Length; //Если корзина пуста - элемента нет в таблице if (_buckets[index] == null) { sw.Stop(); return(new ReturningData(false, default(int), sw.GetNanoSeconds(), 1)); } else if (_buckets[index].Key == key) { //Иначе, если ключ равен ключу корневого элемента, то корневой элемент - найденное значение. sw.Stop(); return(new ReturningData(true, _buckets[index].Value, sw.GetNanoSeconds(), 1)); } else { var root = _buckets[index]; var res = SearchInTree(root, key, iterations); sw.Stop(); res.Time = sw.GetNanoSeconds(); return(res); } }
public ReturningData SearchValue(string key) { var sw = new Stopwatch(); sw.Start(); //Вычисляем хеш код и индекс var hashCode = HashCalculator.CalculatePolynomHash(key); var index = hashCode % _entries.Length; //Обходим таблицу в случайном порядке. foreach (var ind in _randomNumbersSequence) { var newIndex = (index + ind) % _entries.Length; //Если текущий элемент пустой - значит элемента с данным ключом нет в таблице. if (_entries[newIndex] == default(Entry)) { sw.Stop(); return(new ReturningData(false, default(int), sw.GetNanoSeconds())); } else { //Иначе, если ключтекущего элемента равен входному - элемент найден if (_entries[newIndex].Key == key) { sw.Stop(); return(new ReturningData(true, _entries[newIndex].Value, sw.GetNanoSeconds())); } } } sw.Stop(); return(new ReturningData(false, default(int), sw.GetNanoSeconds())); }
public long Add(string key, int value) { var sw = new Stopwatch(); sw.Start(); var newNode = new Entry(key, value); //Вычисляем хеш ключа. var hashCode = HashCalculator.CalculatePolynomHash(key); //Вычисляем индекс корзины. var index = hashCode % _buckets.Length; //Если корзина пуста (т.е в таблице нет значения с таким хешем) if (_buckets[index] == null) { //Добавляем новое дерево. _buckets[index] = newNode; sw.Stop(); return(sw.GetNanoSeconds()); // Иначе в таблице уже есть элемент с таким же хешем. Добавляем элемент в соответствующее дерево. } else { var root = _buckets[index]; AddNode(root, newNode); sw.Stop(); return(sw.GetNanoSeconds()); } }
//Добавление в таблицу public long AddValue(string key, int value) { var sw = new Stopwatch(); sw.Start(); //Вычисляем хеш ключа var hashCode = HashCalculator.CalculatePolynomHash(key); //Индекс элемента var index = hashCode % _entries.Length; //Обходим таблицу в случайном порядке (сначала попадаем в элемент с индексом, найденным выше) foreach (var offset in _randomNumbersSequence) { var newIndex = (index + offset) % _entries.Length; //Если эта позиция в таблице свободна - вставляем новый элемент туда. if (_entries[newIndex] == default(Entry)) { _entries[newIndex] = new Entry(key, value); sw.Stop(); return(sw.GetNanoSeconds()); } } //Если в таблице нет свободных мест - кидаем исключение. throw new Exception("В таблице не осталось свободных ячеек"); }