在排序的日期列表中查找新数据的插入位置的最快方法



假设我有一个日期列表:

mydates = [Timestamp('2017-03-31 00:00:00'),
Timestamp('2017-06-30 00:00:00')     
Timestamp('2017-09-30 00:00:00'),
Timestamp('2017-12-31 00:00:00'),
Timestamp('2018-03-31 00:00:00')]

我得到一个新的日期,想知道插入哪个位置。 如果日期已经在列表中,我们假设我们会将其再次插入到现有日期的右侧。

即,'2016-12-10'将入位置 0,留给Timestamp('2017-03-31 00:00:00')等。

通常,查找位置的最佳方法是对数搜索。但细节取决于你拥有什么。

另外,请注意,即使您将搜索从线性时间改进为对数,如果您使用的是listarray等数据结构,则insert仍然需要线性时间(因为它必须向上移动列表的其余部分(。所以你可能优化了错误的东西。

  • 对于非常小的集合,例如 5 个值的list,最好只使用线性搜索。
  • 如果你在一个阶段完成了几乎所有的插入,然后在集合之后几乎所有的搜索大部分都已经构建好了,只需收集所有内容set.addlist.append,然后在阶段结束时sort它。这仍然是有效(摊销(的对数时间,但乘数要好得多。
  • 对于list或其他普通Sequence,请使用 stdlib 中的bisect
  • 对于 numpyarray,或者像熊猫Series这样建立在它上面的东西:使用 numpy 的searchsorted。(如果你存储一堆 PandasTimestamp对象,你可能应该使用这些数据结构之一而不是list,如果你还没有的话。
  • 如果你要做大量的插入(和删除?(与查找交错,你可能希望切换到对数数据结构。这里有很多选择,但像blist这样的东西是一个很好的起点。

如果您有排序列表,则可以插入新日期并对结果进行排序。您也可以使用平分。

最新更新