KNLOD / DSAInterns

0 stars 0 forks source link

Написать свою реализацию HashMap (в cs - Dictionary) #5

Open KNLOD opened 6 months ago

KNLOD commented 6 months ago

Задание 1 Методы которые должна реализовывать HashMap

Для примера Интерфейс IDictionary:

https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.idictionary-2?view=net-8.0

TKey, TValue - дженерики разных типов.

public Add(T)
public Add(TKey, TValue)
public Clear()
public ContainsKey(TKey)
public GetEnumrator()
public Remove(TKey)
public TValue this[TKey]
public TryGetValue(TKey, TValue)

Также методы необходимые для работы map под модификатором private

Свойства:

Count
IsReadOnly
Item[TKey]
Keys
Values

Задание 2

Написать свой класс, который будет реализовывать интерфейс IComparable, чтобы его можно было использовать в вашей реализации хеш-таблицы в качестве ключа https://learn.microsoft.com/ru-ru/dotnet/api/system.icomparable?view=net-8.0

Затем использовать данный класс в качестве ключа для каких либо значений (полет фантазии можете сделать что угодно) для примера класс пользователя и мапа которая по пользователю возвращает его возраст? (конечно в реальности никто так не делает, но чтобы разобраться в IComparable будет полезно)

Задание 3

Написать тесты для мапы, если есть силы и время можете попробовать использовать Test-Driven-Development, когда сначала пишете тест, а затем реализацию, но пока это не обязательно.

Видео по устройству и работе хеш-таблиц: https://www.youtube.com/watch?v=cWbuK7C13HQ

Пример реализации: https://github.com/EvgenyVendrov/CSharpHashMap

Про утечки памяти на примере джава (плюс минус будет похоже на #) https://habr.com/ru/companies/otus/articles/589321/

KNLOD commented 5 months ago

The objects used as keys by a Hashtable are required to override the Object.GetHashCode method (or the IHashCodeProvider interface) and the Object.Equals method (or the IComparer interface).

Какой интерфейс должен реализовывать класс чтобы быть ключом (в частности метод GetHashCode): https://learn.microsoft.com/ru-ru/dotnet/api/system.collections.iequalitycomparer?view=net-8.0

В качестве одной из реализаций можно приводить поля объекта в string и вызывать у стринга метод GetHashCode()

Пример вычисления индекса при помощи HashCode

private int calcThisKeyIndex(K key, int length)
{
return Math.Abs(key.GetHashCode() % (length));
}