我有一组双精度数据,需要始终按顺序排序。在添加数据时,最好的排序算法是什么?
所谓“最好”,是指数据数量的大O表示法尽可能小,最坏情况下数据数量的小O表示法尽可能小,并且空间需求尽量小,如果可能的话,按照这个顺序。
数据集大小非常不确定,从少量数据(30)到大量数据(+10M)。
我有一组双精度数据,需要始终按顺序排序。在添加数据时,最好的排序算法是什么?
所谓“最好”,是指数据数量的大O表示法尽可能小,最坏情况下数据数量的小O表示法尽可能小,并且空间需求尽量小,如果可能的话,按照这个顺序。
数据集大小非常不确定,从少量数据(30)到大量数据(+10M)。
node *find_index(node *root, int i) {
while (node) {
if (i == root->left_count)
return root;
else if (i < root->left_count)
root = root->left;
else {
i -= root->left_count + 1;
root = root->right;
}
}
return NULL; // i > number of nodes
}
在 Debian 的 libavl 中可以找到支持此功能的实现;不幸的是,维护者的网站似乎已经关闭,但可以从 Debian 的服务器 检索到。
用于数据库程序索引的结构是B+树。它是一个平衡的桶式n叉树。
对于一个具有h级索引的b阶B+树:
好的,您想要对数据进行排序,但需要通过索引号提取数据。
从基本的树结构开始,例如前面提到的红黑树。
修改树算法,使得在将元素插入树中时,所有遇到的节点都会在插入和删除过程中保持每个分支下元素数量的计数。
然后,在从树中提取数据时,您可以在计算索引号时实时计算,并根据索引号是大于还是小于正在提取的索引号来确定应该选择哪个分支。
还有一点需要考虑。在使用动态内存分配的树中,10M个以上的元素会吸收大量的内存开销。也就是说,指针可能占用比实际数据更多的空间,再加上用于实现数据结构的其他成员。这将导致严重的内存碎片化,并在最坏的情况下降低系统的整体性能(在虚拟内存中来回传输数据)。您可以考虑实现块和动态内存分配的组合。将树结构按数据块进行排序,从而减少内存开销。
如果您只需要像评论中所说的那样知道第i个最小元素,请使用BFPRT算法,该算法以作者的姓氏命名:Blum,Floyd,Pratt,Rivest和Tarjan,并且通常被认为是同一篇论文中最大的计算机科学大脑集中体现。 O(n)最坏情况。