算法

设计模式 一一一 策略模式

佐手、 提交于 2020-03-08 01:39:34
策略模式(Strategy): 概念:对于一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换。 目的:环境仅依赖抽象策略,但是不依赖具体的某个策略,故可以做到在不改变环境的前提下,进行策略的更换。 优点:提供了管理一个算法族的解决方案,可以避免使用多重条件语句来判断具体采用哪个算法。 缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类;策略模式会造成很多(策略)类。 角色: 环境(Context):持有一个Strategy类的引用。 抽象策略(Strategy):所有的具体策略类必须实现此接口。 具体策略(ConcreteStrategy):包装了相关的算法。 jdk中的策略模式: /** * 环境ThreadPoolExecutor:持有一个RejectedExecutionHandler类的引用 */ public class ThreadPoolExecutor extends AbstractExecutorService { private volatile RejectedExecutionHandler handler; } /** * 抽象策略RejectedExecutionHandler */ public interface RejectedExecutionHandler { void rejectedExecution

JVM—垃圾回收GC算法

不想你离开。 提交于 2020-03-07 18:59:27
1 GC算法简介 算法 特点 标记-清除 分为“标记”和“清除”两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块。 标记-整理 先标记、再整理,最后清理 分代收集 划分新生代和老年代 2 标记-清除 2.1 流程 分为“标记”和“清除”两个阶段: (1)首先标记出所需要回收的对象(引用计数法和可达性分析,两次标记过程); (2)在标记完成后统一回收所有被标记的对象。 2.2 缺点 (1)效率问题:标记和清除两个过程的效率不高; (2)空间问题:标记清除后会 产生大量不连续的内存碎片 ,导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 3 复制 3.1 流程 可以解决效率问题,将可用的内存 按容量划分为大小相等的两块 。 (1)每次只使用其中的一块; (2)当这一块用完了,就将还存活的对象复制到另一块上; (3)然后再把已使用的内存空间清理掉。 3.2 优点    每次对整个半区 进行内存回收,避免内存碎片问题,只需 移动堆顶指针 ,按顺序分配内存即可,实现简单,运行高效。 3.3 缺点   将 内存缩小为原来的一半 ,代价高;当对象存活率较高时需要进行较多的复制操作,效率降低。 3.4 应用   回收 新生代 ,新生代中分为Eden空间和两块较小的Survivor空间

LeetCode算法题-Maximize Distance to Closest Person(Java实现)

☆樱花仙子☆ 提交于 2020-03-07 08:09:07
这是悦乐书的第 328 次更新,第 351 篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第198题(顺位题号是849)。在一排座位中,1表示一个人坐在该座位上,0表示座位是空的。在这些座位中,至少有一个空座位,至少有一个人坐着。Alex想坐在座位上,以便他和离他最近的人之间的距离最远。返回距离最近的人的最大距离。例如: 输入:[1,0,0,0,1,0,1] 输出:2 说明:如果Alex坐在第二个空座位(seats[2]),那么离最近的人距离为2。如果Alex坐在任何其他空座位上,则离最近的人的距离为1。因此,到最近的人的最大距离是2。 输入:[1,0,0,0] 输出:3 说明:如果Alex坐在最后一个座位上,那么离他最近的人距离为3。这是可能的最大距离,所以答案是3。 注意 : 1 <= seats.length <= 20000 所有座位中仅包含0或1,至少一个0,至少一个1。 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。 02 解题 在解题前,先来看看题目的意思。Alex想要在一排座位中,找到一个离人最近但是距离最远的座位,题目通过一个数组来表示一排座位,元素值为0表示当前这个座位是空的,Alex可以坐,为1时表示当前这个座位有人坐了,Alex不能坐,也就是说

双线性插值算法进行图像缩放及性能效果优化

二次信任 提交于 2020-03-07 07:06:57
一)转自http://handspeaker.iteye.com/blog/1545126 最近在编程时用到了双线性插值算法,对图像进行缩放。网上有很多这方面的资料,介绍的也算明白。但是,这些文章只介绍了算法,并没有具体说怎么实现以及怎么实现最好,举个例子,你可以按照网上文章的算法自己写一个双线性插值程序,用它对一张图片进行处理,然后再用matlab或者openCV的resize函数对同一张图片进行处理,得到的结果是不一样的,如果源图片较小,效果差距就更大。以下是对于双线性插值的讲解以及上述现象的解释: 1.双线性插值 假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。 显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。如果你的对应坐标是(2.5,4.5),那么最近的四个像素是(2,4)、(2,5)、(3,4),(3,5)。 若图像为灰度图像,那么(i,j)点的灰度值可以通过一下公式计算: f(i,j)=w1*p1+w2*p2+w3*p3+w4*p4; 其中,pi

负载均衡算法 : 加权轮询

