@dlangru

Страница 89 из 719
Oleg
21.10.2016
12:46:52
спасибо, это было б крайне полезно и интересно
дерево нужно для бинарного поиска, оно позволяет хранить массив пар ключ-значение в отсортированном по ключу виде, следовательно поиск по такому массиву будет log(n)

std.container содержит красно-чёрные деревья и банарихип

Just
21.10.2016
12:48:05
ага, действительно можно, это будет быстро видимо

Google
Just
21.10.2016
12:57:33
https://dlang.org/phobos/core_memory.html#.GC.collect
не помогло, но спасибо

Oleg
21.10.2016
13:04:34
ага, действительно можно, это будет быстро видимо
самая медленная реализация, но хранится только ключ и значение import std.stdio; import std.algorithm; import std.array; struct MyHash(K, T) { static struct Pair { K key; T value; } Pair[] data; // TODO rbtree ptrdiff_t find(K key) const { // TODO binary find foreach(i, val; data) if (val.key == key) return i; return -1; } void insert(K key, T value) { // TODO rbtree.insert auto idx = find(key); if (idx >= 0) data[idx] = Pair(key, value); else data ~= Pair(key, value); } T opIndex(K key) const { return data[find(key)].value; } ref T opIndex(K key) { return data[find(key)].value; } auto opIndexAssign(T value, K key) { insert(key, value); return value; } K[] keys() const @property { return data.map!"a.key".array.dup; } T[] values() const @property { return data.map!"a.value".array.dup; } } struct Data { float x, y, z; } void main() { MyHash!(uint, Data) aa; aa[13] = Data(3.14, 2.7, -1); aa[15] = Data(0, 1, 0); writeln(aa[13]); writeln(aa.keys); writeln(aa.values); MyHash!(string, int) bb; bb["hello"] = 13; bb["world"] = 42; writeln(bb["hello"]); }

а стандартные ассоциативные массивы вроде на скорость ориентированы

Just
21.10.2016
13:06:33
а стандартные ассоциативные массивы вроде на скорость ориентированы
да, к скорости то как раз вопросов нету. потестирую сейчас тогда ваш и другие варианты

Oleg
21.10.2016
13:07:56
ну мой вариант это просто пример и где TODO нужно код переписать, ещё нужно добавить удаление и остальные методы из стандартных AA

а то что к скорости вопросов нет, это потому что алгоритмы были нормальные, а не линейные)))

Just
21.10.2016
13:09:14
ну мне только добавление и поиск надо, а туду вижу, подумаю, как это сделать

Just
21.10.2016
13:10:15
ну да
эт да, но как всегда в угоду одному страдает что-то иное

Oleg
21.10.2016
13:11:33
вариант, сохраняющий память просто реализовать (собственно пример), а вариант быстрый сложно, соответственно это хорошо, что в стандартной поставке сложный вариант

Google
Just
21.10.2016
13:12:51
Grigirii
21.10.2016
13:15:27
если вставка будет только в начале, а потом только поиски, то можно запихать всё в обычный массив пра key-value, а потом отсортировать по ключу. тот же логарифм на доступ, минимальные затраты памяти

Just
21.10.2016
13:17:32
если вставка будет только в начале, а потом только поиски, то можно запихать всё в обычный массив пра key-value, а потом отсортировать по ключу. тот же логарифм на доступ, минимальные затраты памяти
т.е. тоже самое, что и MyHash вышеприведенный, но за счет сортировки ключей можно быстрее искать? но искать собственно, если не полным перебором, как сейчас, за счет чего логарифм на доступ можно получить?

Oleg
21.10.2016
13:57:17
бинарный поиск

Just
21.10.2016
13:57:49
бинарный поиск
а, понял, дошло

Oleg
21.10.2016
14:00:02
... bool sortBeforeInsert = true; bool isSorted = false; void sort() { data = data.sort!"a.key < b.key".array; isSorted = true; } ptrdiff_t find(K key) const { if (data.length == 0) return -1; enforce(isSorted, "binary find can work only on sorted range"); size_t a=0, b=data.length-1; do { auto c = (a+b)/2; stderr.writeln(data, " find ", key); stderr.writeln("current c == ", c, ", data[c] == ", data[c]); if (data[c].key == key) return c; else if (data[c].key > key) b = c; else a = c; } while(a != b); return -1; } void insert(K key, T value) { auto idx = find(key); if (idx >= 0) data[idx] = Pair(key, value); else data ~= Pair(key, value); isSorted = false; if (sortBeforeInsert) sort(); } ...

