realloc(3) в стиле common lisp

Oct 12, 2011 01:06

Одну из самых востребованных на рынке структур данных: "массив" можно получить в CL с помощью функции make-array. В принципе, зачастую этой информации достаточно для успешного и счастливого применения массивов в практике.

Но если копнуть немного поглубже, неожиданно выясняется, что, в зависимости от переданных параметров, make-array умеет ( Read more... )

vector, realloc, lisp, array, common lisp, hint

Leave a comment

thedeemon October 12 2011, 07:26:53 UTC
Фигасе разница, там что обычный вектор - это список что-ли?

Нельзя ли сделать более приличный вектор как в скале и кложуре (32-арное дерево) и, пользуясь динамиченостью лиспа, сделать так, чтобы он везде использовался вместо того медленного вектора?

Reply

swizard October 12 2011, 21:24:44 UTC
Не, там не список, но что-то с реаллокацией (в профайлере виден replace -- это типа лисповый memcpy).

А зачем дерево для вектора, если вся фишка вектора в O(1) доступе?

Reply

thedeemon October 13 2011, 03:53:52 UTC
Там фишка в том, при массиве на миллиард значений (4 гига интов например) у 32-ного дерева глубина будет всего 6 или 7, что "почти О(1)". Зато мгновенные конкатенация, взятие подмассива и добавление с обоих сторон.

Reply

swizard October 13 2011, 07:45:33 UTC
А на четыре гига интов там случайно не будет 256 гигов ссылок от каждого узла на своих детей? :)

Reply

thedeemon October 13 2011, 07:50:41 UTC
Нет, узлы и листья по-разному устроены.

Reply

swizard October 13 2011, 20:37:59 UTC
Все равно должен быть хотя бы четырехкратный оверхед по памяти по сравнению с обычным массивом, ну или я что-то не понимаю

Reply

thedeemon October 14 2011, 06:01:54 UTC
Не вижу, откуда взяться четерехкратному или хотябы четвертькратному.
У нас дерево, где все ветви одной длины. В самом низу, в листьях, unboxed массивы по 32 значения, например int[32]. В узлах выше unboxed массивы по 32 указателя вниз. Плюс отдельно несколько общих переменных - высота дерева, начало, конец. Оверхед ~ 1/32 + (1/32)^2 + (1/32)^3...

Reply


Leave a comment

Up