Python:在非常大的数字列表中搜索数字列表,允许+或 - 5错误

时间:2014-01-20 22:26:09

标签: python list search match

情况:

我想做一个匹配:检查一个数字是否在一个数字列表中(非常大的列表,长度超过1e ^ 5甚至2e ^ 5)允许+或 - 5错误

实施例: 列表[0,15,30,50,60,80,93]中匹配95 - >真正 匹配列表中的95 [0,15,30,50,60,70,80,105,231,123123,12312314,...] - >假

ps:列表未排序(或者如果以这种方式可以提高效率,我可以对其进行排序)

我尝试使用字典(somekey和数字列表),但是当我在列表中进行搜索时,它太慢了。

有没有更好的想法? (我需要搜索3000多个数字)

4 个答案:

答案 0 :(得分:5)

不对列表进行排序(O(n)时间)

def search(L, x):
    for i in L:
        if -5 <= i-x <= 5:
            return True
    return False

通过排序(O(nlogn)时间排序+ O(登录)时间进行搜索)

def search(L, x):
    L.sort()
    return fuzzyBinSearch(L, x)

def fuzzyBinSearch(L, x):
    mid = len(L)/2
    i = L[mid]
    if if -5 <= i-x <= 5:
        return True
    elif i-x > 5:
        return fuzzyBinSearch(L[mid+1:], x)
    else:
        return fuzzeBinSearch(L[:mid], x)

答案 1 :(得分:2)

如果您需要进行多次搜索,只需创建一个集并在其中搜索

即可
>>> L = [0, 15, 30, 50,60,80,93]
>>> S = {i+x for i in L for x in range(-5, 6)}
>>> 95 in S
True

创建set当然是O(n),但现在查找是O(1)

答案 2 :(得分:1)

我喜欢@ inspectorG4dget的答案,但会反过来:

而不是对长列表进行排序并搜索它(并且必须将其全部保存在内存中),

对短名单(您要查找的数字)进行排序,然后遍历长列表,查看每个项目是否与任何搜索词匹配。

这应该更快并且使用更少的内存。您可能希望使用Python的bisect模块来执行此操作。

答案 3 :(得分:0)

a = set([0, 15, 30, 50,60,80,93])
def match(n):
    return bool({n+i for i in range(-5,6)} & a)
print match(95)

a = set([0,15,30,50,60,70,80,105,231,123123,12312314])
print match(95)