我需要找到某个活动发生的月份的所有日子。活动发生的日子将是连续的。日期的顺序可以从一个月到整个月,并且序列将每月恰好发生一次。
测试活动是否在任何一天发生并不是一个昂贵的计算,但我想我会用这个问题学习一些新东西。哪种算法最小化了我必须测试的天数?
答案 0 :(得分:5)
你不能比迭代序列找到第一个匹配,然后迭代直到第一个非匹配更好。您可以使用itertools
使其变得美观和可读:
itertools.takewhile(mytest,
itertools.dropwhile(lambda x: not mytest(x), mysequence))
答案 1 :(得分:2)
最好的方法取决于您的输入数据结构。如果您的输入数据结构是每月每天的布尔列表,那么您可以使用以下代码。
start = activity.find(True)
end = activity.rfind(True)
答案 2 :(得分:2)
我认为@isbadawi建议的线性探测是找到子序列开头的最佳方法。这是因为子序列可能非常短,可能在较大序列中的任何位置。
但是,一旦找到子序列的开头,我们就可以使用二进制搜索来查找它的结尾。这将比进行第二次线性探测所需的测试少,因此对您来说这是一个更好的解决方案。
正如其他人所指出的那样,没有太多实际的理由这样做。这是正确的,原因有两个:你的大序列很短(只有大约31个元素),你仍然需要至少做一个线性探测,所以big-O运行时在大的长度上仍然是线性的序列,即使我们已将算法的一部分从线性减少到对数。