首页 > 其他分享 >黑名单查询:前缀树

黑名单查询:前缀树

时间:2023-02-15 21:55:21浏览次数:47  
标签:__ cur self od 黑名单 next time 查询 前缀

引入

我现在有一份黑名单数据,里面有10000条域名,现在需要编写一个算法,快速判断一个域名在不在这个黑名单里,怎么设计这个算法?

字典树 or 前缀树

前缀树是N叉树的一种
根节点表示空字符串
重要操作是insert和search

参考

https://blog.csdn.net/qq_41967784/article/details/127648494
这个文章里面只做了26个字母的前缀树,其实把数组长度设为128就可以覆盖所有ASCII字符

代码

import time
class trie():
    def __init__(self):
        self.next = [None]*128
        self.isend = False

    def insert(self, word: str) -> None:
        cur = self
        for c in word:
            od = ord(c)
            if(cur.next[od] is None):
                cur.next[od] = trie()
                cur = cur.next[od]
            else:
                cur = cur.next[od]
        cur.isend = True

    def search(self, word) -> bool:
        cur = self
        for c in word:
            od = ord(c)
            
            if(cur.next[od] is None):
                return False
            else:
                cur = cur.next[od]

        return cur.isend

def main():
    t1 = trie()
    f = open("blacklist.txt", "r")
    line = f.readline()
    while line:
        t1.insert(line)
        line = f.readline()
        # print(line,end="")
    f.close()
    start = time.time()
    for i in range(1000000):
        t1.search("warnerbros.com/web/steppenwolf\n")
    end = time.time()
    print("time usage: %d s"%(end-start))

if __name__ == "__main__":
    main()

前缀树的应用

可以用来做自动补全,即Tab补全
可以用来做敏感词过滤、黑名单过滤等

标签:__,cur,self,od,黑名单,next,time,查询,前缀
From: https://www.cnblogs.com/studentWangqy/p/17124866.html

相关文章

  • MybatisPlus查询条件设置详解
    select设置需要查询的字段例: 指定查询主键,名字,年龄字段select("id", "name", "age")例: 查询以test开头的属性select(i ‐> i.getProperty().startsWith("t......
  • 860~808 复杂条件查询分析,代码实现
    复杂条件查询分析:  代码实现packagecom.example.web.servlet;importcom.example.domain.PageBean;importcom.example.domain.User;importcom.example.servi......
  • 分页查询功能_代码实现_后台代码实现与分页查询功能_代码实现_前台代码实现
    分页查询功能_代码实现_后台代码实现packagehf.xueqiang.web.servlet;importhf.xueqiang.domain.PageBean;importhf.xueqiang.domain.User;importhf.xueqiang.se......
  • 多表查询
    --显示雇员名字、工资以及所在部门的名字--在默认情况下,当两个表查询时,规则:--1.从第一张表中,取出一行,与第二张表的每一条记录进行拼接--2.总返回记录数:第一张表记......
  • 多子句查询
    --多子句查询顺序SELECTcolumn1,column2,...FROMmytable GROUPBYcolumnx HAVINGconditionx ORDERBYcolumnx LIMITstartx,rowsx;--统计各个部门平均工......
  • 通用查询语言(GQL)
    在微服务开发中,经常遇到各种查询的需求,不同接口还有不同的查询方式,为了统一不同模型,不同筛选条件,动态筛选,复合条件筛选等各种场景查询方式,无需改代码支持不同场景下的查询......
  • (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第四节:数据查询
    pdf下载:密码7281专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解关于数据库如何安装,表如何建立这里不再介绍,请......
  • MySQL中,把查询的结果拼接成一个字符串。
    用法:group_concat(待拼接对象)输出:用逗号进行拼接后的字符串selectgroup_concat(emp_no)asemployeesfromdept_emp;  /*结果:employees       ......
  • AWS Lambda 查询 Redshift Serverless
    在应用程序中,经常在Lambda中调用redshiftdataapi去查询redshiftserverless的数据,以下描述具体实现过程:1:给Lambda创建一个执行Lambda的IAMRole,并具有访问redshift......
  • 前缀树
    1.简介字典树也称为前缀树、单词查找树。其基本性质如下:根节点不包含字符,除根节点外每一个节点都只包含一个字符从根节点到某一结点,路径上经过的字符连接起来,为该节点......