3-й семестр / Лекции / 7 - Презентация 2
.pdfЦентр дистанционного обучения
Collections Framework
HashMap/LinkedHashMap используют целое число для идентификации bucket, и получают его с помощью вызова метода “int Object.hashCode()”.
Object.hashCode() вычисляет хэш-функцию:
•o1.equals(o2) => o1.hashCode() == o2.hashCode() (обратное необязательно; в нашем примере выше hashCode – это номер первой буквы слова в алфавите; несколько слов могут начинаться с одной буквы)
•obj.hashCode() должна возвращать одно и то же значение для одного объекта
online.mirea.ru
Центр дистанционного обучения
Collections Framework
public class MyString {
private char[] data; @Override
public int hashCode() {
return data[0];
}
}
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Метода hashCode() недостаточно – он позволяет ограничить пространство поиска (сузить до одного bucket – в примере выше слов начинающихся на одну букву), но этот bucket может содержать несколько слов:
|
Ключ |
Значение |
|
|
|
|
base |
база |
|
|
|
B |
book |
книга |
|
|
|
|
... |
... |
|
|
|
Внутри bucket поиск ключа идет простым перебором со сравнением ключей с использованием метода equals.
online.mirea.ru
Центр дистанционного обучения
Collections Framework
public class MyString { private char[] data; @Override
public int hashCode() { return data[0];
}
@Override
public boolean equals(Object o) { if (o instanceof MyString) {
MyString that = (MyString) o;
return Arrays.equals(this.data, that.data); } else {
return false;
}
}
}
online.mirea.ru
Центр дистанционного обучения
Collections Framework
public class MyString { private char[] data; MyString(char... chars) {
this.data = chars;
}
}
Map<MyString, String> map = new HashMap<>(); map.put(new MyString(‘b’, ‘o’, ‘o’, ‘k’), “книга”);
String bookRus = map.get(new MyString(‘b’, ‘o’, ‘o’, ‘k’));
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Алгоритмическая сложность операций
HashMap/LinkedHashMap:
•put: обычно O(1) (но иногда происходит перехэширование таблицы, если в ней становится слишком много элементов, тогда O(N))
•get: O(1) (при условии, что hashCode() достаточно хорош и значения хэш-функции распределены равномерно)
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Как работает TreeMap
TreeMap хранит ключи в сбалансированном двоичном дереве поиска:
•в левом поддереве значения ключей меньше, чем в корне
•в правом поддереве значения ключей больше, чем в корне
online.mirea.ru
Центр дистанционного обучения
Collections Framework
public class MyInt implements Comparable<MyInt> { private final int value;
@Override
public int compareTo(MyInt that) {
|
if (this.value < that.value) return -1; // this < that |
||
|
if (this.value > that.value) return 1; // this > that |
||
|
return 0; // this == that |
|
|
} |
Можно использовать |
||
|
|||
|
Integer.compare(this.value, that.value) |
||
|
|
|
}
TreeMap использует только метод compareTo и не использует equals и hashCode.
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Map<MyInt, String> map = new TreeMap<>();
map.put(new MyInt(42), “ответ”);
String value = map.get(new MyInt(42));
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Алгоритмическая сложность операций TreeMap:
•put: O(log2N)
•get: O(log2N)
N = 1,000,000; log2N ≈ 20
online.mirea.ru