ну это тоже на вскидку

Just
21.10.2016
14:01:47
ну это тоже на вскидку
ого, буду разбираться

Oleg
21.10.2016
14:28:20
чёт накосячил с бинарным поиском)

ptrdiff_t find(K key) const { if (data.length == 0) return -1; enforce(isSorted, "binary find can work only on sorted range"); ptrdiff_t a=0, b=data.length-1; do { if (data[a].key == key) return a; if (data[b].key == key) return b; auto c = (a + b)/2; if (data[c].key == key) return c; if (data[c].key > key) b = c; else a = c; } while(b - a > 1); return -1; }

Just
21.10.2016
14:28:50
чёт накосячил с бинарным поиском)
слегка да, вкуриваю как раз

Oleg
21.10.2016
14:28:53
каждый раз как в первый раз

Grigirii
21.10.2016
14:29:04
бинарный поиск есть в стандартой библиотеке, никогда не пишите его руками

это плохо кончается

Oleg
21.10.2016
14:29:16
ну "спорт" жи

=)

Grigirii
21.10.2016
14:31:15
там много граблей, вроде обработки повторяющихся, нкератных длин, отсутствующих элементов

в вашей версии точно есть переполнение инта в 32 битной версии и массиве больше 2 гигов

на (a+b)/2

Google
Oleg
21.10.2016
14:31:52
уффф

не спорю, что там косяки

Grigirii
21.10.2016
14:32:38
https://dlang.org/phobos/std_range.html#.SortedRange

там нет find, но есть lowerBound, которой хватит для задачи

да и вообще хорошей идеей будет хранить сортированный массив в SortedRange

Dmitry
21.10.2016
14:48:31
Кстати, хотел спросить. Пайп он где? В оперативной памяти хранится?

это что-то типа стека в плане организации?

Grigirii
21.10.2016
14:49:25
какой пайп? из std или vibe?

Dmitry
21.10.2016
14:49:45
а они разные? Я думал это что-то общее для всех ОС и языков

Grigirii
21.10.2016
14:50:04
просто термин очень широкий, можно поконкретнее?

Dmitry
21.10.2016
14:51:25
Э... я честно не знаю как конкретизировать. Я думал это узкий термин. Просто процессы могут взаимодействовать между собой через разделяемую память, файл и пайп (вроде все). В каком контексте пайп еще может использоваться?

Grigirii
21.10.2016
14:52:32
ок, тогда понятно. это не стек, это очередь. первый вошёл - первый вышел. обычно нигде не хранятся, в том смысле что это конвеерная обработка. один произвёл, второй обработал.

Dmitry
21.10.2016
14:53:28
так а эта очередь куда-то пишется?

Grigirii
21.10.2016
14:53:41
есть pipe в рейнджах, который позволяет собрать несколько функций в один конвеер, есть пайп в vibe.d, который между тасками данные гоняет. суть как для процессов. Это к вопросу о ширине термина

Dmitry
21.10.2016
14:54:24
несколько функций в один конвеер? Это разве не UFCS?

Grigirii
21.10.2016
14:54:58
это другая тема, сначала разберёмся с сабжевыми пайпами

в простом случае пайп - соединение stdout одного процесса с stdin другого: grep -i “error” ./log | wc -l мы отдали всё, что нашёл греп в wc, чем посчитали количество ошибок

запустятся процессы grep и wc одновременно, нигде не будет хранится вывод грепа. просто по мере того, как он находит ошибку он отдаёт её в счётчик и забывает

https://habrahabr.ru/post/195152/

подробнее

Google
Dmitry
21.10.2016
14:58:32
а очередь эта в оперативку кладется?

Grigirii
21.10.2016
14:59:22
да, но очень быстро чистится, поэтому по факту обычно пустая

Oleg
21.10.2016
14:59:49
кстати стандартный File блокирующий же?

Grigirii
21.10.2016
14:59:56
да

