二进制搜索以查找排序列表中的最后一个元素,该元素小于特定值

时间:2015-03-08 22:27:47

标签: python binary-search

我正在搜索包含unixtimes的消息字典,长度为N,我想在任意24小时(86400秒)时间段内找到最大消息数(我称之为频率)。这意味着,如果有五条消息在一个我想要的24小时内有一个unixtime 5.

我想通过二进制搜索来实现这一点,但我对如何最好地实现它以及如果我可以使用一些二进制搜索库有点了解。

这就是我使用10个元素的搜索网格的方式:

        cur.execute('SELECT unixtime FROM MessageType1 WHERE userID ='+str(userID[index])+' ORDER BY unixtime asc')
        AISmessages = cur.fetchall()
        AISmessages = {index:x[0] for index,x in enumerate(AISmessages)}
for nextMessageIndex in range(messageIndex+1, len(AISmessages),10):
    if  AISmessages[nextMessageIndex] < message+(86400):
    #Count the number of occurences
        frequency += 10
    elif AISmessages[nextMessageIndex-5] < message+(86400):
        if AISmessages[nextMessageIndex-2] < message+(86400):
            if AISmessages[nextMessageIndex-1] < message+(86400):
                frequency += 9
            else:
                frequency += 8
        elif AISmessages[nextMessageIndex-3] < message+(86400):
            frequency += 7
        elif AISmessages[nextMessageIndex-4] < message+(86400):
            frequency += 6
        else:
            frequency += 5
    elif AISmessages[nextMessageIndex-7] < message+(86400):
        if AISmessages[nextMessageIndex-6] < mssage+(86400):
            frequency += 4
        else:
            frequency += 3
    elif AISmessages[nextMessageIndex-9] < message+(86400):
        if AISmessages[nextMessageIndex-8]< message+(86400):
            frequency += 2
        else:
            frequency += 1
    else:
        break

我想我也搞砸了这个,但是我不知道怎么做 - 当AISmessages的长度不能被10 f.ex整除时我知道这是不好的

我如何将其标准化为二进制搜索,以便在包含任意数量元素的字典中的24小时时间内提供消息的频率?

1 个答案:

答案 0 :(得分:1)

您可以使用标准库中的bisect。我不确定我是否正确理解了您的问题,但解决方案可能看起来像这样:

frequency = bisect(AISmessages[messageIndex:], message+86400)

示例:这将为您提供列表a中的项目数,其值范围为30,从索引为2的条目开始(假设a已排序):

>>> a = [4, 17, 31, 39, 41, 80, 82, 85, 86, 96]
>>> i = 2
>>> m = a[i] # 31
>>> bisect(a[i:], m+30)
3 # correct: 31, 39, 41