Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Float Sort

Boost , Boost.Sort , Spreadsort

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

<float_sort>- это быстрый шаблонный алгоритм гибридного радикса / сравнения, очень похожий на<integer_sort>, но сортирует числа с плавающей точкой IEEE (положительные, нулевые, NaN и отрицательные) в восходящий порядок, отбрасывая их в целые числа. Это работает потому, что положительные числа с плавающей точкой IEEE сортируются как целые числа с одинаковыми битами, а отрицательные числа с плавающей точкой IEEE сортируются в обратном порядке целых чисел с одинаковыми битами. float_sort примерно в 2 раза быстрее, чем std::sort.

-0,0 vs. 0.0 и NaN получают определенные упорядоченные позиции на основе радикса, где сортировка на основе сравнения не гарантирует их относительное положение. Включенные тесты избегают создания NaN и -0.0, чтобы результаты соответствовали std::sort, что не согласуется с тем, как он обрабатывает эти числа, поскольку они сравниваются как равные числам с различными значениями.

float_sort проверяет размер типа данных и является ли он литейным, выбирая целочисленный тип для литья, если пользователь не предоставляет функтор литья.

float_mem_cast отбрасывает числа IEEE с плавающей точкой (положительные, нулевые, NaN и отрицательные) в целые числа. Это важная утилита для создания пользовательского функтора правого смещения для float_sort, когда он нужен. Только числа с плавающей запятой IEEE того же размера, что и отлитый целочисленный тип, должны использоваться в этом специализированном вызове метода. Наихудшая производительность& #119926; (N * (log2 (диапазон) / с + с)), так что<float_sort>асимптотически быстрее, чем чистые алгоритмы на основе сравнения.smax_splits, который по умолчанию 11, поэтому его худший случай с настройками по умолчанию для 32-битных целых чисел& #119926; (N * ((32/11))медленные итерации на основе радикса + 11 быстрых итераций на основе сравнения.

Некоторые графики производительности runtime vs. n и log2(range) приведены ниже:

Windows Float Sort

OSX Float Sort

См.floatfunctorsample.cppдля рабочего примера того, как сортировать структуры с помощью поплавкового ключа:

#define CAST_TYPE int
#define KEY_TYPE float
struct DATA_TYPE {
    KEY_TYPE key;
    std::string data;
};

Функтор правой смены:

// Casting to an integer before bitshifting
struct rightshift {
  int operator()(const DATA_TYPE &x, const unsigned offset) const {
    return float_mem_cast<KEY_TYPE, CAST_TYPE>(x.key) >> offset;
  }
};

Сравнение меньше, чем<operator<>функтор:

struct lessthan {
  bool operator()(const DATA_TYPE &x, const DATA_TYPE &y) const {
    return x.key < y.key;
  }
};

Другие примеры:

Удваивается.

Сортировка плавает с использованием фанктора правого смещения.


PrevUpHomeNext

Статья Float Sort раздела Boost.Sort Spreadsort может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Spreadsort ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:26:56/0.0065381526947021/0