首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用通配符保存字符串的有效数据结构

使用通配符保存字符串的有效数据结构
EN

Stack Overflow用户
提问于 2014-12-23 17:39:51
回答 1查看 175关注 0票数 2

这个问题几乎与Efficient data structure for word lookup with wildcards相反。

假设我们有一个urls数据库

代码语言:javascript
复制
http://aaa.com/
http://bbb.com/
http://ccc.com/
....

要查找列表中是否有url,我可以创建一个binary-search,并在O(log n)时间内得到结果,即列表的大小。

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

代码语言:javascript
复制
http://*aaa.com/*
http://*bbb.com/*
http://*ccc.com/
....

而朴素的搜索将导致一个完整的扫描与O(n)时间的发现。

哪种数据结构可以在小于O(n)的地方找到?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-23 18:31:47

如果所有的url都事先知道,那么您只需构建一个有限的自动机,这将解决您的问题,查询的O(url长度)。

这个有限自动机可以作为regexp构建:

代码语言:javascript
复制
http://(.*aaa\.com/.*|.*bbb\.com/.*|.*ccc\.com/)$

这里有一些python代码。在re.compile()之后,每个查询都非常快。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27625372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档