@ru_python

Страница 4783 из 9768
Tigran
16.02.2018
22:03:43
попробуй Julia
Oh no. Это самый хуёвый язык, какой я видел.

Dmitriy
16.02.2018
22:04:11
Oh no. Это самый хуёвый язык, какой я видел.
почему же? самый хуевый - это Java

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.

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
Да, но почему корень-то?
Для плоскости это доказывается расписыванием и решением большой рекурренты. Вкратце - потому что, в отличие от дерева отрезков, у нас количество опрашиваемых прямоугольников на каждом уровне увеличивается

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
Оно не key-value
А какое?

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
Твой способ нерабочий от слова совсем
это я уже понял) спасибо, буду гуглить)

Или поднять в X примитивный HTTP-сервер, а в Y его дёргать
я прошу прощения, уточню бот на веб-хуке, сервер на cherryPy - это ведь и есть сей примитивный HTTP-сервер?

Tigran
16.02.2018
23:22:57
да)

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

Страница 4783 из 9768