бегущий по собесам
980 subscribers
22 photos
2 videos
32 links
Download Telegram
Поздравляю всех с Новым Годом⛄️⛄️⛄️. Желаю легких алго/систем дизайн собесов, жирных оферов, меньше стресса, больше радости

Спасибо за поддержку и подписку 💗💗💗
Please open Telegram to view this post
VIEW IN TELEGRAM
32🎉9🎄5❤‍🔥3
Сделал пост в линкедин о когнитивных искажениях мешающим разработчику на интервью и работе. Сюда выкладывать не стал, хочу продолжить делать посты про алгоритмы
👍138🔥6❤‍🔥1🍓1
Каждый знает, слышал, переворачивал, вертел BST(Binary Search Tree).
Поиск и вставка работают несложно цикл - while True внутри которого двигаемся в нужном направлении

А удаление работает довольно хитровыебанно - задача уровня медиум на литкоде

Алгоритм
1) Нода - лист, её просто удаляем.
2) Ноды имеет одного потомка - заменяем ноду этим потомком.
3) Остается самый сложный вариант - нода это поддерево


50
/ \
30 70
/ \ / \
20 40 60 80
/ \
55 65
\
57

Удаляем корень - 50

Ищем максимальную ноду в левом поддереве или минимальную ноду в правом поддереве

Получаем 40 и 55

Копируем значение этой ноды в удаляемую и избавляемся от дубликата через вызов этой же функции для удаления потомка

Может показаться, что здесь возникает бесконечная рекурсия, но при удалении дубликата она гарантированно завершится: выбранный потомок всегда будет либо листом, либо нодой с одним ребёнком - иначе его нельзя было бы использовать для замены удаляемой ноды

В комментарий приложу код
🔥135🍓4
Все кто пытался решить task-scheduler или meeting-rooms два и три знают про бинарную кучу(binary heap), одну из реализаций priority queue. Рассмотрим ее свойства и реализуем min heap

1) Хип - полное бинарное дерево, все уровни должны быть заполнены слева направо, за исключением последнего
2) Поддерживаемый приоритет зависит от типа кучи, мин хип - родитель <= потомков, макс наоборот

Исходя из первого свойства по индексу элемента получаем его потомков и родителя

left_child = 2 * i
right_child = 2 * i + 1
parent = i // 2

Для реализации стандартных операций push, pop, heapify нам нужны две дополнительные для просеивания мин элемента

• bubble_up(index) - двигаем мин элемент вверх
• bubble_down(index) - двигаем мин элемент вниз

Если вам на собесе нужно реализовать хип, во-первых почему вы до сих пор не ушли с этого собеса, во вторых чтобы не обрабатывать нулевый индекс, вставим ноль как dummy чтобы обработка чисел начиналась с 1 индекса


def __init__(self):
self.heap = [0] # для индексации с 1

# пока родитель больше ребенка меняем местами для восстановления min_heap
def bubble_up(self, index:int):
while index > 1:
parent_index = index // 2
if self.heap[parent_index] > self.heap[index]:
self.heap[parent_index], self.heap[index] = self.heap[index], self.heap[parent_index]
index = parent_index
else:
return

# меняем родителя с наименьшим ребенком при условии parent > min(left_child, right_child)
def bubble_down(self, index:int):
while index * 2 < len(self.heap):
child_idx = 2 * index

if child_idx + 1 < len(self.heap) and self.heap[child_idx] > self.heap[child_idx + 1]:
child_idx += 1

if self.heap[child_idx] >= self.heap[index]:
break

self.heap[child_idx], self.heap[index] = self.heap[index], self.heap[child_idx]
index = child_idx


Используя функции выше реализуем push, pop, heapify

def push(self, val: int) -> None:
self.heap.append(val)
self.bubble_up(len(self.heap) - 1)

# ставим на место рута последний элемент, мы не можем на место рута поставить min(left,right), появляется gap нарушающий 1 свойство хипа
def pop(self) -> int:
min_val = self.heap[1]
self.heap[1] = self.heap.pop()

self.bubble_down(1) #
return min_val

def heapify(self, nums):
self.heap = [0] + nums
n = len(self.heap)
for i in range((n - 2) // 2, -1, -1):
self.bubble_down(i)


С heapify довольно хитро, деля пополам мы отсекаем последний уровень и дальше восстанавливаем min_heap снизу вверх, просеивая большие элементы вниз. Засчет пропуска листьев heapify работает за O(n), несмотря O(log n) от self.bubble_down в худшем случае, так как просеивание будет применяться на нодах с маленькой высотой

Мем по хипу в комментах
👍12🔥75🍓2
Всем спасибо за подписку👉. Здесь стараюсь писать вкусно и интересно о разных вещах. Сейчас изучаю rust через написание редиса на codecrafters, также скоро буду, надеюсь, переезжать в Барселону, после пробоваться в бигтехи для опыта и контента😐
Please open Telegram to view this post
VIEW IN TELEGRAM
29🔥9🍓5👍2🤩1
Советую интересную статью, если не видели - https://openai.com/index/scaling-postgresql. Разрабы openai рассказывают про челленджи и способы их решения при масштабировании постгреса

В заголовке caching есть оптимизация singleflight - гошную реализацию которой я объяснял здесь - 2 пункт

Поделитесь также в комментах, как и где вы потребляете технологический контент💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥136👍5🍓1
Алго-интервью в эпоху AI

Посмотрел видео ниткода про интервью в бигтехи в 2026 году.

- Anthropic. Их CEO говорит о полной замене программистов нейронками, на интервью в компанию спрашивают алгоритмы.
- Open AI. Тоже самое, скрин вопроса это подтвердил.
- Подготовка. Кандидаты, получившие офферы в эти компании, все так же готовятся по базе Neetcode и благодарят за cтруктурированный контент.
- Meta и AI-assisted interview. DSA-интервью, где AI опционален, даже если попросить ai написать код, нужно доказать что он оптимален, корректен и сделать dry run, reddit - пост в об этом.
👍16🔥75🍓1
X(Twitter) выложили на гитхаб рекомендательный алгоритм формирования ленты пользователя. Вкратце - сервис Thunder отдает посты подписок, фильтрует и объединяет с Phoenix - ML система рекомендаций. На выходе - ранжированный Top K

Пара интересных технических нюансов:

1) Thunder - Ingestion pipeline.
Внутри работают два консьюмера. Первый берет сырые данные - TweetEventData - скелет поста, превращает в LightPost и перекладывает в топик второму консьюмеру

