Благодаря обзору от https://t.me/johenews приобрёл себе "Golang для профи" Михалиса Цукалоса. Вывод после первых 200 страниц: автор хорошо знает свой материал, делится огромным массивом знаний, и почти не льёт лишней воды, но структура книги и порядок изложения информации кажется немного сумбурным. С другой стороны, аудитория - явно знакомые с синтаксисом языка люди, имеющие какой-то опыт в разработке, которые и без плавных переходов должны понимать материал. Так что, учитывая полное отсутствие нормальной литературы по golang, книжка весьма и весьма хорошая.
А я, тем временем, начиная с 5-ой главы, решил начать вести краткие конспекты, как ранеее делал с "Высоконагруженными приложениями" Клеппмана, и "Микросервисами" Ричардсона. Так что, ловите первый конспект по главе "Как улучшить код Go с помощью структур данных".
Автор даёт интересное определение сложности алгоритма: сложность алгоритма определяется главным образом тем, сколько раз алгоритму для выполнения его работы требуется доступ к входным данным.
В go большинство операций, таких как поиск значения по ключу в хеш-таблице, или доступ к элементу массива, имеют постоянное время - О(1).
Не все структуры данных одинаковы: в go операции с массивами выполняются быстрее, чем операции с хеш-таблицами.
Первая рассматриваемая автором структура - двоичное дерево. Реализация - https://github.com/PacktPublishing/Mastering-Go-Second-Edition/blob/master/ch05/binTree.go
Если нам нужно представить иерархические данные - нет ничего лучше двоичного дерева. Если дерево сбалансировано, то операция поиска, вставки и удаления элементов выполняются за log(n), а высота дерева приблизительно равна log^2(n). Например, высота дерева из 100 000 элементов - 17, а из 1 000 000 - около 20. Т.е. мы можем достичь любой элемент дерева за менее чем 20 шагов, что очень круто.
Двоичное дерево следует использовать только если у дерева простые ключи, чтобы операции вставки и поиска не были слишком сложные, и если дерево возможно поддерживать в упорядоченном виде, чтобы не нарушать ассимптотику операций вставки, поиска и удаления. При этом важно понимать, что массив или список создаются и инициализируются быстрее, но скорость получения данных, предоставляемая двоичным деревом, порой может окупить потерю времени при инициализации.
Post #216
1.29K