一个 URL,一组 Domain List,有没有比遍历一次更方便的方案

2015-12-30 12:08:12 +08:00
 imn1
求: URL 的主域名是否在 Domain List 里面
"https://www.v2ex.com/new/qna"
["github.com", "v2ex.com", "google.com"……]
2101 次点击
所在节点    问与答
16 条回复
pathletboy
2015-12-30 12:15:10 +08:00
正则取出 url 的根域,然后通过 dict/map 查询键是否存在。
jmc891205
2015-12-30 12:18:07 +08:00
二分查找?不过前提是 Domain List 是有序的
GtDzx
2015-12-30 12:21:01 +08:00
Hash...
kaneg
2015-12-30 12:52:10 +08:00
set 就是干这种活的
clino
2015-12-30 13:01:20 +08:00
将 domain list 变成正则然后匹配 也是一种方法 一步搞定
imn1
2015-12-30 13:23:05 +08:00
@kaneg
其实是想问 javascript ,写 UC 脚本碰到

@clino
合成一个长正则? github.com|v2ex.com|google.com ?这是个想法
northisland
2015-12-30 13:23:28 +08:00
@GtDzx 不能支持再多
xufang
2015-12-30 13:30:15 +08:00
Tonni
2015-12-30 13:32:46 +08:00
yingsunwl
2015-12-30 13:36:30 +08:00
AC 状态机, Aho-Corasick string matching algorithm
SoloCompany
2015-12-30 13:42:22 +08:00
字符串查找最快的数据结构理论上应该是状态机查找树,只需遍历一次,但字典变化导致的状态机更新是很麻烦的,而且占用的空间也比较庞大
当然更多场景是使用 hash 查找,同样只需要遍历一次来计算 hash ,无冲突或者少量冲突的话和状态机的效率基本上差不多
clino
2015-12-30 15:56:56 +08:00
@imn1 我之前写的版权扫描工具就是这种方法
https://github.com/zhangchunlin/scancopyright/blob/master/apps/Scan/settings.ini#L14
这里有很多正则表达式,一起拼出一个超大的正则出来
h4x3rotab
2015-12-30 20:04:11 +08:00
正则效率低于 ac 自动机,但是可以现成用, hash 是很好的办法,效率不比 ac 自动机低。具体到 js ,推荐还是 hash 吧,正则这个路子太野了,估计效率低一点,因为正则不是用来做这做事情的。
imn1
2015-12-30 21:05:57 +08:00
@h4x3rotab
请教一下 hash 例子或文章,扔下 js 十多年,现在都变样了
h4x3rotab
2015-12-31 22:39:05 +08:00
@imn1 js 的 hash 就是字典了,只不过只关心 key 存不存在,不关心 value 。比如这样的:
var dic = {}
dic['aaa.com'] = true
var domain = getDomainFromUrl(url)
if (dic[domain]) return true
imn1
2016-01-01 02:48:31 +08:00
@h4x3rotab
原来就是指字典,这个知道是 hash 保存,还一直以为有个 hash 算法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/247151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX