PHP-Trie树应用

简介: PHP-Trie树应用

一、Trie树简介



什么是Trie树?  


Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。   Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。


Trie树基本性质:  


1、根节点不包含字符,除根节点外每一个节点都只包含一个字符。   2、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。   3、每个节点的所有子节点包含的字符都不相同。


二、Trie树操作



插入操作示例:


class TTrie
{
    private $dict = [[]]; //字典
    private $input = 0; //字符串当前偏移
    private $backtracking = 0; //字符串回溯位置
    private $buffer = [];
    public function __construct($words)
    {
        $this->insert($words);
    }
    /**
     * 插入单词
     * Function insert
     * @Author sakmon
     * @CreateTime 2019/4/25 15:42
     * @param $word
     */
    public function insert($word)
    {
        if (is_array($word)) {
            foreach ($word as $v) {
                $this->insert($v);
            }
            return;
        }
        $p = count($this->dict);
        $cur = 0; //当前节点号
        foreach (str_split($word) as $c) {
            if (isset($this->dict[$cur][$c])) { //已存在就下移 , 相同前缀单词同一个节点
                $cur = $this->dict[$cur][$c];
                continue;
            }
            $this->dict[$p] = []; //创建新节点
            $this->dict[$cur][$c] = $p; //在父节点记录子节点号
            $cur = $p; //把当前节点设为新插入的
            $p++;
        }
        $this->dict[$cur]['isWord'] = true; //一个词结束,标记叶子节点
    }
}


字典树生成示例:



         


单词查找示例:


/**
     * 单词查找
     * Function find
     * @Author sakmon
     * @CreateTime 2019/4/25 17:24
     * @param $word
     * @return bool
     */
    public function find($word)
    {
        $len = strlen($word);
        $p = 0;
        for ($i = 0; $i < $len; $i++) {
            $c = $word{$i};
            if (!isset($this->dict[$p][$c])) { //节点不存在
                return false;
            }
            $p = $this->dict[$p][$c]; //子节点
        }
        if (!isset($this->dict[$p]['isWord'])) {  //判断是否为单词,避免相同前缀
            return false;
        }
        return true;
    }

删除单词:

 

/**
     * Function remove
     * @Author sakmon
     * @CreateTime 2019/4/26 11:54
     * @param $word
     */
    public function remove($word)
    {
        if (!$this->find($word)) { //先判断单词是否存在
            return false;
        }
        $len = strlen($word);
        $p = 0;
        $del = []; //需删除的相关联键
        for ($i = 0; $i < $len; $i++) {
            $c = $word{$i};
            $cur = $this->dict[$p][$c]; //子节点
            if (count($this->dict[$cur]) == 1) {
                $del[] = [$p, $c];
            } else {
                $del = [];
            }
            $p = $cur; //子节点
        }
        foreach ($del as $key => $val) {
            unset($this->dict[$val[0]][$val[1]]);
        }
        if (count($this->dict[$p]) == 1) { //判断叶子是否只有一个元素,即isWord
            unset($this->dict[$p]);
        } else {
            unset($this->dict[$p]['isWord']);
        }
        return true;
    }

三、Trie树应用



/**
     * Function match
     * @Author sakmon
     * @CreateTime 2019/4/25 18:03
     * @param $s
     * @return array
     */
    public function match($s)
    {
        $cur = 0; //当前节点,初始为根节点
        $i =& $this->input; //字符串当前偏移
        $p =& $this->backtracking; //字符串回溯位置
        $len = strlen($s);
        $dl = 0;
        while ($i < $len) {
            $c = $s{$i};
            if (isset($this->dict[$cur][$c])) { //如果存在
                $cur = $this->dict[$cur][$c]; //转到对应的位置
                if (isset($this->dict[$cur]['isWord'])) { //是叶子节点,单词匹配!
                    $dl = $i - $p + 1; //最长匹配单词长度
                }
                if (isset($this->dict[$cur][$s[$i + 1]])) {//检查下一个字符是否也能匹配,长度优先
                    $i++;
                    continue;
                }
                if ($dl > 0) { //匹配单词成功
                    $this->buffer[] = substr($s, $p, $dl); //取出匹配位置和匹配的词
                    $i = $p + $dl - 1;
                    $p = $i + 1;
                    $dl = 0;
                } else {
                    $p = $i + 1; //设置下一个回溯位置
                }
                $cur = 0; //重置当前节点为根节点
            } else { //不匹配
                $cur = 0; //重置当前节点为根节点
                $i = $p; //把当前偏移设为回溯位置
                $p = $i + 1; //设置下一个回溯位置
            }
            $i++; //下一个字符
        }
        return $this->buffer;
    }


字符串检索示例 :