- Обработка данных. Убираем self.retweet, разделяем оригинальные твиты и реплаи через is_reply, is_retweet

- Хранение. Второй консьюмер складывает данные в PostStore - структура на базе потокобезопасных мап

- Отказоустойчивость. В проекте нет персистентного хранилища и второй консьюмер не коммитит офсеты. Если он упал, сервису не поставится readness проба, пока все сообщения не прочитаются

2) Фильтрация просмотренного.
В сервисе Home Mixer применяются доп фильтры в том числе - Bloom filter чтобы отсеить просмотренные твиты.
🔥21👍9🍓3
Говорят у ии проблемы с матаном, поэтому пока нас не заменили - врываемся в смежные области

https://www.youtube.com/watch?v=ARxtLv7kgEk
❤‍🔥17😁127👎3🔥3🤮1💩1
В плате провожу интервью по гошке - много вакансий прилетело, и рекрутеры попросили помощи.
Попался кандидат который списывает с AI 😐.

То чувство когда шел на интервью с нормальными пацанами, чтобы поспрашивать про B-tree и LSM-tree, а кандидат отводит взгляд на другой экран и копирует текст💀.

Пообщаюсь об изменении процесса. В текущее время собесы по языку должны сильно измениться или вообще исчезнуть. Ну а литкод и систем дизайн - база as always
Please open Telegram to view this post
VIEW IN TELEGRAM
😁168🔥8👎1🤮1🤡1🍓1
Skip List

В рамках реализации Redis CodeCrafters есть глава sorted set, который применяется в дизайне рейтинговых систем(Leaderboards). Sorted set как и некоторые LSM-tree: Cassandra, LevelDB, RocksDB используют под капотом skip list.

Давайте решим design skip list на литкоде. Имейджин твое лицо когда на собесе дали эту задачу😂

Из интересного, skip list вероятностная(probabilistic) структура данных. Я постарался дать небольшое введение для удобного переключения на скрины

Структура skip list - уровни, каждый уровень - отсортированный связный список.

Node - содержит val и массив nexts, через nexts[i] мы выбираем уровень, len(nexts) говорит о высоте текущей Node.

Килер-фича skip list - поиск, вставка, удаление за log(n), все потому что высота ноды выбирается случайно через probability(обычно это 0.5)

Search
Вкратце алгоритм - пока следующий элемент меньше target двигаемся вправо, если значения равны элемент найден. Иначе спускаемся вниз

Insert
Используется доп массив update для сохранения потенциальных ссылок после которых добавится новое значение. Функция - get_random_level вычисляет уровень по который мы добавим новый элемент. Описание функции не влезло на скрин поэтому вставлю сюда


def get_random_level(self) -> int:
level = 1

while random.random() < self.probability and level < self.max_level:
level += 1

return level


Erase
С массивом update работаем как и в insert. Уточнение - дубликаты в skip list могут быть и выглядеть как несколько башен, здесь мы решаем удалить самую первую - candidate = update[0].nexts[0]
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥244❤‍🔥3💩2🤡2👎1🍓1
Открыт и рад любому фидбэку

Ставь палец вверх если хочешь такой же разбор LRU, LRU-K, LFU. Спрашиваю потому что эти задачи намного популярней чем skip list
👍80🖕13🍓3💩2🤡2🦄2👎1
Наблюдение #1
Всегда уточняй какой палец вверх имеешь в виду

Наблюдение #2
Тг посты не подходят для описания сложных, технических вещей, перенес skip list в telegraph, посмотрю как пойдет

https://telegra.ph/Skip-List-04-02
20😁10🔥8👍3👎2🤮2🤡2🍓1
This media is not supported in your browser
VIEW IN TELEGRAM
Все разрабы пока фича вайбкодится
😁4712🔥82🤮2💩2🤡2🍓1
Верхнеуровнено расписал про алгоритмы вытеснения в кэше и почему LRU-K это золотая середина

https://telegra.ph/LRU-LRU-K-04-13
🔥2014👍3🍓2
Нужно качать линкедин говорили они

В этом время линкедин чела который сменил Тим Кука

Интересно какой у его профиля SSI
😁42🔥12🍓3👍1🤡1
Привет

Чутка потерялся какой контент делать дальше, поэтому расскажу что есть на душе😘


Придавило работой, в середине мая деплоим банкоматы в прод. Уже были успешные операции пополнения и снятия. Беру на себя больше сырых задач - без аналитики. Дедлайн горит, появляются новые требования от "мексиканского цб". Как релизнем, скину фотку банкомата


В начале года хотели переезжать в Барсу по номаду, но нам отказали в шенгене и в аппелляции, поэтому переезжаем по рабочей визе.

Расскажите что нового у вас
Please open Telegram to view this post
VIEW IN TELEGRAM
21🔥9🍓4