我需要经常在大量排序列表中添加和删除元素。
列表的大小是绑定的,相对较小 - 大约100个元素或更少,每个元素大约为32个字节左右。
如果插入完整列表,则可以丢弃最后一个元素。
我做了一些简单的分析,发现将这些列表存储在数组中并使用memmove在插入点后向移动所有内容时效果出奇的好;甚至比使用固定大小的链表并将尾部链接到插入点更好。 (我猜,永远不要低估空间位置的力量。)
但我认为我可以做得更好。我怀疑我的大部分操作都将接近列表的顶部;这意味着每次插入或删除时我都会记住绝大多数列表。那么如果我将它作为一种环形缓冲区来实现,如果一个操作更靠近顶部而不是底部,我会将最顶层的项目向后移动,旧的尾部会被头部覆盖?理论上,这应该涉及更便宜的memmove调用。
但是我完全按照优雅的方式实现了这一点。列表现在可以环绕,头部位于位置k,尾部位于(k-1)%n(如果列表已满)。所以有可能做三个操作(k是头,m是插入点,n是最大列表大小)。
我不知道这是否比一个更大的memmove更快,但我们会看到。
无论如何,我只是觉得有一种非常聪明和干净的方式通过模运算和三元运算符来实现它。但是,如果没有多个嵌套的“if”语句,我无法想到这样做的方法。
我确信过多的分支会让我用更小的memmoves做出任何改进。这里有一个干净的解决方案我还没有看到吗?