有些话、适合烂在心里 提交于 2020-03-07 03:51:46
1 加权轮询算法背景 轮询算法没有考虑每台服务器的处理能力,实际情况是每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,加权轮询算法的原理就是:根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能接受相应权值数的服务请求。 首先看一个简单的Nginx负载均衡配置。 http { upstream cluster { server a weight=1; server b weight=2; server c weight=4; } ... }   按照上述配置,Nginx每收到7个客户端的请求,会把其中的1个转发给后端a,把其中的2个转发给后端b,把其中的4个转发给后端c。 2 加权轮询算法描述 假设有 N 台实例 S = {S1, S2, …, Sn},配置权重 W = {W1, W2, …, Wn},有效权重 CW = {CW1, CW2, …, CWn}。每个实例 i 除了存在一个配置权重 Wi 外,还存在一个当前有效权重 CWi,且 CWi 初始化为 Wi;指示变量 currentPos 表示当前选择的实例 ID,初始化为 -1;所有实例的配置权重和为 weightSum; 那么,调度算法可以描述为: 初始每个实例 i 的 当前有效权重 CWi 为 配置权重 Wi,并求得配置权重和 weightSum; 选出 当前有效权重 最大 的实例,将

算法 acm?(一些转载)

做~自己de王妃 提交于 2020-03-07 03:16:32
转载: 这么说吧,功利一点,算法不好或者不达标,进好公司基本没戏,说得逼格高一点,算法是程序的灵魂,如果程序员都不懂算法,那就真成了搬砖的,写个程序和计算1+1就没什么区别了,这就和一些人说学数学对写代码没啥用一样,通常说这些话的都是水平不咋地的程序员,逼格再高一点,算法锻炼的是解决问题的思维方式,有人说那是靠刷题刷出来的,可是除了少数天才,有谁的学习过程不是重复练习的过程呢?难道高中学到的东西不是靠做习题学习到的吗?只是学习能力强的人能通过练习将知识化为己用,举一反三而已,题主千万不要被那些浅薄的观念欺骗。 转载: 优秀的小伙伴都知道,学好算法与数据结构, 不单单是为了应付技术面试的需要,更重要是提升自身编程水平。 那么程序员到底需不需要精通算法呢? 首先,一个出色的程序员并不一定要精通算法,毕竟发展的方向很多。 但是,一个人连基本的算法都掌握不了,他肯定成不了优秀的程序员。 前者是选择,后者是能力,能力不够的人谈选择,就是找借口。 有个程序员小哥哥说: 搬砖 + 算法 = 稳定快速的搬砖 , 真相了,高质量的代码,才能让项目运行如飞! 确认过眼神 ,修炼过算法的人,是高手程序员没错了······ 转载: 这么多年,你听说过技术过时,什么时候听说过算法过时,不仅没有过时,因为机器学习、大数据的要求,算法变得越来越重要了 转载: 算法对于非专业人来说,确实比较难理解

快速排序算法实现:单向扫描法&&双向扫描法&&三分法(有相同元素)

霸气de小男生 提交于 2020-03-07 03:10:04
单向指针扫描 void Swap ( int i , int j , int array [ ] ) //交换数组内两个元素 { int temp ; temp = array [ i ] ; array [ i ] = array [ j ] ; array [ j ] = temp ; } void QuickSort ( int begin , int end , int array [ ] ) //快速排序 { if ( begin < end ) { int mid = Partition ( begin , end , array ) ; //mid返回中间项 QuickSort ( begin , mid - 1 , array ) ; //递归调用,对mid左边的进行快排 QuickSort ( mid + 1 , end , array ) ; //递归调用,对mid右边的进行快排 } } int Partition ( int begin , int end , int array [ ] ) //单向扫描快排中分割函数,结果返回中间项 { int pivot = array [ begin ] ; //初始中间项值=首元素 int sp = begin + 1 ; //扫描指针下标 int bigger = end ; //bigger指针初始在尾部

简明版 垃圾回收算法

两盒软妹~` 提交于 2020-03-07 01:08:03
本文是学习《深入理解JAVA虚拟机》的学习笔记(2) 此篇是概念性东西,可结合下节的垃圾回收器一起看 Java是可以自动回收内存的,什么时候需要虚拟机调优呢?当垃圾回收成为系统达到更高并发的瓶颈时。 垃圾回收第一步要确认哪些对象可以回收。就是那些不能再被任何途径使用到的对象。怎么找到这些对象,这就谈到可达性分析法。 引用计数法,由于循环引用的问题,主流虚拟机均没选用它,这里就不再论述。 可达性分析(Reachability Analysis) 基本算法思想是通过一系列的GC Roots 开始搜索,所走过的路径就是引用链(Reference Chain),当某个对象没有任何引用链连接,即认为此对象不可用,就是被回收的对象。 那啥是GC Roots呢,在JAVA语言中包括: 虚拟机栈中引用的对象 方法区中静态属性引用的对象 方法区中常量引用的对象 本地方法栈中引用的对象 回收方法区 方法区中 废弃常量与无用类也可回收。其中判定无用类的条件很苛刻,有兴趣的可自己研究。 垃圾回收算法 标记-清除算法(Mark-Sweep) 最基础的算法,其后的算法是在此思路上有针对的改进。简单说,就是先标志出所有需要回收的对象,再一次性回收所有被标记的对象。 不足有两个:一是效率不高,二是产生大量不连续的内存碎片。 复制算法(Copying) 解决回收效率问题。把可用内存一分为二,每次只使用其中一块