- 博客(56)
- 资源 (3)
- 收藏
- 关注
原创 jdk动态代理
定义 代理的使用场景很多,通常表现为封装原有代码的调用,提供额外的操作代码,或者说隐藏原始代码,控制对原始代码的访问,常见的用途例如,执行方法之前的权限检查,或者进行日志记录、事务处理等。这里以权限检查为例,代理中增加的权限检查代码称之为操作方法,被代理对象成为委托对象示例package test;public interface User { void addUser
2017-03-11 16:33:52 751
原创 动态规划与0-1背包问题
定义动态规划中一个经典的问题就是0-1背包问题,0-1的意思也就是说对于每个元素/选项,只有两个选择,要么选择,要么不选择。动态规划的分析过程为:确定推导公式/状态转移方程,子元素结构/独立子结构,确定边界,保存中间数据/备忘录。动态规划过程的核心要素就是确定推导公式,类似于初中数学上经常遇到的这样一个场景:已知:a(n)=a(n-1)+a(n-2);a(0)=a(1)=1;
2017-03-06 18:01:56 620
原创 弗洛伊德算法
定义弗洛伊德算法计算图中各个顶点之间的最短路径,迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。为了便于理解计算过程,可以这样认为:迪杰斯特拉算法通过选定的被访问顶点(已确定最短路径),来更新从出发顶点到图中其他顶点的路径,目的是求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,通过该被访问顶点来更新出发访问顶点到
2016-11-01 13:29:29 3075
原创 迪杰斯特拉算法
定义迪杰斯特拉算法用于计算图中,某一个顶点vi到另外一个顶点vj的最短路径,因为计算从vi到vj的最短路径实际需要计算出vi到vj之前的所有顶点的最短路径,所以实际的计算可能会附带得出vi到图中一部分节点的最短路径,而且这种“附带”的结果是必需的。算法过程如下:设置出发顶点为v,顶点集合V{v1,v2,vi...},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di...
2016-11-01 03:13:08 1504
原创 克鲁斯卡尔算法
定义与普利姆算法通过操作顶点集合来计算最小生成树相比较,克鲁斯卡尔算法是通过对图中的边集操作来实现的。算法过程如下:设置边集为E,图中的每一个连通子图G,G_set为连通子图的集合,即G_set{G1,G2...},在E中选择权值最小的边e,加入到G_set中,其中可能存在如下情形:1、G_set中的某个元素Gi连通子图,在加入边e后形成闭环,则不作处理;2、e这条边的两个顶点
2016-10-31 15:06:22 1064
原创 普利姆算法
定义普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图。普利姆的算法如下:图的顶点集合为V,设置一个顶点集合new_V,很明显new_V是V的一部分,设另一部分为other_V。在new_V顶点与other_V顶点形成的所有边中,选择权值最小的一条,将该边的在other_V中的顶点移至new
2016-10-30 19:56:12 6400 1
原创 深度优先和广度优先遍历
定义常见的图的遍历有深度优先遍历和广度优先遍历,所谓深度优先,即选择图中一个顶点作为出发访问顶点,在周围可达的顶点中选择一个未被访问过的作为下一个被访问的顶点,重复进行,如果当前被访问的顶点周围没有未被访问的顶点,则返回上一层,直到返回最初在图中选择的出发访问顶点,如果图中仍有未被访问的顶点,则说明图有错,不是连通图。广度优先是指从图中选择的出发访问顶点开始,选择当前顶点周围所有可达的未被访问
2016-10-30 14:31:46 690
原创 归并排序
定义归并排序是将列表细分为子列表,然后将子列表进行有序合并。将列表细分到单个元素,如列表arr,包含两个元素[a,b],将arr细分为两个子列表arr1{a}和arr2{b},则对子列表的有序合并即形成了局部有序列表new_arr{a,b},迭代进行即可形成最终有序列表。示例以整型数组{2,9,11,5,7,20,8}为例,根据归并定义可知:原始列表:2->9->11-
2016-10-28 18:49:46 434
原创 希尔排序
定义希尔排序属于缩小增量排序,原理同插入排序。在以D作为增量的序列中,实现插入排序,形成以D为增量的子序列的有序列表,不断缩小增量执行排序操作,当增量为一时,即为普通的插入排序。示例以整型数组{2,9,11,5,7,20,8}为例:原始列表:2->9->11->5->7->20->8 dis=7/2 存在三个子序列:2、5、8;9、7;11、201次排序
2016-10-28 17:12:30 432
原创 插入排序
定义插入排序的原理是将元素不断插入有序的局部列表中,最终形成有序列表。n个元素的待排序列表,需要进行(n-1)排序才能形成有序列表。示例以整型数组{2,9,11,5,7,20,8}为例:原始列表:2->9->11->5->7->20->81次排序:2->9->11->5->7->20->8有序部分:2->92次排序:2->9->11->5->7->2
2016-10-28 16:36:36 435
原创 快速排序
定义快速排序采用递归的思想,不断将原列表拆分成两个部分,递归进行排序。排序操作为选择一个元素作为“分水岭”,将列表分成所有元素值大于该“分水岭”部分和所有元素值小于该“分水岭”部分。示例以整型数组{2,9,11,5,7,20,8}为例,选择第一个元素作为“分水岭”,以line表示:原始列表:2->9->11->5->7->20->8 line=21次排序:2-
2016-10-28 16:13:33 379
原创 选择排序
定义由名称可知,选择排序的操作是通过不断选择待排序列表中的最大(最小)值,由此构成一个有序列表。冒泡排序的每次排序也是选出列表极值,不过其操作是通过不断比较替换相邻元素实现的,选择排序的每次排序是记录列表中的极值下标。由此可知,一个n个元素的列表需要进行(n-1)次选择,才能形成有序列表。示例以整型数组{2,9,11,5,7,20,8}为例:原始列表:2->9->11-
2016-10-28 15:17:53 399
原创 冒泡排序
定义冒泡排序作为最常见的排序方式之一,其操作是在相邻的两个元素之间进行比较交换,每一次排序结果都能取出一个最大(最小)值,一个n个元素的待排序列表,最多只需要进行(n-1)次排序即可。示例以整型数组{2,9,11,5,7,20,8}为例:原始列表:2->9->11->5->7->20->81次排序:2->9->5->7->11->8->20 2次排序:2->5->7->
2016-10-28 12:15:18 405
原创 装饰模式
定义装饰模式是一种利用对象的关联关系来拓展对象功能的模式,并对外提供透明访问。由其名称中“装饰”两个字可知,该模式强调为对象添加职责,为了不违背单一职责原则,降低复杂度,所以提供装饰类对被装饰类加以修饰,这里称被装饰类为原始构件类,在每个装饰类中提供一个需要附加或添加的职责,所以一般需要一个抽象的装饰类。整个结构满足每个单独类都提供一个职责,通过装饰类对构件类进行包装来提供目标服务方法。结
2016-09-17 12:04:54 478
原创 桥接模式
定义桥接模式根据其名字中的“桥”提示,可知该模式用于连接两个类型空间,或者也可以说用于隔离两个类型,当然这种说法太模糊不清。桥接模式的定义为分离两个独立变化的维度,将原系统中同时存在关联关系的两个因素,隔离为两个独立的继承结构,并在两个继承结构的抽象层建立关联关系。下面解释这个定义的意思:什么是一个系统中同时存在两个具有关联关系的因素?举例来说,公园要制造玩具模型有两种动物,牛、羊,每
2016-09-16 12:22:10 459
原创 代理模式
定义代理模式的作用比较容易理解,因为名字已经说明一些。最表面的意思就是提供一个对象的代理对象,通过代理对象来完成目标对象所要完成的功能,其实内部操作仍然是目标对象的操作,不过是添加了一层掩饰。这里所说的代理对象是指与目标对象实现相同接口的类的实例,因为要提供一致性访问,或者说对外不区分所使用的是代理对象还是目标对象。
2016-09-06 14:06:15 363
原创 哈夫曼树
树形结构的用处有很多,例如排序时利用树的结构保存节点大小关系,如堆、二叉树等排序;查找、修改节点时利用树的平衡性来简化操作,如AVL树、红黑树,此处利用树的另一项特性:优化判断。定义哈夫曼树的学术定义为,带权路径长度最短的二叉树,即节点具有两个属性:1、权值,可以看作节点表达出的数值大小,或者变换的表示为概率大小2、路径,可以看作由根节点到达当前节点的分支数,左分支和右分支具有不同
2016-09-03 00:30:56 14537 2
原创 外观模式
定义外观模式是使用频率非常高的一种设计模式,用于隔离客户端与复杂子系统的关联关系,参考迪米特法则可知,该模式的结构是在客户端与子系统之间引入一个“外观”类,满足客户端需求针对“外观”对象提出即可,具体的实现交给“外观”对象来完成。最基本实现如下由上图可知,将原本耦合度较高的客户端与复杂系统分隔开,客户端只需要向facade对象,即外观对象,提出需求即可(从这里看有点像之前提到的
2016-09-01 13:42:56 477
原创 单例模式
定义单例模式顾名思义,在全局范围内提供唯一的实例对象供全局访问,一般用于全局的资源监控或者特定数量的资源访问控制(引申为特定数量的单例对象而非唯一,此处以单个实例对象为例),常用的示例如系统日志、单个打印机等对象,避免混乱发生错误,所以维持全局只有一个对象。结构如下单例模式作为对象创建性模式,所关心的只有两个点:1、只有一个实例对象被创建2、实例的创建时间可控制结构
2016-08-30 12:50:16 461
原创 基数排序
定义与其他常规排序方式不同,基数排序不是根据元素的大小进行调换位置,进而形成有序列表,或者更严格来讲,基数排序不是直接根据元素整体的大小进行元素比较,而是将原始列表元素分成多个部分,对每一部分按一定的规则进行排序,进而形成最终的有序列表。示例:扑克牌排序排序方式:可以先按照牌的种类排序,例如红桃都在梅花前面,如排序规则为:"红桃"以两种颜色进行简单演示由此可得知:基数排
2016-08-28 14:05:16 664
原创 循环队列
定义队列的用处很广,最基本的有进程调度时的先来先服务、页面调度用到的先进先出,这里不讨论这种“FIFO”方式的优缺点,只说队列。队列属于数组概念的一个变种,在处理元素时包含两个属性,头标志和尾标志,对于入队和出队的操作通过移动头、尾来完成。与数组的比较如下很明显,数组的插入与删除元素操作都在一端进行,而队列的插入元素在尾部进行,删除操作在头部进行。这就存在一个很明显的缺点:相对
2016-08-27 17:19:46 1738
原创 组合模式
定义在对单个对象的处理中,可以以简单明了的方式进行,即按照需求正常进行操作即可。当待操作的对象不是单个对象,而是一个对象集合时,因为实际需要操作的目标是集合的元素,所以在执行目标对象行为之前,需要进行定位目标对象的额外操作(例如遍历集合)。如果把集合作为为了实现目标行为(即多个对象的行为调用)而附加的一个属性,则需要提供对该属性的管理。示例例如上图,想要完成的需求是提供“共享”
2016-08-26 19:40:19 602
原创 TCP拥塞控制和流量控制
定义TCP作为面向连接的提供全双工可靠服务协议,具有差错控制、拥塞控制和流量控制等功能。此处所谓的拥塞控制和流量控制,就是将发送端发送能力、接收端接收信息的能力以及当前的网络环境参与考虑,在网络拥塞情况严重或者接收端接收能力有限的情况下,减缓或暂停消息发送,当情况改善时,增强消息发送能力,加上超时/丢失重发的机制,共同提供可靠传输。流量控制流量控制以动态调整发送空间大小(滑动窗口)的形
2016-08-25 21:52:20 5116
转载 分析两种实现SSL会话劫持的典型技术
自SSL问世以来,在其应用范围越来越广泛同时,多种针对SSL协议本身的缺陷或者其不规范引用的SSL会话劫持方法也随之出现,下面将详细分析两种典型的SSL会话劫持的实现原理和实现条件。【读者如果想要参考SSL中间人的实际案例,可以阅读因特尔开发人员专区的这篇文章《针对SSL的中间人攻击》】一、利用伪造的X.509证书1.1 会话劫持原理 当SSL客户端与SSL服务端
2016-08-25 10:46:03 4600
原创 奇偶节点的排序和完全平方数问题
遇到涂鸦的两个题目,拿来写一下,有理解不对的地方,望大家不吝指正。1、将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变。示例:4→5→3→1→2 ==> 5→3→1→4→2 1==> 12→1 ==>1→2 ==> (链表为空)链表节点定义为:class Node {pub
2016-08-24 21:39:59 837
原创 JVM内存分布
定义JVM的结构可以分为三个部分:类加载系统、运行时数据区、执行引擎与本地方法接口,本文关注的只是运行时数据区。JVM内存结构可以分为:堆、栈(虚拟机栈,本地方法栈)、方法区和程序计数器(CPU寄存器暂且不说)几个部分,按照线程隔离性又可以分为两类:线程共享的堆和方法区,线程私有的栈和程序计数器。配图如下
2016-08-24 17:05:41 525
原创 策略模式
定义策略模式重点讲述的有两个方面:策略的定义、策略的使用。将解决问题的不同算法分别定义为不同的策略类,在使用中可以选择或者替换不同的策略对象,即切换使用不同的算法。结构由定义可以看出,策略模式可以分为三个部分1、环境类,也就是待使用策略的类,内部包含一个抽象策略的引用2、抽象策略类,将算法的公共部分提出出来,放在抽象策略类中实现3、具体策略类,不同算法的实现体可
2016-08-21 21:41:07 328
原创 适配器模式
定义适配器模式从名字与其结构上可以看出,其体现出的是一个转化作用。将已有的功能转化为客户端所期待的功能,也可以理解为,将客户端实际使用的接口在暗中转接到一个已存在的类上,该移花接木操作对客户端而言是透明的。结构从定义中可以看出,该模式需要包含三个部分:1、目标接口,在其中定义了客户端所需要的功能接口,也就是待实现的方法2、适配者类,提供目标接口中实际使用到的方法3、适配器类
2016-08-21 13:14:24 350
原创 观察者模式
模式定义我们知道面向对象的一个主题就是类实例的实体化,即每个实体都有自己的状态和行为,而仿照真实世界的不同客观实体之间是存在诸多联系的,则一个很常见的对象联动方式就是反馈行为的发生。最常见的场景如:班车进站,众旅客上车,这是一个典型的对象反馈行为。由此产生的一种描述该现象的设计模式,称之为观察者模式,也有其他的名字如发布-订阅模式、模型-视图模式等。观察者模式作为一种对象行为型模式,用于监
2016-08-20 20:21:01 471
原创 堆排序
排序定义堆排序是利用树的结构特性,构造大顶堆或者小顶堆,通过替换与调整在原有数组上进行排序。实现形式以递增排序为例,将待排序数组构造为大顶堆(不需额外的数据空间,在自身数组上进行操作,原地排序,),所谓大顶堆也就是非叶子节点的节点元素值比它的子节点元素值要大,按此规则构建树结构,则根节点即为最大值。也就是当前数组的第一个元素即为最大值(带有元素跳跃,类似选择排序,都为非稳定排序),将最
2016-08-19 13:14:42 547
原创 equals函数与hash计算
应用场景在Java中常用来判断两个对象是否相等的函数有equals和hashCode方法,最常见的就是在集合容器中,例如HashSet和HashMap中,保存两个不同的对象,所以需要提供一个合理的关于equals和hashCode的配置,以使得集合具有正确的使用性质。示例以典型的point为测试用例,为了保证集合中不存在两个相同(内容相同)的point,所以提供了重写的hashCode
2016-08-17 16:05:48 596
原创 红黑树的插入与删除(二)
上文回溯在上一篇插入节点分析中已经提过,红黑树的插入节点相对于AVL树来讲,需要的调节平衡的操作比较少,一方面表示红黑树的平衡定义与AVL树不同,另一方面也说明了红黑树不是严格意义上的平衡树,即查询操作不是严格的O(log n)。不过带来的好处则是需要的调节操作少,在插入、删除节点时具有较少的性能消耗,也就是所谓的统计性能较好。回顾一下红黑树的五个特性:1.节点颜色为红或者
2016-08-15 17:00:38 479
原创 红黑树的插入与删除(一)
红黑树作为同样提供O(log n)查询的树结构,通常用于关联数组的使用中,相对于AVL树,在插入和删除操作中能够以更少的调节操作来位置平衡,AVL树的平衡唯一标准就是其高度,
2016-08-15 13:12:13 858
原创 AVL平衡二叉树
平衡二叉树定义AVL树也就是所谓的平衡二叉树,查找、删除、插入最坏情况下为O(log n),维持树的平衡只需要几次旋转即可。保证任意一个节点的左子树高度与右子树高度相差不大于1,默认树为空时高度为0。节点结构为了后续操作简洁性,先给出节点结构final class node{ int value=0;//键值 int height=1;//节点高度 node left=nul
2016-08-11 00:17:50 1713 1
原创 操作系统内存管理
内存作为重要的系统资源,是操作系统重点的管理对象。操作系统中提供的对于内存的管理策略可以从两个方面来分析:1.内存的利用率如何提高资源的利用率当然是系统的重头任务,当前很显然的方式就是多道程序并发运行,避免内存空间的浪费,这也是操作系统所选择的方式。为了能够使内存中同时存在多个进程,需要给进程分配一定的独立空间(先不考虑共享内存、纯代码之类的东西),分配方式有许多,例如将进程分配在连续内存
2016-08-07 15:40:02 999
原创 操作系统进程与线程
操作系统作为计算机硬件和用户(用户程序)的中间层,负责管理硬件资源和软件资源,协调程序对硬件的使用,相当于定义了一套访问规则,起到类似于协议的作用。进程的定义操作系统的并发特性,意思就是无论是单处理器或者多处理器,同一时间都存在多个正在运行的程序,即进程。一般意思上,可以简单的认为,所谓进程就是程序在数据集上的运行过程,作用当然是执行某个任务。所以也可以把程序和进程按照静态和动态两种概念分
2016-08-06 00:07:34 386
原创 计算树中两点之间的距离
今天看到的一个编程题,拿上来仅供大家参考,存在编程不规范的地方,望大家不吝指出!题目:要求倒不麻烦,一个节点数据不重复的二叉树,设其元素类型为整型,找出最小元素与最大元素之间的路径长度,即两个节点之间的连线距离,不是节点个数。过程:以数组元素来构建二叉树,自定义数组为{2,3,1,8,5,7,4,6},以(2*i+1,2*i+2)表示子节点,构建树结构如图:代码:c
2016-08-03 00:18:18 4154
原创 InnoDB存储引擎_数据库隔离级别(二)
InnoDB存储引擎提供了两个特点1.事务2.行锁关于事务的四种隔离级别,在上篇已经说过了,关于可重复读隔离策略能够防止“幻读”问题,需要根据InnoDB的加锁策略来分析。InnoDB支持的行锁是指通过索引实现对结果记录集合加锁,可以理解为对索引加锁,来保证根据索引搜索的范围内,存在“范围锁”,之所以这么说,是因为如果表中不存在索引,则可能加锁的范围为整张表,即升级为“表锁”。
2016-07-31 14:01:34 589
原创 InnoDB存储引擎_数据库隔离级别(一)
并发访问在许多地方都被使用,用以提高对资源的利用率,例如操作系统中多道程序访问,提高CPU和内存的利用率。与并发紧密相关的就是共享资源的安全访问,通常利用加锁或者限制访问数量的机制来保证数据结构的一致性和操作结果的正确性。数据库中引入事务隔离来保证在一定程度上的正确性,之所以说是一定程度上,因为在并发访问中使用隔离策略,其实是对访问顺序的一个限制,是在向串行化方向的靠拢。所以给出的几种隔离策略
2016-07-30 12:12:25 1333
原创 DNS域名解析
DNS(Domain Name System)域名系统,即域名解析系统,作用就是将浏览器中输入的网址解析为IP地址,然后发起http请求。虽然不知道最初什么原因产生的域名系统,但是一个很明显的驱动力就是直接输入地址来访问网站是太麻烦的。域名的划分有几个等级,最常见的几个顶级的域名域,例如.edu表示的教育机构,.gov表示政府机构等,域名最后的一个“.”,表示根域,不过通常我们都不写,根域名服
2016-07-26 16:41:59 829
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人