Re: быстpая соpтиpовка
- From
- Oleg Khovayko ()
- To
- Andrew Ezhguroff
- Date
- 2002-12-27T06:07:41Z
- Area
- RU.ALGORITHMS
From: Oleg Khovayko <olegh@hotpop.com>
Andrew Ezhguroff wrote:
> Но рекурсия все же нужна. И, следовательно, дополнительная память для
> организации рекурсии нужна (так что в п.3 ты не прав).
При программировании микроконтроллеров обычно подразумеваются
раздельные секции кода, данных, стека, I/O page. И обычно они никак не
пересекаются, тем более, что секция кода вообще лежит в ПЗУ.
Именно это я и подразумевал в п.3, когда писал "память данных".
Там я подразумевал, что стек болтается в своем сегменте, и с данными
не перемешивается.
Извини, если невнятно обьяснился.
> Пирамидальная сортировка обеспечивает O(N*log(N)) для любых данных (правда с
> большим коэф. пропорциональности - она работает медленнее лучшего случая
> быстрой сортировки) и не требует рекурсии и дополнительных массивов.
Да я же не спорю. Побитовая сортировка тоже имеет свои недостатки.
Но в данном конкретном применении - а именно "16-и разрядные числа в
8-битовой машине" - она демонстрирует некоторые преимущества, связаные с
возможность "уполовинивать" сортируемые слова.
Так, например, если на данном этапе идет сортировка по биту 8..15
(старший байт), то для проверки битмаски не обязательно затаскивать в
процессор из памяти все слово целиком в два присеста (старший байт, а
потом младший байт). Достаточно втянуть только старший, байт, наложить
на него маску, а потом решать - переходить ли к след. элементу массива
(ежели маска не сработала), или же заниматься этим словом целиком.
Таким образом, при побитовой сортировке на данном этапе сравниваются
только старшие байты, а переставляются (только когда надо) младшие со
старшими, то есть слова целиком. То есть обращение к младшим байтам
сортируемых слов идет только для их перестановки - в сравнении они не
учавствуют.
Аналогичное упрощение можно получить на этапе сортировки по биту из
младшего байта. Так как старший байт уже отсортирован, то в текущем
подмассиве все биты, старше чем маска, у всех элементов одинаковы.
Это позволяет вообще не трогать старший байт, а свести и сравнения, и
перестановки 16-битовых слов к сравнениям/перестановкам младших байтов
этих слов.
Если же учесть, что в таких примитивных микроконтроллерах аппаратного
сравнения 16-битных слов обычно не бывает (я не знаю, есть ли это в
конкретной железке "заказчика"), а оно делается путем вызова
спец. функции, то замена сравнения слов сравнением байтов (которое
аппаратно везде есть) также даст хороший выигрыш в скорости.
Я оцениваю суммарный выигрыш по скорости от всех трех описаных выше
"байт-модификаций" где-то в 30..50%. И этот выигрыш можно получить
только при поразрядной сортировке, когда сравнивается/переставляется
не все слово целиком. Все остальные способы сортировки (кроме
radix-sort), в том числе и heap-sort рассматривают сравниваемое
слово как атомарный обьект, и с "кусочками ключей" не работают
принципиально. Поэтому фокусы типа вышеописаных там принципиально
не могут быть примененны.
Покроет ли выигрыш в скорости от уполовинивания ключей потери памяти
от использования стека - заказчику решать. Он лучше меня знает,
сколько у него еще есть доступной памяти.
Я свое мнение высказал и обосновал. А дальше пусть заказчик думает,
что ему лучше.
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)