【问题标题】:fast search for integer list in much larger set of longer integer lists在更大的更长整数列表集中快速搜索整数列表
【发布时间】:2016-03-19 18:33:29
【问题描述】:

我正在寻找以下的高效 python 实现:

我有一大组整数列表,长度在 4 到 >100 个整数之间,但长度大多在 4-10 左右。根据数据集的不同,总数可能高达一百万。它们是特定于订单的。整数本身的范围为 0 到

我将输入长度在 3 到 5 个整数之间的搜索列表,再次针对特定顺序。我需要从更大的整数列表集中找到所有示例,其中列表包含输入搜索列表。

例如:示例大型整数列表集 [1,40, 98, 32, 778], [7, 9347, 21, 98345, 632, 444], [87567, 4563, 97, 40, 87], [ 1, 40, 98, 32, 778], [4563, 97, 40, 87, 76], [935, 57342, 86, 213, 89674, 4327, 9641, 13283], [4563, 40, 87, 76, 97]

示例查询 [4563, 97, 40]。

结果 [87567, 4563, 97, 40, 87], [4563, 97, 40, 87, 76] 但不是 [4563, 40, 87, 76, 97]。

我可以将整数列表集存储在 dict 中并搜索查询整数列表的键,但这很慢。我可以将整数列表写入平面文件并使用 grep 搜索它们,这速度很快,但很讨厌。最终,我需要在结果(匹配列表)上运行更多代码,所以我更愿意留在当前的 python 工作流程中。

我知道像 aho corasick 这样的搜索算法,但我使用的是整数而不是文本,我正在做相反的事情(搜索整个字符串以查找子字符串)。

【问题讨论】:

  • 您需要对同一组列表执行单个查询还是多个查询?
  • @YvesDaoust - 对同一组列表的一个或多个查询
  • 查看我对大量查询的回答。对于单个查询,您不能比在每个列表上进行字符串搜索更好(可能是纯蛮力最快的)。

标签: python algorithm list search


【解决方案1】:

首先,我建议你看看https://wiki.python.org/moin/PythonSpeed/PerformanceTips

例如,根据您编写循环的方式,计算时间可能会有很大差异。

以下代码有效...性能的回报???

#Your List of lists
L = [[1,40, 98, 32, 778], [7, 9347, 21, 98345, 632, 444], [87567, 4563, 97, 40, 87], [1, 40, 98, 32, 778], [4563, 97, 40, 87, 76], [935, 57342, 86, 213, 89674, 4327, 9641, 13283], [4563, 40, 87, 76, 97]]

#Your list of search items
query= [4563, 97, 40]


def queryInList(Q,l):
    lidx = []
    for q in Q:
        try:
            lidx.append(l.index(q))
            if lidx[len(lidx)-1] < lidx[len(lidx)-2]:
                return False
        except ValueError:
            return False
    return True



l = [l for l in L if queryInList(query, l)]
print l

【讨论】:

  • 我刚刚测试过:在包含 100 个整数(0-999 之间的整数)的 1 000 000 个列表中搜索 5 个项目的列表需要不到 1 秒的时间,因为随机生成列表需要很长时间大于 1000 的数字)
  • 这仍然需要对整个列表集进行迭代,但我喜欢 try/except 中的快速失败方法。
【解决方案2】:

如果您负担得起存储和预处理时间,您可以插入从三个不同字典中的列表中找到的所有三元组、四元组和五元组。字典条目将存储这些元组出现的列表集,以及列表的位置。

然后查询将在与匹配数量成正比的时间执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多