首页 > 编程语言 >前缀树(Tire)—Python

前缀树(Tire)—Python

时间:2022-12-18 15:35:06浏览次数:40  
标签:node 前缀 Tire Python self offset path ord children

核心思想

空间换时间,是一种用于快速减速的多叉树结构,利用字符串的公共前缀来降低时间

优缺点:

优点:查询效率高,减少字符比较

缺点:内存消耗较大

每次都会从头向下一直到字符串结尾

前缀树

1 单个字符串从前到后加到一棵多叉树上

2 每隔字符串都会有自己所在节点的两个属性path和end,path代表经过,end代表这个字符结尾

3 所有的插入操作都是一样的插入方式,有就复用没有就新开辟一条路

4 经过节点path += 1 ;每个字符串结尾 end += 1

5 可以快速查询前缀和完全匹配的数量

画图解释

如图所示 我们插入第一个字符串“abc”,从a开始,没有a就开辟一个a的路把经过的地方都标记path += 1

 

结果相同方式遍历b和c,最后c结果end +=1

 

 

 相同的方式插入ab,每次都会从头开始第一个起始点path += 1,a存在a的path += 1,b也存在b的path +=1 ,b是结尾所以b的end +=1

实现

两种方式实现,第一种会用列表来储存,一种会用字典来储存

实现方式都一样,看会一种即可。

第一种

class Trie:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.children = [None] * 26
        self.path = 0
        self.isEnd = 0

    def insert(self, word: str) -> None:
        """
        Inserts a word into the trie.
        """
        node = self
        node.path += 1
        for ch in word:
            offset = ord(ch) - ord('a')
            # node.path += 1
            if not node.children[offset]:
                node.children[offset] = Trie()
            node = node.children[offset]
            node.path += 1

        node.isEnd += 1

    def startsWith(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if not node.children[offset]:
                return None
            node = node.children[offset]

        return node.path

    def search(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if not node.children[offset]:
                return None
            node = node.children[offset]

        return node.isEnd

第二种

class Trie:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.children = dict()
        self.path = 0
        self.isEnd = 0

    def insert(self, word: str) -> None:
        """
        Inserts a word into the trie.
        """
        node = self
        node.path += 1
        for ch in word:
            offset = ord(ch) - ord('a')
            if offset not in node.children:
                node.children[offset] = Trie()
            node = node.children[offset]
            node.path += 1

        node.isEnd += 1

    def startsWith(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if offset not in node.children:
                return None
            node = node.children[offset]

        return node.path

    def search(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if offset not in node.children:
                return None
            node = node.children[offset]

        return node.isEnd

标签:node,前缀,Tire,Python,self,offset,path,ord,children
From: https://www.cnblogs.com/yetangjian/p/16990426.html

相关文章

  • Python-批量计算城市热岛强度(Urban Heat Island Intensity, UHII)
    数据准备城市热岛强度(UrbanHeatIslandIntensity,UHII)表示热岛效应的发生程度,在本文中将UHII定义为建成区块平均地表温度与其缓冲区平均地表温度的差值.计算公式......
  • PYTHON 模块 - configparser
    1.1configparser模块这个模块是用于解析配置文件1.1.1配置文件的格式[section]key=valuekey=value...[section]key=valuekey=value...1.2读取信......
  • 【python入门】第一章+第2章
    知识点#为注释注意缩进不需要分号进行断句#大数运算print(12345678910111213*987654321011)#乘法运算print("python从入门到入土\n"*3)#p2_1.py"""---......
  • IOS+Appium+Python自动化全实战教程
    背景由于公司的产品坐落于不同的平台,如ios、mac、Android、windows、web。因此每次有新需求的时候,开发结束后,留给测试的时间也不多。此外,一些新的功能实现,偶尔会影响其他......
  • Python学习笔记--函数来啦!
    函数函数,就是组织好的,可重复使用的,用来实现特定功能的代码块实际的小案例:不使用内置函数len,利用函数知识计算出字符串的长度实现:函数的基础定义语法案例:自动查核......
  • Python中的魔法方法
    python中的魔法方法是一些可以让你对类添加“魔法”的特殊方法,它们经常是两个下划线包围来命名的Python的魔法方法,也称为dunder(双下划线)方法。大多数的时候,我们将它们......
  • 自动提取土壤线-基于Python
    以前上遥感课写的记录,我把它搬到这里,错误也有参考的意义。背景和意义土壤在可见光波段(R)与近红外波段(NIR)的反射率具有线性关系,在R-NIR通道的二维坐标中,土壤光谱......
  • PYTHON 模块 - logging
    1.1loggin日志模块用print函数要想同时输出日志信息和时间、所在函数、所在线程等内容是比较困难的。,可以用loggin模块,它是内置的模块。1.2日志级别一共有五个极别,从......
  • Python 为什么如此设计?
    大概两年半前,我萌生了要创作一个新的系列文章的想法,也就是“Python为什么”,试图对Python的语法及特性提出“为什么”式的问题,以此加深对它的理解,探寻使用技巧、发展演变......
  • 短网址解析长网址python示例
    做可视化比较麻烦我就没做,用文件处理的,这里需要两个文件1、readUrl.txt文件保存需要解析的字符串2、newUrl.txt文件保存解析完成的字符串目录​​readUrl.txt文件示例​​​......