算法

《算法》笔记 14 - 单词查找树

邮差的信 提交于 2020-01-26 08:36:05
R向单词查找树 数据结构 查找 插入 查找所有键 通配符匹配 最长前缀 删除 R向单词查找树的性质 三向单词查找树 三向单词查找树的性质 同字符串的排序一样,利用字符串的性质开发的查找算法也比通用的算法更有效,这些算法可以用于在以字符串作为被查找键的场合。这类算法在面对巨量的数据时,仍然可以取得这样的性能:查找命中所需的时间与被查找的键的长度成正比;而查找未命中时只需检查若干个字符。这样的性能是相当惊人的,也是算法研究的最高成就之一,这些算法成了建成现在能够便捷、快速地访问海量信息所依赖的基础设施的重要因素。 R向单词查找树 数据结构 单词查找树(Trie)是用于字符串键查找的数据结构。与之前的查找树类似,它也是由链接的结点所组成的数据结构,这些链接可能为空,也可能指向其他结点。 结点的数据结构为: private static class Node { private Object val; private Node[] next = new Node[R]; } 每个节点都只有一个或0个指向它的结点(父结点),只有根结点不会有父结点。每个节点都含有R条链接,R为字母表的大小,如果字符都由26个小写英文字母构成,则R为26;如果字符属于ASCII字符集,则R=128;DNA研究中用4个字母表示4个碱基,R=4。 R条链接对应可能出现的字符,这其中会有大量的空链接

MD5算法

こ雲淡風輕ζ 提交于 2020-01-26 04:13:25
MD5消息摘要算法,属于Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要。 算法原理: 1、数据填充 对消息进行数据填充,使消息的长度对512取模得448,设消息的长度为X,即满足X mod 512 = 448。根据此公式得到需要填充的数据长度。 填充的方法:在消息后面进行填充,填充的第一位是1,其余为0。 2、添加消息长度 在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于2 64 ,则只使用其低64位的值,即(消息长度 对 2 64 取模)。 在此步骤进行完毕后,最终消息长度就是512的整数倍。 3、数据处理 需要准备用到的数据: 4个常数:A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476; 4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z); G(X,Y,Z)=(X & Z) | (Y & (~Z)); H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z)); 把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。 图中,A

BAT直通车:阿里架构师详解JVM垃圾回收机制,看完还不懂那就放弃吧

