Должен.NET универсальный словарь быть инициализированной со способностью, равной количеству объектов, которые это будет содержать?

Вы можете использовать библиотеку jquery для cookie. См. Плагин https://github.com/carhartl/jquery-cookie .

Затем вы можете использовать приведенный ниже код, где вы устанавливаете идентификатор для тд

$("#td").on("click", function(){

  var name = $("#td").val();

  $.cookie('name',name);

}

13
задан Drew Noakes 5 January 2009 в 18:57
поделиться

6 ответов

То, для чего следует инициализировать емкость словаря, зависит от двух факторов: (1) Распределение функции gethashcode и (2) Сколько элементов вы должны вставить.

Ваша хеш-функция должна быть либо распределена случайным образом, либо она должна быть специально сформулирована для вашего набора входных данных. Предположим, первое, но если вас интересует второй, найдите идеальные хеш-функции.

Если у вас есть 100 элементов для вставки в словарь, случайная хеш-функция, и вы устанавливаете емкость на 100, тогда когда вы вставьте i-й элемент в хеш-таблицу, у вас есть вероятность (i-1) / 100, что i-й элемент столкнется с другим элементом при вставке. Если вы хотите снизить вероятность столкновения, увеличьте пропускную способность. Удвоение ожидаемой пропускной способности снижает вдвое вероятность столкновения.

Кроме того,

6
ответ дан 1 December 2019 в 23:32
поделиться

Я сделал быстрый тест, вероятно, не научный, но если я установил размер, потребовалось 1,2207780 секунды для добавления одного миллиона объектов, и потребовалось 1,5024960 секунды, чтобы добавить, не дал ли я Словарю размер... это кажется незначительным мне.

Вот мой тестовый код, возможно, кто-то может сделать более строгий тест, но я сомневаюсь, что он имеет значение.

static void Main(string[] args)
        {
            DateTime start1 = DateTime.Now;
            var dict1 = new Dictionary<string, string>(1000000);

            for (int i = 0; i < 1000000; i++)
                dict1.Add(i.ToString(), i.ToString());

            DateTime stop1 = DateTime.Now;

            DateTime start2 = DateTime.Now;
            var dict2 = new Dictionary<string, string>();

            for (int i = 0; i < 1000000; i++)
                dict2.Add(i.ToString(), i.ToString());

            DateTime stop2 = DateTime.Now;

            Console.WriteLine("Time with size initialized: " + (stop1.Subtract(start1)) + "\nTime without size initialized: " + (stop2.Subtract(start2)));
            Console.ReadLine();
        }
5
ответ дан 1 December 2019 в 23:32
поделиться

Я думаю, что Вы сверхусложняете ситуацию. Если Вы знаете, сколькими объекты будут в Вашем словаре, то любой ценой указывают это на конструкции. Это поможет словарю выделить необходимое место в своих внутренних структурах данных, чтобы не перераспределять и переставлять данные.

5
ответ дан 1 December 2019 в 23:32
поделиться

Определение начальной способности к Dictionary конструктор увеличивает производительность, потому что будет меньше количества, изменяет размер к внутренним структурам, которые хранят значения словаря во время операций ADD.

Рассмотрение, что Вы указываете начальную способность k к Dictionary конструктор затем:

  1. Dictionary зарезервирует объем памяти, необходимый для хранения k элементов;
  2. Производительность запросов против словаря не затронута, и это не будет быстрее или медленнее;
  3. Операции ADD не потребуют большего количества выделений памяти (возможно, дорогой) и таким образом будут быстрее.

Из MSDN:

Способность Словаря (TKey, TValue) является числом элементов, которое может быть добавлено к Словарю (TKey, TValue), прежде чем изменение размеров будет необходимо. Поскольку элементы добавляются к Словарю (TKey, TValue), способность автоматически увеличена как требуется путем перераспределения внутреннего массива.

Если размер набора может быть оценен, указав, что начальная способность избавляет от необходимости выполнять много операций изменения размеров при добавлении элементов к Словарю (TKey, TValue).

2
ответ дан 1 December 2019 в 23:32
поделиться

Да, вопреки a HashTable который использует перефразирование в качестве метода для разрешения коллизий, Dictionary будет использовать объединение в цепочку. Таким образом да, хорошо использовать количество. Для a HashTable Вы, вероятно, хотите использовать count * (1/fillfactor)

1
ответ дан 1 December 2019 в 23:32
поделиться

Начальный размер является просто предложением. Например, большинству хеш-таблиц нравится иметь размеры, которые являются простыми числами или питанием 2.

-1
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: