
Tigran
16.02.2018
22:03:43

Dmitriy
16.02.2018
22:04:11

Tigran
16.02.2018
22:04:24
Хотя в последней джаве есть довольно вкусные плюшки

Google

Dmitriy
16.02.2018
22:04:52

Denis
16.02.2018
22:05:04
C++ и java это де-факто стандарт для спортивного программирования

Tigran
16.02.2018
22:06:10
Если честно, когда я впервые увидел Julia несколько лет назад (лет восемь?), я надеялся, что этот кошмар тихо загнётся и всё. Ан нет.

Orkhan
16.02.2018
22:06:48
#работа #вакансия #teamlead #python #django #remote
Ищу в проект опытного тимлида и сильного питон разработчика.
Без полотна текста, требования: большой опыт в построении и управлении командой, опыт хотя бы в 1 проекте Highload++ в роли архитектора.
Старт удаленка, далее планируется переезд в офис в Минске.
Зарплатная вилка без верхней планки, от 3500 USD
Просьба не долбить личку вопросами сколько потолок. С нужным кандидатом договоримся
В личку жел-но обращаться с резюме или описанием себя и опытом. Давайте экономить время друг-друга

Dmitriy
16.02.2018
22:07:42
ну вот для меня Julia, Erlang, Elixir, Python очень удивительные и интересные. У каждого есть свои уникальные особенности. Прикольные как языки и как технологии
Ну Go и haskell еще, но они меня не прильщают


Sadness
16.02.2018
22:08:19
Дайте запилю кулстори. Я решаю задачки на leetcode и регулярно возникает потребность в сбалансированных деревьях (например, вот тут: https://leetcode.com/problems/the-skyline-problem/description/ - нужно быстро добавлять, удалять и находить максимум). Плюсовики хитро используют multiset, в питоне же деревьев с балансировкой нет, а реализовывать их ох как не хочется. Но обычно заранее известен перечень элементов, которые в это дерево надо будет засунуть. Поэтому я придумал такой лайфхак: я сортирую весь массив потенциальных элементов дерева и строю по нему сразу сбалансированное дерево (это тривиально):
def build_tree(array, l=None, r=None):
l = l or 0
r = r or len(array)
if r - l <= 0:
return None
if r - l == 1:
return Node(array[l])
m = (l + r) // 2
left = build_tree(array, l, m)
right = build_tree(array, m + 1, r)
return Node(array[m], left=left, right=right)
При этом я помечаю все элементы дерева как выключенные:
class Node(object):
def __init__(self, value, left=None, right=None):
self.value = value
self.enabled = False
self.has_enabled_successors = False
self.left = left
self.right = right
После этого остаётся вместо добавления элемента в дерево реализовать его включение (элементарная рекурсия), вместо удаления - выключение (тоже), и при других операциях (поиск элемента/поиск максимума/поиск минимума) учитывать включенность/выключенность. Вуаля, идеально сбалансированное дерево с log n операциями при миминуме умственного напряжения.
Может, у вас есть более вменяемые способы решать задачи на деревья без реализации балансировки?
погоди. когда я смотрел конспекты к scipy там упоминали cKDTree в качестве реализация сбалансированных деревьев - а разве это не оно? idea is that the kd-tree is a binary trie, each of whose nodes represents an axis-aligned hyperrectangle. Each node specifies an axis and splits the set of points based on whether their coordinate along that axis is greater than or less than a particular value.


Tigran
16.02.2018
22:08:41
Речь о питоне без библиотек.

Denis
16.02.2018
22:09:18

Sadness
16.02.2018
22:10:46
ну. няша. ты же не забыл что у вас тут профессиональное сообщество а я нищий духом бегинер к которму ты шлёл пхапышников. что аткое литко я не знаю. а вот описание в kd_дереву читал. на слух вроде то. я не пробывал его в работе. моё объятое варпам сознание просто помнит что оно есть.

Denis
16.02.2018
22:11:54
kd это больше про поиск ближайших точек и запросы на прямоугольниках

Tigran
16.02.2018
22:13:05
Да, но почему корень-то?

Google

Sadness
16.02.2018
22:13:09
ну. а разве здесь нет?
https://leetcode.com/problems/the-skyline-problem/description/

Tigran
16.02.2018
22:13:55
Это не совсем то (совсем не то)

Sadness
16.02.2018
22:14:23
тогда суровую сибирско сеньорскую лекцию почему нет и корень в студию!

Denis
16.02.2018
22:14:30
Да, но почему корень-то?
Для плоскости это доказывается расписыванием и решением большой рекурренты. Вкратце - потому что, в отличие от дерева отрезков, у нас количество опрашиваемых прямоугольников на каждом уровне увеличивается

Tigran
16.02.2018
22:15:15
Поиск по-прежнему О(высота), а высота - логарифм от числа элементов
Откуда корень?

Denis
16.02.2018
22:16:18
Я про любой запрос на прямоугольнике

Tigran
16.02.2018
22:16:23
А, ну тогда да.

Denis
16.02.2018
22:16:34
Что такое поиск в kd?

Sadness
16.02.2018
22:16:40
kexit

Denis
16.02.2018
22:16:42
Оно не key-value

Sadness
16.02.2018
22:16:44
нет. лучше.

Tigran
16.02.2018
22:17:01

Sadness
16.02.2018
22:17:02
что такое sparse_distance_matrix в kd?

Tigran
16.02.2018
22:17:35
Насколько я понимаю по описанию на википедии, это обычное дерево поиска, заточенное под k-мерное пространство

Denis
16.02.2018
22:17:39
Это просто множество точек в R^n с некоторой дополнительной структурой, ускоряющей запросы к ним

Tigran
16.02.2018
22:17:47
Формально одномерное KD - это просто двоичное дерево поиска

Google

Tigran
16.02.2018
22:18:35
The k-d tree is a binary tree in which every node is a k-dimensional point.

Denis
16.02.2018
22:18:51
Непонятно, зачем в одномерном случае использовать его
Есть много нормальных структур

Tigran
16.02.2018
22:19:07
Не туда смотрю?
https://en.wikipedia.org/wiki/K-d_tree

Sadness
16.02.2018
22:19:15
отсюда и мой вопрос

Tigran
16.02.2018
22:19:16
Двоичное дерево поиска

Denis
16.02.2018
22:19:33
space partitioning это не то, что тебе надо
Оно про геометрию

Tigran
16.02.2018
22:20:51
Короче, в одномерном случае обычное сбалансированное дерево поиска
Можно юзать, если под рукой есть scipy

Denis
16.02.2018
22:21:24
В scipy нет нормальных сбалансированных деревьев?
И kd не поддерживает изменение элементов

Tigran
16.02.2018
22:21:50
Википедия так не считает

Denis
16.02.2018
22:22:24
Там можно с помощью некоторых костылей и ухудшения асимптотики таки сделать его изменяемым, но не надо

Tigran
16.02.2018
22:22:31
Нормальные деревья есть в других пакетах. Но, повторюсь, я изначально говорил про питон без библиотек.

Denis
16.02.2018
22:24:25
Если в какой-то прикладной задаче нужно дерево, обычно можно и библиотеку подключить. На питоне оно все равно будет в n раз медленнее, чем на си
А если это задача с cf, там питон и с деревом, и без дерева tl получит

Tigran
16.02.2018
22:25:48
Это да
Но вот на литкоде питон нормально проходит.

Google

Denis
16.02.2018
22:27:11
Кстати, добавлять, удалять и находить максимум умеет двоичная куча, которая в питоне есть

Tigran
16.02.2018
22:28:53
Ну, не максимум, а минимум, и не выиграл, а програл^W^W^W^W удалять она умеет только минимальный элемент.

Denis
16.02.2018
22:33:03
Можно запоминать удаленные элементы, и если максимум равен одному из них, скипать его и брать еще раз

Tigran
16.02.2018
22:35:25
Тогда worst case будет O(N) вместо O(log N), инфа сотка.

Denis
16.02.2018
22:37:26
Амортизированно то же самое, инфа сотка

Tigran
16.02.2018
22:38:48
Пруф?

Denis
16.02.2018
22:40:11
Добавится элементов О(n), удаление O(log n), в сумме на удаление не более О(n log n)
Если любишь формальности, можно ввести потенциал. Но мне лень

Tigran
16.02.2018
22:41:08
Наполняю элементами, удаляю на каждой итерации самый большой. После каждого удаления смотрю максимум. Получаю на N элементах суммарную сложность N^2. А нужно N log N.

Denis
16.02.2018
22:42:52
Максимум за 1, удаление максимума за логарифм. Откуда N?

Tigran
16.02.2018
22:43:22
Как это максимум за 1, когда
запоминать удаленные элементы, и если максимум равен одному из них, скипать его и брать еще раз
?
Максимум за O(число удалённых элементов).

Denis
16.02.2018
22:44:16
Запоминаешь в сете. Когда достаешь максимум, смотришь, есть ли он в сете, и скипаешь при необходимости
Сет в питоне за 1 все делает

Tigran
16.02.2018
22:44:55
Ну. Надо скипнуть О(число удалённых элементов).

Denis
16.02.2018
22:46:04
Скипаешь каждый элемент ты один раз в жизни и больше к нему не возвращаешься
Всего скипов будет N

Tigran
16.02.2018
22:46:43
Предлагаешь трекать текущий максимум?
Да, похоже, что тогда амортизированная О(1) будет. Неплохо.

Google

Tigran
16.02.2018
22:48:02
Хотя если в процессе будут добавления, всё сломается.

Denis
16.02.2018
22:48:17
Текущий максимум куча сама трекает

Tigran
16.02.2018
22:49:37
Не, если ты удаляешь из неё элементы, помечая их в сете как удалённые, придётся трекать отдельно.

Denis
16.02.2018
22:50:24
В любом случае это надо будет пересчитывать не более N раз в сумме

Tigran
16.02.2018
22:52:23
О, придумал.
Храним сет удалённых элементов.
При очередном запросе на удаление смотрим. Если это не максимум, просто помечаем в сете.
Если максимум, удаляем из кучи и смотрим, не оказался ли наверху элемент, помеченный как удалённый. Если да, удаляем и его. И так далее.
Получаем удаление за амортизированое O(log N) и максимум за гарантированное O(1).
Круто. Так даже проще. Впрочем, если нужен ещё и минимум, придётся держать рядом ещё одну кучу и ещё один сет с удалёнными элементами.
Всё-таки куча сама по себе с трудом заменяет дерево.
О, а на SO подсказывают, как удалить произвольный элемент из кучи за O(log N), используя кишки heapq.
h[i] = h[-1]
h.pop()
if i < len(h):
heapq._siftup(h, i)
heapq._siftdown(h, 0, i)
Правда, чтобы найти i по значению элемента за O(log N), тоже придётся залезть в кишки heapq (или самому рекурсию написать).


Dmitri
16.02.2018
23:13:47
Ребятишки. Такая задачка-вопросик
Работают 2 скрипта (X и Y). X - ботик на хуке, Y - цикл
while True
(не спрашивайте зачем).
Так вот, как бы мне обновить значение переменной, допустим Y1 в скриптике Y из скрипта X?
Попытался импортнуть:
from Y import Y1
Y.Y1 = X1
в итоге, при попытке запуска X - не зпустился, потому что начал работать цикл из скрипта Y
Есть для этого более разумный способ?)(если мой вообще можно назвать разумным?)

Tigran
16.02.2018
23:17:31
Твой способ нерабочий от слова совсем
Тебе нужно межпроцессное взаимодействие делать
Например, сокетами их соединить
Или поднять в X примитивный HTTP-сервер, а в Y его дёргать

Dmitri
16.02.2018
23:19:45

Tigran
16.02.2018
23:22:57
да)

Dmitri
16.02.2018
23:23:59
да)
т.е., в принципе, разницы нет, что я буду его дергать на наличие обновлений, что я эту переменную запишу в примитивную БД?