Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2015, 21:34   #1
Dima2607
Новичок
Джуниор
 
Регистрация: 08.03.2015
Сообщений: 1
По умолчанию Словарь и метод Add. Помогите!

Читал исходный код Dictionary, нашел такую строку
Код:
int targetBucket = hashCode % buckets.Length
У меня есть словарь вместимостью 40000, с типом ключа - int. Hash от int это само число. Пробовал добавлять в словарь 40000 элементов с ключами, такими, чтобы остаток от деления был одинаков. Чтобы было больше коллизий. Однако словарь все-равно работает быстро. Я что-то не правильно понял? Когда Add работает за O(n)?
Когда операция словаря Add работает за O(n), если предположить, что он имеет нужную емкость, то есть никогда не расширяется при добавлении?
Dima2607 вне форума Ответить с цитированием
Старый 08.03.2015, 22:52   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Коллизии больше влияют на получение элемента, а не на его добавление.
pu4koff вне форума Ответить с цитированием
Старый 08.03.2015, 23:27   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

На что делите, чтобы получить
Цитата:
Пробовал добавлять в словарь 40000 элементов с ключами, такими, чтобы остаток от деления был одинаков
?
Предположу, что 40000. А это неверно, потому что в качестве bucket.length используется не capacity(=40000), а простое число сверху (но походу не ближайшее. какое именно - надо смотреть в исходники). В данном случае 43627. Попробуйте делить на него и увидите разницу.
P.S.
Результат сравнения вот такого кода
Код:
            for (var i = 0; i < 30000; ++i)
            {
                dict.Add(i * stride, i);
            }
на моей машине:
stride=1: 0мс
stride=43627: 1320мс

То есть всё как и должно быть.
Изобретатель велосипедов

Последний раз редактировалось Selestis; 08.03.2015 в 23:31. Причина: уточнение
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Add у TStringList FaTaL Общие вопросы Delphi 7 21.09.2014 09:59
Метод перебора, Метод дихотомии, Метод золотого сечения Delphi !!! OneBri Помощь студентам 0 03.10.2012 08:42
Add string list with all user meta in wp-e commerce Custom Fields like wordpress default add/edit post/page admin panel Alar WordPress и другие CMS 1 11.03.2012 01:11
Помогите написать Visio add-in для экспорта из диаграммы выделенных шейпов в виде jpg artemvyrtosu Общие вопросы .NET 0 12.08.2009 11:50
Query1.SQL.Add('.......'); <--- ПОМОГИТЕ !!! SALEM БД в Delphi 3 24.11.2006 11:29