Performance 使用通配符保存字符串的高效数据结构

Performance 使用通配符保存字符串的高效数据结构,performance,algorithm,optimization,data-structures,Performance,Algorithm,Optimization,Data Structures,这个问题几乎是相反的 假设我们有一个包含url的数据库 http://aaa.com/ http://bbb.com/ http://ccc.com/ .... 要查找列表中是否有url,我可以进行二进制搜索,并在O(log n)时间中获得结果,n列表的大小 这种结构多年来一直运行良好,但现在我希望在数据库条目中使用通配符,如: http://*aaa.com/* http://*bbb.com/* http://*ccc.com/ .... 而简单的搜索将导致一次完整的扫描,搜索时间为O(

这个问题几乎是相反的

假设我们有一个包含
url的数据库

http://aaa.com/
http://bbb.com/
http://ccc.com/
....
要查找列表中是否有
url
,我可以进行
二进制搜索
,并在
O(log n)
时间中获得结果,n列表的大小

这种结构多年来一直运行良好,但现在我希望在数据库条目中使用通配符,如:

http://*aaa.com/*
http://*bbb.com/*
http://*ccc.com/
....
而简单的搜索将导致一次完整的扫描,搜索时间为
O(n)


在小于
O(n)
的范围内可以找到哪个数据结构?

如果事先知道所有url,那么您可以构建一个有限自动机,它将解决您在O(url长度)范围内的查询问题

此有限自动机可以构建为regexp:

http://(.*aaa\.com/.*|.*bbb\.com/.*|.*ccc\.com/)$
下面是一些python代码。在re.compile()之后,每个查询都非常快

import re

urls = re.compile("http://(.*aaa\.com/.*|.*bbb\.com/.*|.*ccc\.com/)$")

print urls.match("http://testaaa.com/") is not None
> True
print urls.match("http://somethingbbb.com/dir") is not None
> True
print urls.match("http://ccc.com/") is not None
> True
print urls.match("http://testccc.com/") is not None
> True
print urls.match("http://testccc.com/ddd") is not None
> False
print urls.match("http://ddd.com/") is not None
> False

您仍然可以进行二进制搜索,但可以维护已知url的排序列表,其中的字符串从查询url的后面开始:
http://test.ccc.com/
result
true
http://sascc.com是一个没有点分隔符的有效查询ie吗?您能否将URL拆分为固定数量的字段,其中一个字段可以是野生字段或指定字段?或者您是否需要通配符才能出现在url中的任何位置(例如
http*:/*ca*.c/*/*.html
)?我猜您可能无法
re.compile
一个非常大的字符串:)如果regexp实现无法完成任务,您始终可以自己构建自动机。这样可以更好地控制内存的使用量。