Size: a a a

2020 December 11

A🌚

Al 🌚l in rannts
Про интересные вопросы на собесе - у меня когда-то попросили реализовать ordered dict, мне понравился вопрос)
источник

in

ildar nizamov in rannts
Al 🌚l
Про интересные вопросы на собесе - у меня когда-то попросили реализовать ordered dict, мне понравился вопрос)
и что ты ответил? :)
источник

A🌚

Al 🌚l in rannts
ildar nizamov
и что ты ответил? :)
Код писал, там есть неочевидности со сложностью поиска и вставки, поэтому наверное и запомнилось
источник

RB

Roman Bolkhovitin in rannts
и что, ты прям ordered dict реализовывал или просто завел список чтобы порядок ключей хранить?
источник

A🌚

Al 🌚l in rannts
Roman Bolkhovitin
и что, ты прям ordered dict реализовывал или просто завел список чтобы порядок ключей хранить?
Ну до реализации самой хэш таблицы я тогда не дошёл) в итоге ограничился обычным dict и двусвязным списком для хранения порядка
источник

SA

Sergey Arkhipov in rannts
А зачем там двусвязный список? Можно же односвязным обойтись.
источник

SA

Sergey Arkhipov in rannts
А, чтобы reversed работал?
источник

БС

Байт Словович... in rannts
а чем не устраивает питоновский list и dict ?
источник

A🌚

Al 🌚l in rannts
Sergey Arkhipov
А, чтобы reversed работал?
Ага
источник

A🌚

Al 🌚l in rannts
Байт Словович
а чем не устраивает питоновский list и dict ?
Сложность удаления элемента O(n), а хотелось константное время
источник

RB

Roman Bolkhovitin in rannts
А как связный список поможет? в нем поиск элемента O(n)
источник

БС

Байт Словович... in rannts
ну зачем удалять? можно просто помечать удаленным. Потом вакуум запускать.
Ну и эта, дополнительная косвенная адресация как в классическом связанном списке, даёт такой охренительное пенальти, что O(n) это не страшно получается.
источник

A🌚

Al 🌚l in rannts
Roman Bolkhovitin
А как связный список поможет? в нем поиск элемента O(n)
А для этого есть dict
источник

RB

Roman Bolkhovitin in rannts
Байт Словович
ну зачем удалять? можно просто помечать удаленным. Потом вакуум запускать.
Ну и эта, дополнительная косвенная адресация как в классическом связанном списке, даёт такой охренительное пенальти, что O(n) это не страшно получается.
лови постгреса!
источник

A🌚

Al 🌚l in rannts
Байт Словович
ну зачем удалять? можно просто помечать удаленным. Потом вакуум запускать.
Ну и эта, дополнительная косвенная адресация как в классическом связанном списке, даёт такой охренительное пенальти, что O(n) это не страшно получается.
Ну такого мне в голову не приходило)
источник

A🌚

Al 🌚l in rannts
Байт Словович
ну зачем удалять? можно просто помечать удаленным. Потом вакуум запускать.
Ну и эта, дополнительная косвенная адресация как в классическом связанном списке, даёт такой охренительное пенальти, что O(n) это не страшно получается.
А какой именно пенальти даёт дополнительная косвенная адресация? По памяти? Или на сборщик мусора?
источник

БС

Байт Словович... in rannts
пенальти даёт косвенная адресация, так как память в компьютерах очень медленная (по сравнению с гигагерцами процессора), поэтому делают всякие кеши, предчтения и прочее..
Сейчас ищу статью, но по памяти получаются такие порядки:
чтение значения  из кеш линии -- пара тактов
чтение значения из кеша L2  -- десятки тактов
чтение значения из L3 -- под сотню
Чтение из основной памяти -- несколько сотен тактов.

Когда значения лежат рядом, они при первом обращении попадут во все уровни кешей и будут лежать рядом и пенальти не будет.
А с двусвязным списком у тебя получается чтение из рандомной памяти, которая 100% не будет в L1, но вероятно будет в L2/L3...
источник

БС

Байт Словович... in rannts
Пока нашел вот эту статью: http://alenacpp.blogspot.com/2010/04/blog-post.html
но там ссылки на другие, которые я сейчас не смотрел. Я помню что про кеши и списки хорошо было написано у некого калинина. Но либо блог умер, либо я что то не так помню, не могу найти :-(
А еще бывает такие парадоксы, чтобы программа быстрее работала, но больше памяти использовать
источник

A🌚

Al 🌚l in rannts
Байт Словович
пенальти даёт косвенная адресация, так как память в компьютерах очень медленная (по сравнению с гигагерцами процессора), поэтому делают всякие кеши, предчтения и прочее..
Сейчас ищу статью, но по памяти получаются такие порядки:
чтение значения  из кеш линии -- пара тактов
чтение значения из кеша L2  -- десятки тактов
чтение значения из L3 -- под сотню
Чтение из основной памяти -- несколько сотен тактов.

Когда значения лежат рядом, они при первом обращении попадут во все уровни кешей и будут лежать рядом и пенальти не будет.
А с двусвязным списком у тебя получается чтение из рандомной памяти, которая 100% не будет в L1, но вероятно будет в L2/L3...
Как ты далеко залез. Тут проседание будет только при итерации вроде как
источник

БС

Байт Словович... in rannts
объясняется это тем, что оптимально делать структуры в размер кэш линии (16 байт (или dwordов) 10 лет назад было, как сейчас -- хз), чтобы было как можно меньше вытеснений из кеша и конкуренции..
источник