随笔分类 - 算法
摘要:面临敏感词过滤的问题,最简单的方案就是对要检测的文本,遍历所有敏感词,逐个检测输入的文本是否包含指定的敏感词。 很明显上面这种实现方法的检测时间会随着敏感词库数量的增加而线性增加。系统会因此面临性能和CPU消耗的问题。 一、基于DFA敏感词算法解析 在计算理论中,确定有限状态自动机或确定有限自动机(
阅读全文
摘要:一、人工智能的核心——机器学习 人工智能是一个很大的圈子,但人工智能的基础是机器学习。 机器学习是什么? 其实就是人告诉机器想做什么事情,并且给它一堆数据让它模仿着去做。 机器学习需要什么? 算法、数据、程序、评估、应用。 机器学习能做什么? 机器学习在数据挖掘、图像识别、语音和自然语言处理中有着广
阅读全文
摘要:行为型模式:解释器模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式、模板方法模式。 一、责任链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
阅读全文
摘要:结构型模式:适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式。 一、适配器模式 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的的那些类可以一起工作。 1、适配器模式实现 (1)类适配器:使用多继承 使用这种适配器模式,就将本来不兼容的接
阅读全文
摘要:创建型模式:工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式。 一、简单工厂模式 不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。该模式不属于23种设计模式之一。 1、简单工程模式示例 Payment是抽象类,是为了让产品有同样的表现,可以同样的对外使用。如
阅读全文
摘要:一、设计模式 设计模式:对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。 每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。 设计模式的创始人,一般称为“四人帮”(Gang of Four, GoF):Erich Gamma,Richard Helm,Ra
阅读全文
摘要:一、密码与加密 传统密码:加密算法是秘密的 现代密码系统:加密算法是公开的,密钥是秘密的 对称加密,加密解密都是一个密钥 非对称加密,加密解密是不同的密钥 对称加密,加密解密都是一个密钥 非对称加密,加密解密是不同的密钥 二、RSA加密算法 1、RSA非对称加密系统 公钥:用来加密,是公开的 私钥:
阅读全文
摘要:一、最大公约数 约数:如果整数a能被整数b整除,那么a叫做b的倍数,b叫做a的约数。 最大公约数(Greatest Common Divisor,GCD):给定两个整数a,b,两个数的所有公共约数中的最大值即为最大公约数。例如,12与16的最大公约数是4. 1、如果计算两个数的最大公约数 欧几里得:
阅读全文
摘要:一、从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2 Fibonacci:除第一个和第二个数外,任意一个数可由前两个数相加得到。 1、练习:递归和非递归的方法来求解 使用递归和非递归的方法来求解斐波那契数列的第n项。 2、递归速度问题——子问题重复计算 通过上例可以发现递归版
阅读全文
摘要:贪心算法(又称贪婪算法)是指,在堆问题求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出是在某种意义上的局部最优解。 贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。 一、找零问题 假设商店老板需要找零n元钱,
阅读全文
摘要:一、AVL树 AVL树是一棵自平衡的二叉搜索树。 1、平衡因子 balance factor(平衡因子)记录了左右子树的高度差。上图定义的是有左子树没有右子树差值是1,没有左子树有右子树差值是-1. 2、AVL树具有以下性质 根的左右子树的高度之差的绝对值不能超过1 根的左右子树都是平衡二叉树(任何
阅读全文
摘要:1、给两个字符串s和t,判断t是否为s的重新排列后组成的单词。 s = "anagram", t = "nagaram", return true. s = "rat", t = "car", return false. leetcode地址:https://leetcode.com/problem
阅读全文
摘要:一、直接寻址表 如果某应用要用到一个动态集合,其中每个元素都是全域U={0,1….,m}中的一个关键字 为表示动态集合,使用数组。称为直接寻址表,记为T[m],其中每个位置称为一个槽slot,对应于全域中的一个关键字。槽k指向集合中一个关键字为k的元素。如果该集合中没有关键字为k的元素,则T[k]=
阅读全文
摘要:链表定义:链表是由一系列节点组成的元素结合。每个节点包含两个部分,数据域item和指向下一个节点的指针next。通过节点之间的相互连接,最终串联成一个链表。 一、单链表 1、节点定义 2、建立链表 (1)头插法 头插法是在头结点这边插入。 (2)尾插法 不光要知道头还需要知道尾在哪。从尾节点插入。
阅读全文
摘要:一、迷宫问题 给一个二维列表,表示迷宫(0表示通道,1表示围墙)。给出算法,求一条走出迷宫的路径。 1代表墙,0代表路,图示如下: 二、栈——深度优先搜索 应用栈解决迷宫问题,叫做深度优先搜索(一条路走到黑),也叫做回溯法。 1、用栈解决的思路 思路:从上一个节点开始,任意找下一个能走的点,当找不到
阅读全文
摘要:一、列表/数组 列表(其他语言称数组)是一种基本数据结构。 1、列表的元素是如何存储的? c的数组和python的列表有两点不同: (1)数组元素类型要相同,列表元素类型可以不一样。 python存的不是真实的值而是存的内存地址。 32位机器上一个地址占4个字节,64位机器上一个地址占用8个字节。
阅读全文
摘要:一、什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合和字典等都是一种数据结构。 N.Wirth:“程序=数据结构+算法” 二、数据结构的分类 数据结构按照其逻
阅读全文
摘要:一、希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种分组插入排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。 1、算法思路 首先取一个整数d1=n/2,将元素分为d1个组,每组
阅读全文
摘要:一、归并 假设现在的列表分两段有序,如何将其合成为一个有序列表。这种操作称为一次归并。 1、归并过程图示 当一个列表两段有序合并为一个有序列表的一次归并的过程如下: 将列表分为两段,两个箭头分别指向每段的第一个: 比较两段中最小的数2和1,将最小的那个值,箭头后移: 接着比较两段中最小的数,将2取出
阅读全文