痴心易碎 提交于 2020-01-26 03:25:07
本文转载自: BAT直通车:阿里架构师详解JVM垃圾回收机制,看完还不懂那就放弃吧 一、如何判定对象为垃圾对象 在堆里面存放着Java世界中几乎所有的对象实例, 垃圾收集器在对堆进行回收前, 第一件事就是判断哪些对象已死(可回收). 1. 引用计数法 在JDK1.2之前,使用的是引用计数器算法。 在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1,当引用失效的时候,计数器的值就-1,当引用计数器被减为零的时候,标志着这个对象已经没有引用了,可以回收了! 问题:如果在A类中调用B类的方法,B类中调用A类的方法,这样当其他所有的引用都消失了之后,A和B还有一个相互的引用,也就是说两个对象的引用计数器各为1,而实际上这两个对象都已经没有额外的引用,已经是垃圾了。但是该算法并不会计算出该类型的垃圾。 2. 可达性分析法 在主流商用语言(如Java、C#)的主流实现中, 都是通过可达性分析算法来判定对象是否存活的: 通过一系列的称为 GC Roots 的对象作为起点, 然后向下搜索; 搜索所走过的路径称为引用链/Reference Chain, 当一个对象到 GC Roots 没有任何引用链相连时, 即该对象不可达, 也就说明此对象是不可用的, 如下图:虽然E和F相互关联, 但它们到GC Roots是不可达的, 因此也会被判定为可回收的对象。 注:

Linux-shell篇之加密算法

此生再无相见时 提交于 2020-01-26 03:24:04
TCP/IP:安全 A --> B 机密性:明文传输(ftp,http,smtp,telnet) 完整性:10(100) 身份验证: 机密性:plaintext --> 转换规则 --> ciphertext ciphertext --> 转换规则 --> plaintext 转换算法:密钥 对称加密:算法 数据完整性:A --> B 单向加密算法:提取数据特征码 输入一样:输出必然相同 雪崩效应:输入的微小改变,将会引起结果的巨大改变 定长输出:无论原始数据是多大,结果大小都是相同的 不可逆:无法根据特征码还原原来的数据 协商生成密码:密钥交换(Internet Key Exchange,IKE) Diffie-Hellman协议(密钥交换算法): A --> B p,g(大素数,生成数) A:x B:y A:g^x%p --> B B:g^y%p --> A g,p,g^x%p,g^y%p A:g^x%p --> B B:g^y%p --> A A:(g^y%p)^x=g^yx%p B:(g^x%p)^y=g^xy%p 公钥加密算法:非对称加密算法 密钥对: 公钥:p 私钥:s 发送方用自己的私钥加密数据,可以实现身份验证 发送方用对方的公钥加密数据,可以保证数据机密性 公钥加密算法很少用来加密数据:速度太慢 PKI:Public Key Infrastructure CA

自动人脸识别基本原理

巧了我就是萌 提交于 2020-01-26 02:37:23
自动人脸识别基本原理 人脸识别经过近 40 年的发展,取得了很大的发展,涌现出了大量的识别算法。这些算法的涉及面非常广泛,包括模式识别、图像处理、计算机视觉、人工智能、统计学习、神经网络、小波分析、子空间理论和流形学习等众多学科。所以很难用一个统一的标准对这些算法进行分类。根据输入数据形式的不同可分为基于静态图像的人脸识别和基于视频图像的人脸识别。因为基于静态图像的人脸识别算法同样适用于基于视频图像的人脸识别,所以只有那些使用了时间信息的识别算法才属于基于视频图像的人脸识别算法。接下来分别介绍两类人脸识别算法中的一些重要的算法。 特征脸 特征脸方法利用主分量分析进行降维和提取特征。主分量分析是一种应用十分广泛的数据降维技术,该方法选择与原数据协方差矩阵前几个最大特征值对应的特征向量构成一组基,以达到最佳表征原数据的目的。因为由主分量分析提取的特征向量返回成图像时,看上去仍像人脸,所以这些特征向量被称为“特征脸”。 在人脸识别中,由一组特征脸基图象张成一个特征脸子空间,任何一幅人脸图象(减去平均人脸后)都可投影到该子空间,得到一个权值向量。计算此向量和训练集中每个人的权值向量之间的欧式距离,取最小距离所对应的人脸图像的身份作为测试人脸图像的身份。 下图给出了主分量分析的应用例子。图中最左边的为平均脸,其他地为对应 7 个最大特征值的特征向量。 主分量分析是一种无监督学习方法

数据结构与算法之美(一)——为什么学习算法,怎么学习算法

荒凉一梦 提交于 2020-01-26 01:40:27
一,为什么学习算法? 1. 算法是计算机学习的重要基石之一,学好算法对理解层出不穷的框架有着决定行作用。 2. 学习算法,有利于写出高性能的代码。 3. 长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。 4. 算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面 二,学习技巧 1. 边学边练,适度刷题 2. 多问、多思考、多互动 3. 算法学习枯燥难耐,需要坚持不懈 4. 边学边练,定时复习 来源: CSDN 作者: resource19610 链接: https://blog.csdn.net/qq_41201565/article/details/104027982

浅谈编译原理

走远了吗. 提交于 2020-01-26 00:23:54
什么是编译原理? 编译原理顾名思义,编译就是将源语言(高级程序语言)翻译成等价的目标语言(机器语言即计算机可以识别的语言即0和1或汇编语言)的过程。原理就是研究这一过程的思想方法、理论和技术。从本质上来讲编译是一个算法问题,但由于它的问题相当复杂,导致设计解决这个问题的算法也十分复杂。这里的算法和我们学习的数据结构和算法中的算法有些不同,后者讲述的是基础算法,是解决我们生活中遇到的问题,而编译中的算法则是在人与计算机交流时需要解决的“沟通”问题的算法,比较专注解决一种的算法。编译的过程包括:源程序->词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成->目标程序 为什么我们要编译程序? 因为在计算机发展的初期,我们要想操作计算机则需要学习如何与计算机沟通,当时沟通的方法只有0和1,只有熟练使用0和1来表示程序的科学家才能通过打孔卡或纸带操控计算机,由于直接使用二进制编程的门槛过高,使得除特定的科学家以外的人学习使用计算机较为困难且周期较长,不利于计算机的发展,所以之后的计算机科学家就设计了很多的高级语言使得程序代码更贴近自然语言,但还是有其特定的结构,通过高级语言解决了对学习编程门槛高的问题,但这也照成了机器不能识别高级语言的问题,这是就需要一个翻译程序(就像我们用翻译程序将英文翻译为中文)来使计算机“读懂”程序员写的高级语言。编译程序油然而生。

浅谈二分算法

我的梦境 提交于 2020-01-25 22:08:57
二分算法 程序或算法的时间复杂度 基本概念 一个程序或算法的时间效率,也称“时间复杂度”,有时简称“复杂度” 复杂度常用大写字母 O O O 和小写字母 n n n 来表示, n n n 代表问题的规模 时间复杂度是用算法运行过程中,某种时间固定的操作需要被执行的次数和 n n n 的关系来衡量的。在无序数列中查找某个数,复杂度是 O ( n ) O(n) O ( n ) 。 计算复杂度的时候,只统计执行次数最多的( n n n 足够大时)那种固定操作的次数。比如某个算法需要执行加法 n 2 n^2 n 2 次,除法 n n n 次,那么就记其复杂度是 O ( n 2 ) O(n^2) O ( n 2 ) 的。 复杂度有“平均复杂度”和“最坏复杂度”两种。两者可能一致,也可能不一致。一般情况下,只需考虑“平均复杂度”,只有在要求极为严格的情况下,才需要考虑“最坏复杂度” 如果复杂度是多个 n n n 的函数之和,则只关心随 n n n 增长增长得最快的那个函数 O ( n 2 + n 3 ) = > O ( n 3 ) O(n^2+n^3)=>O(n^3) O ( n 2 + n 3 ) = > O ( n 3 ) O ( 2 n + n 2 ) = > O ( 2 n ) O(2^n+n^2)=>O(2^n) O ( 2 n + n 2 ) = > O ( 2 n ) O ( n

Nagle算法

青春壹個敷衍的年華 提交于 2020-01-25 18:55:08
简介 Nagle算法 是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小 缓冲 器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加 网络 软件系统的效率。Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这使福特经营的最早的专用 TCP/IP网络 减少拥塞控制,从那以后这一方法得到了广泛应用。Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指的是应用程序一次产生一字节数据,这样会导致 网络 由于太多的包而过载(一个常见的情况是发送端的" 糊涂窗口综合症(Silly Windw Syndrome) ")。从键盘输入的一个字符,占用一个字节,可能在传输上造成41字节的包,其中包括1字节的有用信息和40字节的标题数据。这种情况转变成了4000%的消耗,这样的情况对于轻负载的 网络 来说还是可以接受的,但是重负载的福特网络就受不了了,它没有必要在经过节点和网关的时候重发,导致包丢失和妨碍传输速度。 吞吐量 可能会妨碍甚至在一定程度上会导致连接失败。Nagle的算法通常会在TCP程序里添加两行代码,在未确认数据发送的时候让发送器把数据送到 缓存 里。任何数据随后继续直到得到明显的数据确认或者直到攒到了一定数量的数据了再发包。尽管Nagle的算法解决的问题只是局限于福特 网络 ,然而同样的问题也可能出现在ARPANet