【发布时间】:2012-09-18 09:12:52
【问题描述】:
假设我有一组排序的双精度数。
{ 0.124, 4.567, 12.3 }
一个正的非零双精度是由代码的另一部分创建的,需要插入到这个集合中,同时保持它的排序。例如,如果创建的double是7.56,那么最终的结果是,
{ 0.124, 4.567, 7.56, 12.3 }
在我的代码中,这个“创建双精度并在排序集中插入”过程会重复很多次。可能 500k 到 100 万次。我不知道总共会创建多少个双打,但我知道上限。
尝试
我天真的第一种方法是创建一个长度 = 上限的数组并用零填充,然后将初始的双精度集添加到其中(“添加”= 用双精度值替换 0 值条目)。每当创建一个 double 时,我将它添加到数组中并进行插入排序,我读到这对于排序有序数组很有用。
问题
我感觉运行 500k 到 100 万个插入插槽将是一个严重的性能问题。 (或者我错了吗?)在 C 中是否有更有效的数据结构和/或算法来执行此操作?
编辑:
我想让集合保持排序的原因是因为在每次“创建双精度并插入排序集合”过程之后,我需要能够查找该集合中的最小元素(并可能通过替换它来删除它带 0)。我认为最好的方法是保持集合排序。
但如果不是这样,也许还有其他选择?
【问题讨论】:
-
如果您要拥有 100 万个条目,也许跳过列表会有所帮助。
-
必须是排序列表吗?这个问题更适合平衡二叉搜索树(或类似的有序树)。
-
@nneonneo - 在每个“创建和插入”过程之后,我需要能够选择集合中最小的双精度数。我认为最好的方法是保持这个集合排序(将编辑以反映这一点)。在这种情况下我可以使用平衡二叉搜索树吗?
-
如果你只需要 smallest double,使用最小堆。这是 O(log n) 插入和 O(1) 最小查询。