摘要:
善用接口 接口不是现代PHP的新特性,但是非常重要,学会使用接口,可以极大提升我们的编程能力,所以在日常开发中应该尽可能多地使用接口。 接口是两个PHP对象之间的契约(Contract),Laravel底层就直接将接口放在Contracts目录中: 接口将我们的代码和依赖解耦了,而且允许我们的代码依 阅读全文
摘要:
强推一个学设计模式的网站: Refactoring Guru (https://refactoringguru.cn) 这是国外的一个网站,建立的初衷,是帮助开发者以更为简单便捷的方式,迅速掌握各个设计模式的学习。 每个设计模式都对应配有一篇图文并茂的文章,让开发者可以很轻松的搞懂每个设计模式的具体 阅读全文
摘要:
堆和堆的构建 什么是堆 堆是一种特殊的二叉树,具备以下特性: 堆是一个完全二叉树 每个节点的值都必须大于等于(或小于等于)其左右孩子节点的值 如果每个节点的值都大于等于左右孩子节点的值,这样的堆叫大顶堆;如果每个节点的值都小于等于左右孩子节点的值,这样的堆叫小顶堆。 上图中,左侧的堆是大顶堆,右侧的 阅读全文
摘要:
前面几篇分享中我们陆续介绍了平衡二叉树的定义、实现原理、构建过程演示以及对应的实现代码,我们提到平衡二叉树是最理想的二叉排序树,性能最好,也最稳定,但是缺点是维护成本高,需要在插入和删除节点时维护新树的平衡性,所以工程实践中,我们倾向于使用另一种二叉排序树 —— 红黑树,什么是红黑树?红黑树的性能如 阅读全文
摘要:
1、什么是命名空间 如果你只需要知道现代PHP特性中的一个,那就应该是命名空间。命名空间在PHP5.3.0中引入,其作用是按照一种虚拟的层次结构组织PHP代码,这种层次结构类似操作系统中文件系统的目录结构。命名空间是现代PHP组件生态的基础,现代的PHP组件框架代码都是放在各自全局唯一的厂商命名空间 阅读全文
摘要:
引子 上一篇我们介绍了二叉排序树,并且提到理想情况下,二叉排序树的插入、删除、查找时间复杂度都是 ,非常高效,而且它是一种动态的数据结构,插入删除性能合查找一样好,不像之前提到的二分查找,虽然查找性能也是 ,但是需要先对线性表进行排序,二排序的最好时间复杂度也是 ,所以二分查找不适合动态结构的排序。 阅读全文
摘要:
为什么要引入二叉排序树 我们前面已经介绍了很多数据结构,比如数组、链表、散列表等,数组查找性能高,但是插入、删除性能差,链表插入、删除性能高,但查找性能差,在不考虑散列冲突的话,散列表的插入、删除、查找性能都很高,但是前提是没有散列冲突,此外,散列表存储的数据是无序的,散列表的扩容非常麻烦,涉及到散 阅读全文
摘要:
二叉树的定义及其特性 树的相关概念 树这种数据结构模拟了自然界中树的概念,自然界中的树有根、叶子、枝干,数据结构中的树也是如此,只不过是倒过来的: 其中的每个元素叫做节点。树的顶点(没有父元素的节点)叫根节点,如 E;每个分支的末端节点(没有子元素的节点)叫叶子节点,如 G、H、I、J、K、L;用来 阅读全文
摘要:
PHP 提供的字符串匹配函数多是单模式匹配,因此大多通过 KMP算法 实现,我们以 函数为例,简单对底层实现源码进行剖析。 是 PHP 标准库提供的函数,所以可以在 中找到其定义: 阅读这段源码可知,真正的匹配逻辑通过 函数实现,我们继续溯源,可以追踪到 文件中的 函数定义,核心匹配逻辑在这里: 如 阅读全文
摘要:
今天开始,我们将花三篇文章的篇幅由浅及深地介绍几个字符串匹配算法,首先从最简单的字符串匹配算法 —— BF 算法说起,BF 是 Brute Force 的缩写,中文译作暴力匹配算法,也叫朴素匹配算法。 BF算法(暴力匹配算法) BF 算法的原理很简单,在继续介绍之前,我们先引入两个术语: 主串和模式 阅读全文