Beispiel #1
0
        public Tuple <bool, TValue, long> Search(string key)
        {
            var sw = new Stopwatch();

            sw.Start();
            var hashCode = HashCalculator.Calculate(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 Tuple <bool, TValue, long>(false, default(TValue), sw.ElapsedNanoSeconds()));
                }
                else
                {
                    if (_entries[newIndex].Key == key)
                    {
                        sw.Stop();
                        return(new Tuple <bool, TValue, long>(true, _entries[newIndex].Value, sw.ElapsedNanoSeconds()));
                    }
                }
            }
            sw.Stop();
            return(new Tuple <bool, TValue, long>(false, default(TValue), sw.ElapsedNanoSeconds()));
        }
Beispiel #2
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 #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 Tuple <bool, TValue, long> Search(string key)
        {
            var sw = new Stopwatch();

            sw.Start();
            var hashCode = HashCalculator.Calculate(key);
            var index    = hashCode % _buckets.Length;

            if (_buckets[index] == -1)
            {
                sw.Stop();
                return(new Tuple <bool, TValue, long>(false, default(TValue), sw.ElapsedNanoSeconds()));
            }
            else if (_entries[_buckets[index]].Key == key)
            {
                sw.Stop();
                return(new Tuple <bool, TValue, long>(true, _entries[_buckets[index]].Value, sw.ElapsedNanoSeconds()));
            }
            else
            {
                index = _buckets[index];
                while ((index = _entries[index].Next) != -1)
                {
                    if (_entries[index].Key == key)
                    {
                        sw.Stop();
                        return(new Tuple <bool, TValue, long>(true, _entries[index].Value, sw.ElapsedNanoSeconds()));
                    }
                }
            }
            return(new Tuple <bool, TValue, long>(false, default(TValue), sw.ElapsedNanoSeconds()));
        }
Beispiel #5
0
        public long Add(string key, TValue value)
        {
            var sw = new Stopwatch();

            sw.Start();
            var hashCode = HashCalculator.Calculate(key);
            var index    = hashCode % _buckets.Length;

            if (_buckets[index] == -1)
            {
                _entries.Add(new Entry(key, value));
                _buckets[index] = _entries.Count - 1;
                sw.Stop();
                return(sw.ElapsedNanoSeconds());
            }
            else
            {
                _entries.Add(new Entry(key, value));
                var entry = _entries[_buckets[index]];
                index = _buckets[index];
                while (true)
                {
                    if (entry.Next == -1)
                    {
                        break;
                    }
                    index = entry.Next;
                    entry = _entries[index];
                }
                entry.Next      = _entries.Count - 1;
                _entries[index] = entry;
                sw.Stop();
                return(sw.ElapsedNanoSeconds());
            }
        }
Beispiel #6
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 #7
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("В таблице не осталось свободных ячеек");
        }
Beispiel #8
0
        public long Add(string key, TValue value)
        {
            var sw = new Stopwatch();

            sw.Start();
            var hashCode = HashCalculator.Calculate(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.ElapsedNanoSeconds());
                }
            }
            throw new Exception("В таблице не осталось свободных ячеек");
        }