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/
resulttrue
http://sascc.com是一个没有点分隔符的有效查询ie吗?您能否将URL拆分为固定数量的字段,其中一个字段可以是野生字段或指定字段?或者您是否需要通配符才能出现在url中的任何位置(例如http*:/*ca*.c/*/*.html
)?我猜您可能无法re.compile
一个非常大的字符串:)如果regexp实现无法完成任务,您始终可以自己构建自动机。这样可以更好地控制内存的使用量。