include_once('keywords.php');
$words = array_column($keywords , 'word');
$trie = new TTrie($words);
//$matches = $trie->match('近年来,厦门聚焦发展电子信息、装备制造等五大产业集群,重点打造平板显示、半导体和华秋集成电路等12条千亿产业链,日前厦门发改委发布其招商地图及投资机会清单,对华强半导体与集成电路领域作出招商引资规划。');
$matches = $trie->match('
5G究竟会给全球带来怎样的影响力?为何号称全球第一的美国屡屡对一中国企业处处压制,而不惜采用各种手段抹黑且极力阻止其开拓市场。这些行为对华为后面有何影响,勇敢的华为会否赢得5G跑道的比赛?
重大事件回顾
去年12月,加拿大当局逮捕了华为首席财务官孟晚舟,以便向美国政府提出引渡请求。美国政府声称该公司通过隐瞒伊朗支付违反对该国的制裁来欺骗几家银行。
今年1月,司法部宣布对该公司的两个部门提出一系列指控,包括窃取T-Mobile USA的商业机密。同时,美国特朗普政府通过2019年的国防授权法禁止华为和中兴参与美国政府的大部分项目合作。
5月2日~3日,以美国特朗普政府为首,加拿大、澳大利亚、以色列、部分欧盟成员国(德国、法国、英国等)以及日本和韩国等30个国家在布拉格举行5G网络安全协议,并发布名为“布拉格提议”的声明。其中意味不言而喻,剑指中国华为。
5月15日,美国特朗普签署行政命令。其内容用意一句话来概括就是将华为列入黑名单,禁止其电信设备进入美国市场。该文件发布后,又将华为旗下70个子公司列入美国贸易黑名单。
华为为何受“照顾”
5g技术的重要性不言而喻,它将为我们社会带来全新的繁荣。它将促发各行各业许多新的东西,如远程医疗、自动驾驶、智慧城市、智慧工业等,以及赋予我们身边很多最基础的设施,如配电。这将使得它会成为我们生活中非常重要的一个部分。
然而,5G技术的竞争已经在进行中,而华为公司已经处于全球领先的地位。这一点或许是美国害怕和担心的。害怕的是一旦使用外国网络设备导致未来一些不可控因素的发生;担心的是5G领域已经落后于中国,美国全球5G影响力地位下降。
而这些所谓的“害怕”,华为已经多次强调并解释。过去三十年,华为一直保持良好的网络安全记录。去年年底华为追加投入20亿美元的初始专项预算升级网络系统软件。
但挥不去地总不是这些阴影,而是背后的“阴谋”。最近,美国官员一直以“网络安全”为由,禁止华为与美国政府签订合同,并敦促美国盟友也效仿。但是至今为止除了澳大利亚和日本以外,他们遭到了许多海外盟友的怀疑。
正如今天许多媒体报道的那样,美国特朗普政府15日再次挥舞权利的大棒意图遏制华为。不管是去年12月的孟晚舟被羁押事件,还是周三特朗普签署的行政命令,其意图已相当明显。
外界认为,不管是华为、爱立信,诺基亚和三星......,无论美国选择谁?都不该将政治权利导入商业竞争。
对华为影响如何?
然而,更大的担忧可能是美国将华为列入美国商务部工业和安全局(BIS)所谓的实体名单。这意味着美国公司需要获得相关许可才能向华为出售或转让技术。而华为依赖英特尔和高通等美国公司的部分组件来生产智能手机和笔记本电脑。
此外,华为的消费者业务现在是收入最大的部门,占其总营收48.4%,被视为该公司的主要成长动能。对消费者群体的任何干扰都可能影响其整体业务。
但在过去几年中,华为一直在为其智能手机设计自己的芯片,以减少对其他公司的依赖。它有一系列称为Kirin的处理器和Balong 5000的调制解调器,搭载这些产品的设备将被允许连接到5G网络。
据IDC数据显示,在2018年,73%的华为智能手机包含了该公司自己的芯片。另外10%来自台湾的联发科技公司。剩下的17%来自高通公司,但这些主要是针对低端200美元以下的手机。
据笔者观察,如果美国特朗普政府铁心不与华为合作5G,在失去美国5G市场的同时,如果BIS有选择性的限制华为与美国企业合作,对华为ICT基础设施和部分智能终端设备的部件供货将会产生一定影响。
尽管如此,我们也有必要强调,美国只是世界的一部分。华为5G不会因为西方变黑,而东方不闪耀。
');
print_r($matches);
exit;
目录
相关文章
|
9天前
|
设计模式 PHP
PHP中的设计模式:单一职责原则在软件开发中的应用
【10月更文挑战第8天】 在软件开发中,设计模式是解决常见问题的经验总结,而单一职责原则作为面向对象设计的基本原则之一,强调一个类应该只有一个引起变化的原因。本文将探讨单一职责原则在PHP中的应用,通过实际代码示例展示如何运用该原则来提高代码的可维护性和可扩展性。
24 1
|
28天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
28天前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
1月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
53 4
|
1天前
|
前端开发 安全 关系型数据库
PHP在Web开发中的应用及其优势###
【10月更文挑战第16天】 — 本文探讨了PHP在现代Web开发中的广泛应用及其显著优势。通过分析PHP的核心特性,如灵活性、易用性和广泛的应用支持,阐述了为何PHP成为众多开发者和公司的首选技术。文章还介绍了PHP与其他编程语言的比较,并展望了其未来的发展趋势。 ###
10 2
|
6天前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
6天前
|
小程序 物联网 API
PHP在哪些领域有应用?
【10月更文挑战第11天】PHP在哪些领域有应用?
19 2
|
6天前
|
运维 监控 物联网
PHP的应用的应用场景
【10月更文挑战第11天】PHP的应用的应用场景
7 1
|
9天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
13 2
|
10天前
|
设计模式 缓存 数据库连接
探索PHP中的设计模式:单例模式的实现与应用
在PHP开发中,设计模式是提高代码可复用性、可维护性和扩展性的重要工具。本文将深入探讨单例模式(Singleton Pattern)的基本概念、在PHP中的实现方式以及实际应用场景。单例模式确保一个类仅有一个实例,并提供全局访问点。通过具体代码示例和详细解释,我们将展示如何在PHP项目中有效利用单例模式来解决实际问题,提升开发效率和应用性能。