假设我有一个日期列表:
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')
等。
通常,查找位置的最佳方法是对数搜索。但细节取决于你拥有什么。
另外,请注意,即使您将搜索从线性时间改进为对数,如果您使用的是list
或array
等数据结构,则insert
仍然需要线性时间(因为它必须向上移动列表的其余部分(。所以你可能优化了错误的东西。
- 对于非常小的集合,例如 5 个值的
list
,最好只使用线性搜索。 - 如果你在一个阶段完成了几乎所有的插入,然后在集合之后几乎所有的搜索大部分都已经构建好了,只需收集所有内容
set.add
或list.append
,然后在阶段结束时sort
它。这仍然是有效(摊销(的对数时间,但乘数要好得多。 - 对于
list
或其他普通Sequence
,请使用 stdlib 中的bisect
。 - 对于 numpy
array
,或者像熊猫Series
这样建立在它上面的东西:使用 numpy 的searchsorted
。(如果你存储一堆 PandasTimestamp
对象,你可能应该使用这些数据结构之一而不是list
,如果你还没有的话。 - 如果你要做大量的插入(和删除?(与查找交错,你可能希望切换到对数数据结构。这里有很多选择,但像
blist
这样的东西是一个很好的起点。
如果您有排序列表,则可以插入新日期并对结果进行排序。您也可以使用平分。