2012-04-11 2 views
1

Предположим, что у меня есть объект LinkedHashMap с 8 кодами, пронумерованными от 0 до 7. Теперь я хочу добавить элементы. Я добавил 7 элементов, и результат следующий:Какова временная сложность извлечения элемента из LinkedHashMap в случае столкновения?

1) Element_1: номер ведра 2. Это станет началом связанного списка, который поддерживает LinkedHashMap для поддержания порядка вставки.
1) Element_2: Ковш номер 3. Это связано с Element_1
2) Element_3: Ковш номер 1. Это связано с Element_2
3) Element_4: Ковш Номер 4. Это связано с Elemetn_3
4) Element_5 : Bucket Number 5. Это связано с Element_ 5) Element_6: номер ведра 3. Это связано с Element_5 (произошло столкновение)
6) Element_7: номер ведра 3. Это связано с Element_6 (снова столкновение)

Теперь предположим, что хочу получить Element_7. Хеширование этого элемента дает мне ведро номер 3. Теперь элементы в ковшом числа 3 являются Element_2, Element_6, Element_7.
Итак, каков порядок прохождения следующих двух:
a) Element_2-> Element_3-> Element_4-> Element_5-> Element_6-> Element_7.
OR
b) Element_2-> Element_6-> Element_7.

Я думал, что ответ будет (а), потому что LinkedHashMap поддерживает связанный список для поддержания порядка вставки. Поэтому, если порядок (b) означает, что конкретный элемент хранит две ссылки, одну для следующего элемента в порядке вставки и одну для следующего элемента в том же ведре.

Если ответ (б), как решается конкретный элемент, какой из них следует посетить, т. Е. из двух ссылок, которые нужно выбрать.

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

+0

Кажется, что список, связанный с вложением, не имеет отношения к стоимости поиска элемента по ключевому слову? Другими словами, стоимость поиска должна быть такой же, как и у HashMap. – NPE

+1

Было бы очень странно (и довольно бессмысленно), если бы результат был а). Это будет просто связанный список! – dlev

+0

Если у вас было 7 элементов, у вас было бы 16 ведер в обычном режиме. Но пример все еще действителен. –

ответ

1

LinkedHashMap расширяет HashMap и, следовательно, ссылка не имеет отношения к get, поэтому добавив ссылку, они не должны были сделать LinkedHashMap менее эффективным на get - так как get не нуждается в этой связи.

+0

Я согласен с заключением, но не могу сказать, что целая цепочка рассуждений полностью убедительна. – NPE

+0

@aix, вы правы; добавлено ", поэтому ...". –

+0

Да, я действительно заметил эту реализацию. Но, как я уже сказал, в обычной HashMap определенная запись (объект Map.Entry) хранит ссылку следующего объекта Map.Entry (внутри одного и того же ведра). Но в случае LinkedHashMap ссылка будет содержать элемент, который был вставлен дальше. Итак, чтобы перебирать элементы в одном и том же ведрах, содержит ли определенный элемент две ссылки, одну для следующего вставленного элемента и одну для следующего элемента в том же ведре? Если да, как это решить, какая ссылка на выбор? –

1

LinkedHashMap расширяет HashMap, а его метод get вызывает метод HashMap getEntry. Реализация HashMap хранит каждый ведро в отдельном массиве, поэтому ему не нужно будет перебирать весь набор данных только по данным внутри этого ведра.Взятые форма Oracle JDK 7:

final Entry<K,V> getEntry(Object key) { 
    int hash = (key == null) ? 0 : hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && 
      ((k = e.key) == key || (key != null && key.equals(k)))) 
      return e; 
    } 
    return null; 
} 

РЕДАКТИРОВАТЬ

e.next определяется в HashMap.Entry и находится в пределах одной и той же ведро, в отличие от e.after и e.before определены в LinkedHasMap.Entry, которые могут находиться в разных ковшей.

+0

Да, действительно, я замечаю эту реализацию. Но, как я уже сказал, в обычной HashMap определенная запись (объект Map.Entry) хранит ссылку следующего объекта Map.Entry (внутри одного и того же ведра) Но в случае LinkedHashMap ссылка будет содержать элемент, который был вставлен следующий , Итак, чтобы перебирать элементы в одном и том же ведрах, содержит ли определенный элемент две ссылки, одну для следующего вставленного элемента и одну для следующего элемента в том же ведре? Если да, то как это решить, какую ссылку выбрать? –

+0

См. Мое редактирование: 'LinkedHashMap.Entry' расширяет' HashMap.Entry' и добавляет поля 'before' и' after', которые являются следующим и предыдущими узлами на карте (и могут быть в другом ковше), но когда вызов 'get', это поле' next' из 'Map.Entry', которое используется в одном и том же ведре. – assylias

+0

Привет, Ассилиас, я думаю, что вы определенно правы, потому что тогда только карта имеет смысл. Но только для кросс-осветления, поэтому есть две ссылки: поле «после» хранит ссылку на порядок вставки, а «следующий» хранит ссылку на следующий элемент в том же ковше. Прошу прощения за повторное и повторное задание, но я просто полностью увяз в замешательстве. –