我的算法适用于动态增长的列表(连续内存,如 C++ 向量、Java ArrayList 或 C# 列表)。直到最近,这些算法才会将新值插入到列表的中间。当然,这通常是一个非常缓慢的操作。每次添加一个项目时,它之后的所有项目都需要移动到更高的索引。对每个算法都这样做几次,事情变得非常缓慢。
我意识到我可以将新项目添加到列表的末尾,然后稍后将它们旋转到位。这是一种选择!
另一种选择是,当我提前知道要添加多少项目时,将那么多项目添加到后面,移动现有项目,然后在我为自己制作的孔中就地执行算法。不利的是,我必须在列表末尾添加一些默认值,然后覆盖它们。
我对这些选项进行了快速分析,并得出结论认为第二个选项更有效。我的理由是第一个选项的轮换将导致就地交换(需要临时)。我对第二个选项的唯一担心是我正在创建一堆被丢弃的默认值。大多数情况下,这些默认值将是 null 或 mem 填充的值类型。
但是,我希望其他熟悉算法的人告诉我哪种方法更快。或者,也许还有一个我没有考虑过的更有效的解决方案。