Conversation
kulti
left a comment
There was a problem hiding this comment.
Нужно поправить работу списка, чтобы было О(1). После этого готов принять ДЗ на 8/10. Чтобы получить еще 2 балла, нужно поработать над чистотой и понятностью (в первую очередь замечания про Remove, Clear и ShowElements).
hw04_lru_cache/list.go
Outdated
| l.PushFront(i.Value) | ||
| } | ||
|
|
||
| func (l *list) ShowElements() []listItem { |
There was a problem hiding this comment.
Странный метод. Судя по всему, нужен только для тестов. Предлагаю не загрязнять API и перенести этот метод в виде вспомогательной функции в тесты.
There was a problem hiding this comment.
Убрал этот метод в следующем коммите.
Согласен, тут скорее было бы уместнее сделать просто метод String().
There was a problem hiding this comment.
А зачем String? И в каком формате должен быть результат такого метода?
list не знает, что в нем хранится. Обычно это знает тот, кто в него кладет. Если ему зачем-то нужно показывать список в виде строки, то он сам это реализует, и вывод будет в том формате, в каком ему нужно.
hw04_lru_cache/list.go
Outdated
| type list struct { | ||
| // Place your code here | ||
| // using on delete validation | ||
| elementsSet map[*listItem]struct{} |
There was a problem hiding this comment.
Работа с map - это амортизированное О(1), т.е. О(1), но не всегда. В задании сказано, что все операции должны быть за О(1). Если хочется оставить усложнение (удалять только существующие элементы), то предлагаю подумать над другим подходом.
There was a problem hiding this comment.
Усложнение проверок добавили, а тестов на этот случай нет. Если хотите оставить, то еще и тесты нужно будет добавить.
There was a problem hiding this comment.
И я правильно понимаю, что коллизиями мы обычно пренебрегаем и всё же считаем
что словарь и Set — O(1)?
There was a problem hiding this comment.
Я так никогда не считаю :) Если интересно, вот старая, но, вроде, еще актуальная статья, как map устроен в go - https://www.ardanlabs.com/blog/2013/12/macro-view-of-map-internals-in-go.html. Коллизии - это норма, просто он старается держать их в разумных пределах.
Если можно сделать лучше: без лишних аллокаций, циклов etc, то лучше без них и сделать.
| for c.Queue.Len() > 0 { | ||
| c.Queue.Remove(c.Queue.Back()) | ||
| } | ||
| c.Items = make(map[Key]*listItem) |
There was a problem hiding this comment.
Почему для map тут создается новый экзепляр, а для списка удаляются элементы? Чем обусловлен разный подход к чистке?
There was a problem hiding this comment.
Да, неоднозначно получилось, поправил во втором коммите.
There was a problem hiding this comment.
GC корректно отловит существующий список ни к чему не привязанный?
There was a problem hiding this comment.
Да, раз ссылок на объект не осталось, то GC его приберет.
kulti
left a comment
There was a problem hiding this comment.
Спасибо за доработки. ДЗ принято - 10/10.
Домашнее задание №4 «LRU-кэш»
Критерии оценки
выталкивания из кэша редко используемых элементов) - до 3 баллов
Зачёт от 7 баллов