策略模式(Strategy Pattern)用于算法的自由切换和扩展,是一种使用较为广泛的行为型模式。策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便地更换算法或者增加新的算法。它将每一个算法封装在一个称为具体策略的类中,同时为其提供统一的抽象策略类,而使用这些算法完成某一业务功能的类称为环境类。
策略模式实现了算法定义和算法使用的分离,它通过继承和多态的机制实现对算法族的使用和管理,是一种简单易用的对象行为型模式。
抽象策略类
public abstract class Strategy {
public abstract void algorithm( ); //声明抽象算法
}
具体策略类
public class ConcreteStrategyA extends Strategy {
//算法的具体实现
public void algorithm( ) {
//算法A
}
}
环境类
public class Context {
private Strategy strategy; //维持一个对抽象策略类的引用
//注入策略对象
public void setStrategy(Strategy strategy) {
this.strategy= strategy;
}
//调用策略类中的算法
public void algorithm( ) {
strategy.algorithm( );
}
}
客户类
……
Context context = new Context( );
Strategy strategy;
strategy = new ConcreteStrategyA( );
//可在运行时指定类型,通过配置文件和反射机制实现
context.setStrategy(strategy);
context.algorithm( );
……
旅游选择不同的出行方式
环境类:Persion
public class Person {
private TravelStrategy strategy;
public void setStrategy(TravelStrategy strategy) {
this.strategy = strategy;
}
public void travel(){
strategy.travel();
}
}
抽象策略类
public interface TravelStrategy {
void travel();
}
具体策略类
public class BicycleStrategy implements TravelStrategy{
@Override
public void travel() {
System.out.println("自行车游!");
}
}
具体策略类
public class WorkStrategy implements TravelStrategy{
@Override
public void travel() {
System.out.println("徒步旅行!");
}
}
具体策略类
public class TrainStrategy implements TravelStrategy{
@Override
public void travel() {
System.out.println("乘火车旅行!");
}
}
具体策略类
public class AirplaneStategy implements TravelStrategy{
@Override
public void travel() {
System.out.println("飞机旅行!");
}
}
客户类
public class Client {
public static void main(String[] args) {
Person person = new Person();
TravelStrategy strategy = (TravelStrategy) XMLUtil.getBean();
person.setStrategy(strategy);
person.travel();
}
}
本文来自博客园,作者:街酒,转载请注明原文链接:http://www.cnblogs.com/sorrymine/p/17421669.html
三角形网格仍然是曲面几何图形中最流行的数据表示形式。这种无处不在的表示本质上是一种混合的表示,它将连续顶点位置与离散的拓扑三角测量脱钩。不幸的是,三角剖分的组合性质阻止了接管任何给定表面的可能的网格空间上的导数。因此,迄今为止,网格处理和优化技术一直无法真正利用现代优化框架中的模块化梯度下降组件。在这项工作中,我们提出了一个可微曲面三角测量,使在底层曲面三角测量空间上优化任何每个顶点或每面可微目标函数。我们的方法建立在任何二维三角测量都可以通过适当的扰动加权德拉内三角测量来实现的结果之上。我们通过提出经典加权德拉内三角剖解和顶点权重和顶点位置的优化,将此结果转化为一种计算算法。我们通过将形状分解为可开发集,并使用适当的边界约束对每个集进行可分网格,将算法扩展到三维。我们在一系列难以优化的目标函数上证明了我们的方法在各种平面和表面网格上的有效性。我们的代码可以在网上找到:这个https网址。原文题目:DifferentiableSurfaceTriangulation原文:Trianglemeshesremainthemostpopulardatarepresentationforsur
词法分析和语法分析词法分析(lexicalanalysis)1和语法分析(syntacticanalysis,又称为parsing)2,同属于编译器的前端部分。词法分析器(lexer)将输入拆分为一个个的token,然后语法分析器根据特定的语法规则将输入的token解析为一个结构化的表示,一般为抽象语法树(abstractsyntaxtree),供之后的语义分析器使用。在实际开发中,为了简化写词法分析和语法分析的过程,常常会使用生成器来代替人工操作,Lex和Yacc就是生成器的经典实现3。Lex是LexicalAnalyzer的简写,是一个词法分析器的生成器,Yacc是YetAnotherCompilerCompiler的简写,是一个语法分析器的生成器。这两个工具允许用户用类似BNF范式的写法声明一个词法描述和语法描述文件,然后自动生成能够解析对应词法语法的C语言程序。这个解决方案直观有效,实际应用也很普遍,不止是C语言,在其他平台也常有类似的实现,例如Java的ANTLR。但是它也存在一些问题,首先是用机器生成的代码质量往往不如手写高。这个代码质量的问题在程序正常运作的时候倒也不算什
相信大家都知道二叉树,今天我们来使用C#语言来生成一个二叉排序树。我们先来看看二叉排序树的定义(来自百度百科):二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值; (2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的节点。 二叉排序树,其实很简单,有一个根节点,如果有左节点,左节点必须小于根节点的值;右节点则必须大于根节点的值,没有相同值的节点,请看下图(图片来源百度百科):这里的根节点是8,左子树是3,右子树是10,接下来的数据都是符号一个二叉排序树的规则的,这就是一个二叉排序树。接下来我们就用代码来实现一个二叉排序树。我们先新建一个类,名为TreeusingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Web; ///<summary> ///Tree的摘要说明 ///</summary> publiccl
1任务分析医学领域中,为了满足病情诊断、治疗方案制定等需求,常常需要对病人进行扫描,从而确定各内部器官的情况。深度学习方法出现以前,这个过程主要是由医生直接完成。尽管成熟医生的判断精度较高,但是培养这样的医生需要很长的周期;而且由于人会受到诸如精力限制、情绪波动等因素的影响,判断的精度存在不稳定性。因此,为了辅助诊断,减小误诊的概率,现阶段的医学图像分析中经常会借助深度学习的方法。医学图像分割主要处理的是医学领域所涉及到的各种图像的分割问题,比如常见的核磁共振(MRI)扫描图像。其主要任务是,从这些医学图像中分割出兴趣区域,比如特定器官部位、兴趣目标(如肿瘤)等。与日常生活中常见场景的分割任务不同,医学图像(如MRI图像)由于图像获取设备的影响,会出现对比度低、信噪比低、光强低等问题;且器官本身存在运动和形变(如心脏),个体之间也有差异。这些因素导致了医学图像分割的难度和其自身的算法设计特点。大脑区域及形状个体差异示意图下面我们以脑区域分割为例,讨论一下该任务的难点,并通过一个应用实例来进一步理解医学图像中的脑区域分割问题。2难点介绍1.将脑部区域与非脑部区域分离脑部区域分割中的第一个
常见的移动机器人模型,差速,麦克纳姆轮的全向,阿克曼车式等。直道行驶--视觉弯道行驶--视觉全国大学生智能汽车竞赛-室外光电组无人驾驶挑战赛-2019 https://blog.csdn.net/ZhangRelay/article/details/89639965 仿真环境(激光雷达lidar):实车测试(激光雷达lidar):左转和右转半径示意主流的仿真软件都提供了这些模型的机器人,如webots,V-rep,Gazebo.结构示意如上图。重点参考:http://wiki.ros.org/Ackermann%20Grouphttp://wiki.ros.org/stepback_and_steerturn_recovery部分代码只支持遥控,并不支持此类(ackermann)模型的导航,原生的ROS导航包也不能直接使用,需要调整。ROS官网wiki有ackermann兴趣小组:为Ackermann机器人的控制,导航和模拟仿真生成通用接口。teb_local_plannerstepback_and_steerturn_recovery设置并测试优化在本教程中,学习如何运行轨迹优化以
朋友写的一些算法和数据结构文章,我觉得写得非常不错,给大家推荐一下! 作者:倪升武公众号来源:程序员私房菜 如果说数据结构是骨架,那么算法就是灵魂。没了骨架,灵魂没有实体寄托;没了灵魂,骨架也是个空壳。两者相辅相成,缺一不可,在开发中起到了砥柱中流的作用。前面我连载了一些比较经典而且面试中经常出现的数据结构和算法文章,其实除了面试中经常出现以外,做开发的,对这些内功的掌握也是必须的,虽然说现在大部分大数据结构已经有实现了,但是,招式只是形式,想练神功,必须懂心法。这篇文章,我把之前我连载的数据结构和算法文章整合在一起,然后对各种数据结构和算法做一总结,对比一下它们的效率,本文值得大家转发和收藏!数据结构篇1.如果让你手写个栈和队列,你还会写吗? 2.开发了那么多项目,你能自己手写个健壮的链表出来吗? 3.下次面试若再被问到二叉树,希望你能对答如流!4.面试还在被红-黑树虐?看完这篇轻松搞定面试官! 5.2-3-4树是如何解决二叉树中非平衡问题的? 6.读完这篇,希望你能真正理解什么是哈希表 7.堆其实是个很简单的数据结构 8.我敢说,这图绝对跟你想象中的不太一样! 9.图也有权重,你
在mongoDB中,逻辑运算也是较为常用的运算,这些逻辑运算通常包含与或非,取反,存在等等。本文描述mongoDB几类常用的逻辑运算符同时给出演示示例,供大家参考。 一、mongoDB中的几种逻辑运算符$or逻辑或 $and逻辑与 $not逻辑非 $nor逻辑or的取反 $exists存在逻辑 $type查询键的数据类型复制二、演示逻辑运算演示集合persons中用到的文档数据请参考:mongoDB比较运算符1.$orSyntax:{$or:[{<expression1>},{<expression2>},...,{<expressionN>}]} db.persons.find({$or:[{age:25},{email:"robinson.cheng@qq.com"}]})//不同的键基于$or操作符的查询 db.persons.find({$or:[{age:25},{age:{$eq:27}}]})//相同的键基于$or操作符的查询 db.persons.find({age:{$in:[25,27]}})//对于相同键的
一定要认真看完这篇文章✌ 大树不敢保证看完你就可掌握动态规划,但是,你一定可以AC动态规划中的路径问题!!? 由于篇幅限制也为了不让大家产生阅读疲劳,980.不同路径III这道题目会单独写一篇作为路径问题的收尾篇。动态规划中的路径问题,题目来自于LeetCode,子标题为题号名称的格式。62不同路径一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?img例如,上图是一个7x3的网格。有多少可能的路径?示例1:输入:m=3,n=2输出:3解释:从左上角开始,总共有3条路径可以到达右下角。 向右->向右->向下向右->向下->向右向下->向右->向右示例2:输入:m=7,n=3输出:28提示:1<=m,n<=100题目数据保证答案小于等于2*10^9SolutionclassSolution{ publicintuniquePaths(intm,intn){ //定义dp数组,数组中的值代表到达
工控现场常常需要互传工控项目文件,最常用的有通过QQ、微信、网盘等第三方软件分享,通过网络共享、通过外界存储设备分享等很多种方法,但是,如果遇到工控现场没有网络,或者没有外接存储设备,或者电脑没有管理员权限的时候,项目文件的传输就变的有难度起来。使用Windows11或Windows10(版本1803或更高版本)的“就近共享”功能,就可以通过蓝牙或WLAN与附近的设备共享项目文档、照片等。若要使用就近共享功能,所要进行连接的两台电脑(即要发起共享的电脑和接收共享的电脑)必须具有蓝牙功能,并且必须运行Windows101803或更高版本。就近共享先在自己的电脑上打开"操作中心",点击"就近共享",选项变蓝即为打开状态,在接收共享的电脑上执行相同操作。若未开启,那么需要打开设置界面,选择系统,选择体验共享。在跨设备共享下,开启允许其他设备上的应用打开并给此设备上的应用发送消息,反之亦然。同时,设置我可以从以下项目共享或接收,选择仅我的设备或附近的任何人。共享文档在要发起文档共享的电脑上,选择所要共享的文件,点击共享菜单下的共享,然后选择要接收共享的设
前言 我们目前已经学习了设计模式的7种设计原则。下面本该是直接进入具体的设计模式系列文章。 但是呢在我们学习设计模式之前我们还是有必要了解一下uml图。因为后续的设计模式文章不出意外应该会很多地方使用到uml图。如果你连uml图都看不懂的话,那么学习起来肯定会有一定的难度。 所以说,这一节就作为承上启下的章节,让我们来了解一下uml图吧。(当然如果你已经会UML图了,你完全可以跳过这个章节) 介绍 按照惯例,我们还是要让大家知道什么是UML图: UML有很多种类,什么用例图,静态结构图,动态行为图。 而作为java程序猿,我们最关注的的还是静态结构图中的类图即可,所以你只需要记住这一句话就可以了:UML图就是用来描述各个类,接口之间的关系图。 我们下面包括今后的UML类图都是用IntelliJIDEA自带的类图工具来展示,每个软件的画图风格会有一点点区别,但是核心的东西是不会变。 好的,我开始进入主题 类之间的关系 类与类之间的关系我们可以分为以下几点: 由于我们大部分时间使用的是idea自带的工具UmlSupport来生成的uml图(快捷键:ctrl+alt+shift+u)。虽然
给配置文件添加返回内容: <resultname="hint"type="stream"> <paramname="contentType">text/html</param> <paramname="inputName">hint</param> </result>复制 在action中添加参数: privateInputStreamhint; publicInputStreamgetHint(){ returnhint; } publicvoidsetHint(InputStreamhint){ this.hint=hint; }复制 在action中添加一个方法: privateStringtranscoding(Stringstr){ try{ returnnewString(str.getBytes("utf-8"),"iso-8859-1"); }catch(UnsupportedEncodingExceptione){ e.printStackTrace(); } return
每次合并两个同余模方程,然后用exgcd解即可。 llLCM(lla,llb) { returna/__gcd(a,b)*b; } voidexgcd(lla,llb,ll&d,ll&x,ll&y) { if(b==0){ x=1;y=0;d=a; return; } exgcd(b,a%b,d,y,x); y-=x*(a/b); } llMLE(lla,llb,lln) { llx,y,d; exgcd(a,n,d,x,y); if(b%d)return-1; x*=(b/d); return(x%n+n)%n; } llex_china(ll*a,ll*m,intn) { llx,y,d; llM=1,A=0; REP(i,1,n){ llk=MLE(m[i],A-a[i],M); if(k==-1)return-1; A=k*m[i]+a[i]; M=LCM(M,m[i]); } return(A+M)%M; }复制 ViewCode 没有AC不了的题,只有不努力的ACMER!
今天和大家分享一些关于windowsphoneui虚拟化和数据虚拟化的一些知识。 也顺便回答我上一篇【LongListSelector控件在wp7和wp8中的不同之处】里,留下的那个问题,微软为什么推荐使用longlistselector. 如果不是新人,那么对于"虚拟化"这个词应该不陌生。 "虚拟化"简单来说,就是在数据量很大的时候,我们只加载与可视区域(如手机屏幕)相应的少量数据。 我们先来看一下UI虚拟化。 一:WindowsphoneUI虚拟化 对于wp的ui虚拟化,其实我们并不需要花太多心思,因为系统自带且用的最多的listbox和longlistselector。 已经是帮我们实现了虚拟化。我们只需要注意别把美好的虚拟化破坏掉就好了。 1.首先,演示一下虚拟化。 MainPageViewMode.cs publicclassMainPageViewModel { //省略 publicMainPageViewModel() {//我们模拟1000条商品数据 listProduct=newList<Product>(1000); for(inti=0;i<
手机请求代理到Mac 在ProxySettings中第一个ProxiesTab中填写port(默认就行) 并勾选上EnabletransparentHTTPproxying 然后在手机设置代理手机端IP填写Mac的IPport就是刚才设置的值默认值为8888 这样手机的请求就代理到Charles中了 MapRemote设置 这个设置就是请求转发可以将A路径的请求转发到B路径上 MapRemote菜单中勾选EnableMapRemote 然后Add 对于filetofile的转发直接在Host中填写完整路径,在Host失焦的时候就自动的填写Path了 对于pathtopath的转发From的path结尾要有*号 比如将a.com/hehe/images/xxx转发到b.com/static/haha/images/xxx 第一个path应该是/hehe/images/*第二个Path是/static/haha/images/ 并勾选PerverveHostHeader PS设置了Map的请求 在Record的显示会告知MappedFromURL(原请求) 代理 和Fiddler不同的是,
1.vue设置代理 在vue.config.js文件中做配置 module.exports={ devServer:{ proxy:{ 'task':{ target:'后端接口的服务地址', changeOring:true,//设置是否将host更替为代理url, secure:false, } } } }复制 二、vue项目打包上线 1.开发环境到生产环境的转变 项目开发结束之后,首先我们需要通知后端,获取一个线上的路径,之后将之前的开发路径切换为线上路径。 打开项目中config文件夹里面的dev.env.js文件。 'usestrict' constmerge=require('webpack-merge') constprodEnv=require('./prod.env') module.exports=merge(prodEnv,{ NODE_ENV:'"development"', //BASE_API:'"http://192.168.1.***:3838/"'//开发者路径 BASE_API:'"http://sdk.********.cn:3838
这开始学习面向对象了,感觉开始难起来了。 方法重载:两个方法名一样,参数不一样。区分:参数类型,参数个数,参数顺序。 比如: publicvoidlogin(){} publicvoidlogin(Stringusername,Stringpassword){} 万物皆对象,对象由我关注而产生,这是面向对象的根本认识。类是对象的抽象(相同属性与行为的对象)。对象是类的实例。 类是具有相同属性和行为的一组对象的集合。 一个方法的签名包括一个形式参数(parameter)的列表,形式参数列表用于声明传递到方法中的数据的类型。传递给形式参数的数据称为实际参数。 当实际参数传递给形式参数时,世纪参数的数据被复制给形式参数,在方法调用之间复制数据的过程称为按值调用。 Java中只有值传递(引用数据内存地址也是值) 方法传递的引用数据类型是传递的一个引用地址(内存地址) newStudent()是在堆中,而Student()是一个构造方法(构造器) 构造器的特点 1.方法名必须与类名相同。 2.不能有返回类型。 构造方法顺序 1.
前言: 前两篇分别是:利用AFL对LAVA-M数据集测试和加入mopt编写同步启动脚本,这是最后一篇,在前面的基础上加上ijon-AFL的测试(Angora、QSYM、需要单独再开一个虚拟机测试,环境冲突,计划暂且搁置),并优化一键启动脚本。 为什么挑选这五个,不仅仅是因为开源的原因,还因为这五个优化方向各有不同: AFL:谷歌开发的模糊测试产品,属于开创现在这几年模糊测试的先河,可以看到超级多的fuzzer就是在AFL的基础上进行的改进,所以一定要有这个作为标杆; MOpt-AFL:这是19年的一篇顶会的文章,要加这个有三点:一是开源、二是改进代码清晰易读、三是论文的那个浙大实验室来这里进行过讲座,是因为那位老师的讲座和之后的交流我才对fuzz模糊测试感兴趣,找到自己之后的研究方向; Angora:是18年的SP的文章,选这个的原因有两点:一是开源、二是改进成熟,最近貌似是要从学术进入到工业中,足以可见这个项目的潜力其实不小;(因为环境问题需要单独另起一个虚拟机处理,留做下一个笔记); QSYM:18年USENIX的顶会文章,关于混合模糊测试的工具,原因有二:一是开源、二是混合模糊
消失之物 TimeLimit:10Sec MemoryLimit:128MB[Submit][Status][Discuss] Description ftiasch有N个物品,体积分别是W1,W2,...,WN。 由于她的疏忽,第i个物品丢失了. “要使用剩下的N-1物品装满容积为x的背包,有几种方法呢?”--这是经典的问题了。 她把答案记为Count(i,x),想要得到所有1<=i<=N,1<=x<=M的Count(i,x)表格。 Input 第1行:两个整数N和M,物品的数量和最大的容积。 第2行:N个整数W1,W2,...,WN,物品的体积。 Output 一个N×M的矩阵,Count(i,x)的末位数字。 SampleInput 32 112 SampleOutput 11 11 21 HINT 1≤N≤2×1e3,1≤M≤2×1e3 Solution 首先,我们发现,对于L,R: 去掉L,就是要用[
Description 舒克和贝塔终于下定决心要去营救被关押在众猫聚居的\(\mathrmA\)城中的大米同志。 \(\mathrmA\)城的构造是很奇怪的。\(\mathrmA\)城中的所有\(\mathrmN\)栋建筑沿着一条直线排列,而且没有两栋楼的高度是相同的。而大米同志就被关押在其中的某栋建筑中。每一栋建筑的顶上都是有一些猫们在看守的。如果按照从一端到另一端的顺序将所有的建筑编号为1到\(\mathrm{N}\),那么第\(\mathrm{i}\)栋建筑的高度为\(\mathrm{Hi}\),0顶上开始时的猫的数量为\(\mathrm{Ci}\)。 每一只猫不但可以看守住其所在建筑的楼顶,还可以看守住一些比它所在建筑要低的楼的楼顶。前提是没有被其他楼所挡住。A城中的建筑都是很高的,高到可以忽略它们之间的距离和它们的水平面面积。于是可以认为,楼\(\mathrm{i}\)上的猫能看守楼\(\mathrm{j}\)的楼顶,当且仅当楼\(\mathrm{i}\)的高度不低于楼\(\mathrm{j}\),且楼\(\mathrm{i}\)到楼\(\mathrm{j}\)之间的所有楼房
题目链接 题目思路 对于这种题目不太会写 参考博客 本质上思路就是考虑转移 所以考虑每个叶子节点的状态: 1.从根节点直接到达该节点u 2.从上一个节点转移过来 注意代码第\(18\)行加取地址符号 代码 #include<bits/stdc++.h> #definelllonglong #definefifirst #definesesecond usingnamespacestd; constintmaxn=1e6+5; llans=0; intn,tot; intdep[maxn]; inttmp=0; intpre=-1; vector<pair<int,int>>g[maxn]; intdfs1(intnow,intlen){ dep[now]=len; if(g[now].empty()){ return0; } for(auto&x:g[now]){ x.fi=dfs1(x.se,len+1); } sort(g[now].begin(),g[now].end()); returng[now].back().fi+1; } vo