Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Лекции / 7 - Презентация 2

.pdf
Скачиваний:
55
Добавлен:
25.12.2020
Размер:
772.48 Кб
Скачать

Центр дистанционного обучения

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