асинхронных вещей в std нет пока

Dmitry
21.10.2016
15:00:36
а как бы неблокирующий std выглядел?

Grigirii
21.10.2016
15:00:48
как vibe.d

хотя не, наоборот, как vibe.d без файберов и тасков

Dmitry
21.10.2016
15:01:06
и как блокировка выглядит сейчас? т.е. речь же не про все функции, а про запрос-ответ

Oleg
21.10.2016
15:01:57
спутал... на уровне системы есть кэш дисковый же

Admin
ERROR: S client not available

Dmitry
21.10.2016
15:08:18
Олег, я не совсем понимаю как File может вообще неблокирующим. Типа файл может писать два потока? Или один пишет, а другой читает?

Oleg
21.10.2016
15:15:29
в этом контексте "блокирующий вызов" это тот, завершения которого нужно дожидаться, а потом уже следующий код будет выполнен

0x9d8e
21.10.2016
15:15:32
Ну так да, файл можно открывать эксклюзивно, можно неэксклюзивно. Можно только на чтение, можно только на запись, можно и то и другое.

Grigirii
21.10.2016
15:16:29
блокирующее чтение из файла: res = file.read(...); someFunc(res); // у нас уже есть строка неблокирующее чтение: file.read(function (res){ someFunc(res); }); // здесь ещё нет строки, res будет только в колбеке

Oleg
21.10.2016
15:16:31
"асинхронный вызов" происходит быстро, но код сразу после такого вызова не может получить результат, если он его интересует (в js часто применяется)

поэтому делается так как как указал Grigirii

Dmitry
21.10.2016
15:18:24
неблокирующий — обработка данных внутри функции получающей их так?

Grigirii
21.10.2016
15:18:52
исполнение не блокируется на время чтения

Dmitry
21.10.2016
15:19:15
потому что чтение делегируется на другой поток?

Google
Dmitry
21.10.2016
15:19:22
на системный в данном случае

Grigirii
21.10.2016
15:20:00
нет, пототка не создаётся, но можно считать что это некий "системный поток"

Dmitry
21.10.2016
15:20:01
просто как я понимаю легче всего это писать в языках где все функции — функции первого порядка т.е. типа js

Grigirii
21.10.2016
15:20:26
D мало чем отличается в данном контексте

Oleg
21.10.2016
15:20:30
+

вот прям точно это хотел написать)

Dmitry
21.10.2016
15:21:19
пока код ждет результата, планировщик на новый процесс перещелкивается?

Grigirii
21.10.2016
15:21:25
ага

Dmitry
21.10.2016
15:22:28
А если какой-то тяжелый рассчет нужно провести, то как оно работает? По факту же рассчет будет блокирующим

Grigirii
21.10.2016
15:22:54
да, без создания потоков это уже сложно разрулить

Dmitry
21.10.2016
15:23:37
а вот где грань? Это все только опытным путем делается? типа "тут мы будем считать, значит лучше поток создать"?

Grigirii
21.10.2016
15:23:39
для простого случая до сих пор применяют ручной возврат в ивентлуп, но это очень плохая практика. требует вставки кода прямо в вычисления

да, именно так

хорошей практикой является ничего не делать в ui потоке, и фронтовую часть серваков, чтобы не увеличивать отклик. но очень мелкие вещи можно. это уже опытным путём

Dmitry
21.10.2016
15:27:27
А что почитать про организацию even loop ? Чтобы понять поглубже как оно работает

Grigirii
21.10.2016
15:28:26
сложный вопрос. статьи по асинхронному программированию, исходники libasync

Pavel
21.10.2016
15:28:29
Напиши свой event loop =)

Самый простейший

Grigirii
21.10.2016
15:28:54
документация к libev, libevent, libuv и тд

если хочется совсем до кишков, то select, потом epoll, kqueue

Dmitry
21.10.2016
15:30:35
я по докам не осилю указанным, там уровень совсем другой нужен. Мне нужно что-то для чайников

Pavel
21.10.2016
15:30:38
Напиши себе 3 функции которые последовательно печатают какие-нибудь цифры и добейся чтобы эти цифры печатались вразнобой из всех функций. Это и будет event loop

Dmitry
21.10.2016
15:30:57
о

Страница 89 из 719