最快的整数排序实现200-300位整数
fastest integer sort implementation for 200-300 bit integers?
对于200-300位大小的整数,最快的整数排序实现是什么?int的精确大小是固定的;我有多达2gb的这样的整数(全部在RAM中)。
我听说有可能在O(n log log M)甚至O(n√(log log M))时间内对这样的集合进行平均排序,其中n为整数个数,M为最大整数。内存使用是有限的(我可能会额外使用0.5-1 GB)。分拣可以就地完成;In可能是不稳定的(重新排序dup)。
是否有这样的排序方法的C/c++实现,例如Han &Thorup (2002) ?
基数排序可用于对具有固定大小键的数据排序。由于不经常满足此条件,因此对该技术的讨论不多,但是当将密钥大小分解时,它可以是O(n)。
如果内存使用确实有限。我将把每个字节分开,并将它们存储到一个trie数据结构中,从最高有效字节到最低有效字节。如果您按排序顺序插入字节,则可以迭代该树并对所有数据进行排序。
签名排序对于具有'O (n lglgn)'预期时间复杂度的大字长很好,但是对于较小的字长,您可以获得与von Emde Boas排序相同的复杂度。最近,Han和Thorup发表了更快的排序算法,其预期时间复杂度为"O (n√t(lglgn))"。我不确定你是否能在网上找到这些算法的实现,但在麻省理工学院和哈佛大学可能有一些很棒的文章和讲座。
我认为最合理的做法是创建一个指向大整型的指针数组,并对指针数组进行排序。我建议使用模板化的快速排序,带有智能比较功能。
compare函数应该能够在大多数情况下通过查看最重要的4字节来决定。如果它们不匹配,则决定比较。如果它们匹配,则查看后面的4个字节,直到int.
结束。我猜数据范围可能足够大,基数排序将是不切实际的。如果数据是随机的,快速排序通常足够快,并且具有优于大多数非基数排序的缓存性能。
- 如何实现容纳整数和无效指针的双向链表?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 独立于实现的浮点/整数转换
- c++反向整数序列实现
- 为什么这个新的 [ ] 和删除 [ ] 实现会分解为 12 >整数?
- 整数到字符实现
- 如何使用 c++ 模板实现整数、字符串、浮点数和日期对象的数组
- 整数序列实现C++
- 如何将自己的链表实现从存储整数更改为存储个人数据
- 实现整数除法向上舍入的正确方法是什么?
- 有符号整数和无符号整数C++的实现差异
- 如何从uint8_t的缓冲区读取带符号整数,而不调用未定义或实现定义的行为
- 使用递归实现 pow(A, B) % C,其中 A、B 和 C 是正整数
- 在C++中实现 CTR 加密模式时,CTR 加上 64 位整数
- 快速实现大整数计数器(在C/C 中)
- 在C++11中实现共享整数计数器而不使用互斥的最简单方法:
- 如何使用 C++11 实现指向整数的指针的原子增量<atomic>?
- C - 仅使用未签名整数实现QuickSort
- 高效实现 64 位和 32 位无符号整数之间的双向映射
- 枚举在内部作为整数实现.那为什么会给出错误