Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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()));
        }
Beispiel #3
0
        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());
            }
        }
Beispiel #4
0
        //Добавление в таблицу
        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("В таблице не осталось свободных ячеек");
        }