febb: (Default)
febb ([personal profile] febb) wrote2009-09-12 07:09 pm

Вообще сегодня День Программиста!

Поэтому будет исключительно программистский пост!

[livejournal.com profile] avva пишет:
Владимир Ярославский из Сана придумал новый вариант Квиксорта, работающий быстрее обычного. Основная идея проста до безобразия: вместо одного опорного элемента (pivot) выбираем два, распихиваем элементы в три подмассива: меньше первого опорного, между первым и вторым, и больше второго, и спускаемся рекурсивно три раза вместо обычных двух.

А я вот как-то выдумал алгоритм в несколько раз быстрее квиксорта для массивов строк.
Наверное он похож на алгоритм Седжвика, но мне кажется должен быть быстрее.
Идея такая:
Рекурсивно, начиная со старшего байта:
1) вычисляем гистограмму встречающихся байт и сортируем на 256 кусков в один проход
2) для каждого из 256 кусков повторяем 1) для следующего байта и т.д.

Конечно для ограничения вырождения алгоритм нужно усложнить и т. п.
Но вот на самом примитивном уровне как он выглядит на С++:



void ByteSort(char ** Array, size_t Num, size_t size, size_t offset=0)
{
size_t S[256], // starting index per group
H[256]; // (histogram) number of elements in group
// init historgram:
memset(H, 0, sizeof(H));
// 1st path: make historgram of byte values:
register unsigned char ** data = (unsigned char **)Array;
register size_t i;
for(i=0; i < Num; i++)
++H[ data[i][offset] ];
// calculate staring index positions:
size_t s = 0;
for(i=0; i < 256; i++)
{ S[i] = s; s += H[i]; }
// sorting by regrouping data:
unsigned char ** ds = new unsigned char * [ Num ]; // allocate temp array for sorted elements
for(i=0; i < Num; i++)
{
unsigned char * d = data[i];
ds[ S[ d[offset] ]++ ] = d; // increment current position and copy element
}
memcpy(data, ds, sizeof(*data)*Num); // copy sorted array back
delete [] ds; // free mem
// sort recurecively all the groups:
if(--size)
{
++offset;
s = 0;
for(i=0; i < 256; i++)
{
size_t h = H[i];
if(h > 1)
ByteSort(Array + s, h, size, offset);
s += h; //calculate starting index
}
}
}

Мне интересно, кто-нибудь теоретически может оценить, насколько он быстрее?
По тестам со случайными массивами работает раз в 10 быстрее квиксорта.
Плохие случаи я не исследовал.

Всех программистов с Праздником!

[identity profile] bird-123.livejournal.com 2009-09-12 11:35 pm (UTC)(link)
лучше бы ты что-то матерное написал - я бы и то больше поняла ))

[identity profile] febb.livejournal.com 2009-09-12 11:47 pm (UTC)(link)
Дык это самый настоящий программистский мат! :)
Только на С++ :)

[identity profile] bespechnoepero.livejournal.com 2009-09-13 03:39 am (UTC)(link)
Давно уже пора хардвэр делать для сорта, скажем матрица 256 на 256 логических элементов, и сравнивать страницами, так сказать, чтобы сузить зону поиска. Вообще нерационально все время на софт полагаться. Он, конечно, гибкий, но в мире существует куча апликаций со статической структурой, та же база данных магазина Амазон, например, или банковские базы данных. Они досаточно большие, чтобы форматировать диск не под некий абстрактный файл операционной системы, а под саму базу данных, ведь структура формата диска аналогична таблице, только что не квадратная, а круглая, но все же это обыкновенная двухмерная таблица, только что на магнитном носителе. Так ведь и таблица базы данных она тоже не на мониторе в самом деле находится. Тогда можно редактировать записи в базе данных без переписывания всего файла. Я уже не говорю, что с такой структурой форматирования хард диска поиск тоже можно оптимизировать.

[identity profile] vazhskiy.livejournal.com 2009-09-13 04:55 am (UTC)(link)
С новым праздником! Хотя меня он как-то особо не касается.

[identity profile] febb.livejournal.com 2009-09-13 12:43 pm (UTC)(link)
Спасибо!

[identity profile] skwo-82.livejournal.com 2009-09-13 06:32 am (UTC)(link)
С профессиональны праздником!!! Пусть он будет солнечным и радостным!

[identity profile] febb.livejournal.com 2009-09-13 12:43 pm (UTC)(link)
Спасибо!

[identity profile] artcan.livejournal.com 2009-09-13 06:41 am (UTC)(link)
А тут вот товарищи подсказывают, что нынче еще и День Танкиста!)))
Предлагаю накатить за тех, кто танковыми клиньями взрывает унылый листинг))))

[identity profile] febb.livejournal.com 2009-09-13 12:42 pm (UTC)(link)
Все мы немного лошади танкисты! ^)

[identity profile] kaimira.livejournal.com 2009-09-13 11:01 am (UTC)(link)
Поздравляю с профессиональным праздником!

[identity profile] febb.livejournal.com 2009-09-13 12:42 pm (UTC)(link)
Спасибо!
(deleted comment)

[identity profile] febb.livejournal.com 2009-09-14 01:45 pm (UTC)(link)
спасибо)