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

时间:2018-05-10 20:46:02

标签: python search insert

我们假设我有一份日期清单:

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')等。

2 个答案:

答案 0 :(得分:2)

一般来说,找到位置的最佳方法是对数搜索。但细节取决于你拥有的东西。

另外,请注意,即使您将搜索从线性时间改进为对数,如果您使用的数据结构如partitionlistarray仍然会继续采取线性时间(因为它必须移动列表的其余部分)。所以你可能正在优化错误的东西。

  • 对于非常小的集合,例如5个值中的insert,您最好只使用线性搜索。
  • 如果您在一个阶段中执行了几乎所有的插入操作,然后几乎所有的搜索都在收集后,那么只需使用listset.add收集所有内容,然后{ {1}}它在阶段结束时。这仍然是有效(摊销)的日志时间,但具有更好的乘数。
  • 对于list.append或其他普通sort,请使用stdlib中的bisect
  • 对于一个numpy list,或者像pandas Sequence一样构建在它上面的东西:使用numpy的searchsorted。 (如果你要存储一堆Pandas array对象,你可能应该使用其中一个数据结构而不是Series,如果你还没有。)
  • 如果您正在进行大量与查找交互的插入(和删除?),您可能需要切换到对数数据结构。这里有很多选项,但像blist之类的东西是一个很好的起点。

答案 1 :(得分:1)

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