2013-08-19 2 views
4

Какую начальную емкость я должен использовать для HashSet, в которой я знаю, что я собираюсь вставить 1000 целых чисел, чтобы предотвратить необходимость каких-либо внутренних перестроек?Начальная емкость для HashSet <Integer>

Сначала я должен использовать 1000, но, прочитав описание конструктора, который вводит параметр initialCapacity, он говорит Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75)..

Итак, если я установил емкость 1000, hashMap изменит размер при достижении 750 элементов?

Также я предполагаю, что для эффективности hashMap требуется некоторое «пространство», поэтому решение IC * 0.75 = 1000, чтобы получить что-то вроде 1334, также не может быть лучшим решением или не так ли?

UPDATE:
1) Я знаю, что импликация внутреннего повторного размера не является существенным один, но до сих пор его шанс узнать и лучше понять условия, которые я использую. и усилия должны быть минимальными.

2) Несколько замечаний относительно выбора структуры данных. Пожалуйста, посмотрите мой предыдущий Q здесь: Data structure recommendation, где более точную информацию о моем сценарии.

+0

Вы собираетесь вставить более 1000 целых чисел? –

+1

Так почему бы вам не использовать этот конструктор? 'HashSet (int initialCapacity, float loadFactor)' –

+0

Эти наносекунды должны быть действительно важны для вас. –

ответ

2

Чтобы избежать изменения размера, вам нужен size/load-factor. Примечание: он всегда будет следующей мощностью 2 для HashSet & HashMap.

+0

что будет силой двух? отношение или размер? (obviouly не load-factr). также я угадываю, что HashMap в вашем ответе должен быть HashSet ... – epeleg

+0

@epeleg Емкость числа ведер всегда равна 2. Это используется, так что бит-маска заменяет модуль в поиске правильного ведра для хэш. –

2

Если это действительно стоит беспокоиться по этому поводу (и я подозреваю, что нет, - изменение размера набора 1000 чисел не займет много времени), то имейте в виду, что HashSet подкреплена HashMap и метод put ссылки this :

addEntry(int hash, K key, V value, int bucketIndex) { 

    Entry<K,V> e = table[bucketIndex]; 

    table[bucketIndex] = new Entry<K,V>(hash, key, value, e); 
    if (size++ >= threshold) 
     resize(2 * table.length); 
} 

Это всегда стоит checking out the source cod е для таких запросов, хотя имейте в виду, реализация всегда может измениться (даже для незначительных JRE высвобождает).

И, наконец, является ли подходящим для этого сценария? Если у вас фиксированный размер целочисленного распределения, возможно, простой массив (используя примитивы и, таким образом, избегая бокса) будет быстрее/проще?

+1

Всегда интересно знать причины, чтобы снизить хороший и правильный ответ. Downvoters, найдите минутку, чтобы объяснить свои причины! – AlexR

+0

Да. Я бы это сделал вторым! –

+0

Спасибо за ссылку на grepCode - я этого не знал. Я также согласен с низкими голосами. Но я не вижу смысла показывать этот конкретный фрагмент кода. Что касается выбора структуры данных, посмотрите на мой предыдущий вопрос: http://stackoverflow.com/questions/18299937/data-structure-recommendation Как это лучше объясняет полный сценарий. – epeleg

2

В вашем случае, разумно установить первоначальную мощность до 1000 и коэффициент нагрузки до 1, как две разныеInteger с не разделять один и тот же хэш (что само целое).

Тем не менее, для общего назначения вам не нужно беспокоиться о коэффициенте нагрузки и оставить его таким, каким он есть, поскольку вы, вероятно, никогда не заметите никаких улучшений, устанавливающих его самостоятельно. Увеличение коэффициента нагрузки может фактически привести к резкому снижению производительности.

+0

Если вы должны установить «коэффициент загрузки» и «начальную емкость», я считаю, что это лучший ответ. Установите требуемую мощность, чтобы обеспечить полный набор параметров нагрузки. Поскольку ваш размер установлен, он никогда не должен перезаряжаться. –

+0

Как целые числа могут быть самими хэш-ключами? предположим, что они составляют диапазон 0-999999? и hashMap имеет только 1000 ведер ... Я что-то упустил? – epeleg

0

Я думаю, идеальной начальной емкостью было бы сохранить его в количестве целых чисел, которые вы хотите вставить, а коэффициент загрузки оставлен по умолчанию.

перейдите для < # целых чисел> /0.75 коэффициент нагрузки.

+0

это не обещает мне со 100% уверенностью хотя бы на перестройку? – epeleg