重构

克鲁斯卡尔重构树总结

狂风中的少年 提交于 2019-12-01 07:09:24
作用:通过kruskal,我们可以求出两点之间经过边权的最大值最小可以是多少(即瓶颈路)。 如果是点权,则将边权设为两点的最大值。 求出 最小 生成树后,这个值就是树上路径最值。 但是,有时这样还不够。 我们可以这样建树:连接x,y时,新建点u,权值为边权,并将x,y的所属根的父节点都设为u。 用并查集维护这一过程。 这样,可以得到一棵二叉树,称为克鲁斯卡尔重构树。 此时,x到y的这个值就是树上x,y的lca的点权。 同时,我们可以通过倍增,把从x出发,经过不超过y的边(点)权,能到达的点表示为一棵子树,从而表示为区间。 代码: int getv(int x) { if(f[x]==x) return x; f[x]=getv(f[x]); return f[x]; } int gettree1(int n,int m,vector<int> ve[400010]) { for(int i=0;i<n;i++) f[i]=i; for(int i=0;i<m;i++) { px[i].x=x[i];px[i].y=y[i]; px[i].z=max(x[i],y[i]); } qsort(px,m,sizeof(SPx),cmp1); for(int i=0,j=n;i<m;i++) { int tx=getv(px[i].x),ty=getv(px[i].y); if(tx=

设计模式之美学习(一):设计模式对编程工作者是很重要的,它的作用不言而喻。

强颜欢笑 提交于 2019-12-01 02:40:19
继数据结构与算法之美后,王争老师的专栏又开始更新了,这次是《设计模式之美》,希望学习之后会对自己有所提升。在此记录下自己的学习笔记,希望对自己或者看到的读者都有所裨益。 为什么每个程序员都要尽早地学习并掌握设计模式相关知识? 1. 应对面试中的设计模式相关问题 学习设计模式和算法一样,最功利、最直接的目的,可能就是应对面试了。 不管你是前端工程师、后端工程师,还是全栈工程师,在求职面试中,设计模式问题是被问得频率比较高的一类问题。特别是一些像 BAT 、 TMD 这样的大公司,比较重视候选人的基本功,经常会拿算法、设计模式之类的问题来考察候选人。 2. 告别写被人吐槽的烂代码 我们经常说, Talk is cheap,show me the code 。实际上,代码能力是一个程序员最基础的能力,是基本功,是展示一个程序员基础素养的最直接的衡量标准。你写的代码,实际上就是你名片。 3. 提高复杂代码的设计和开发能力 大部分工程师比较熟悉的都是编程语言、工具、框架这些东西,因为每天的工作就是在框架里根据业务需求,填充代码。实际上,这样的工作并不需要你具备很强的代码设计能力,只要单纯地能理解业务,翻译成代码就可以了。 但是,有一天, leader 让开发一个跟业务无关的比较通用的功能模块,面对这样稍微复杂的代码设计和开发,就发现会有点力不从心,不知从何下手了。因为只是完成功能、代码能用

设计模式之美学习(一):设计模式对编程工作者是很重要的,它的作用不言而喻。

十年热恋 提交于 2019-12-01 02:34:39
继数据结构与算法之美后,王争老师的专栏又开始更新了,这次是《设计模式之美》,希望学习之后会对自己有所提升。在此记录下自己的学习笔记,希望对自己或者看到的读者都有所裨益。 为什么每个程序员都要尽早地学习并掌握设计模式相关知识? 1. 应对面试中的设计模式相关问题 学习设计模式和算法一样,最功利、最直接的目的,可能就是应对面试了。 不管你是前端工程师、后端工程师,还是全栈工程师,在求职面试中,设计模式问题是被问得频率比较高的一类问题。特别是一些像 BAT 、 TMD 这样的大公司,比较重视候选人的基本功,经常会拿算法、设计模式之类的问题来考察候选人。 2. 告别写被人吐槽的烂代码 我们经常说, Talk is cheap,show me the code 。实际上,代码能力是一个程序员最基础的能力,是基本功,是展示一个程序员基础素养的最直接的衡量标准。你写的代码,实际上就是你名片。 3. 提高复杂代码的设计和开发能力 大部分工程师比较熟悉的都是编程语言、工具、框架这些东西,因为每天的工作就是在框架里根据业务需求,填充代码。实际上,这样的工作并不需要你具备很强的代码设计能力,只要单纯地能理解业务,翻译成代码就可以了。 但是,有一天, leader 让开发一个跟业务无关的比较通用的功能模块,面对这样稍微复杂的代码设计和开发,就发现会有点力不从心,不知从何下手了。因为只是完成功能、代码能用

superword中一次精彩的重构

时光总嘲笑我的痴心妄想 提交于 2019-12-01 02:11:41
我们先来看看需要重构的 功能 是一个下拉选择框,可任意选择11部词典中的一部,访问地址: http://123.56.99.179/select/dictionary-select.jsp?dict=RANDOMHOUSE ,在HTML中的效果如下图所示: HTML代码如下: <select name="dict" id="dict" onchange="update();"> <option value="ICIBA">iCIBA</option> <option value="YOUDAO">Youdao</option> <option value="COLLINS">Collins</option> <option value="WEBSTER">Webster's</option> <option value="OXFORD">Oxford</option> <option value="CAMBRIDGE">Cambridge</option> <option value="MACMILLAN">Macmillan</option> <option value="HERITAGE">Heritage</option> <option value="WIKTIONARY">Wiktionary</option> <option value="WORDNET"

初晴

荒凉一梦 提交于 2019-12-01 00:28:57
1 这周从一个印度大客户那边得到了关于在产品Performance方面进一步提升的需求,于是花了不少时间重新梳理和分析了之前的code,的确是发现了不少潜在的可以通过重构进一步提高的地方。反观之前在开发新feature的过程中,往往总只是过于专注功能本身的实现,而缺乏了宏观上对于代码结构和性能的优化。 Martin Fowler专门有一本书叫做《重构:改善既有代码的设计》(Refactoring: Improving the Design of Existing Code),就是来解释了重构的原理和最佳实践方式,并且指出了何时何地应该开始挖掘的你的代码并且以求改善。 其实在实际工作中,项目经理往往并不会主动要求开发者进行重构,甚至当开发者提出重构需求时还会招来反对。比如一个项目还剩一个礼拜,但还有N个需求没完成,现在你请求花费两天时间,“什么都不做”,开发者几乎都无法承受这样的压力。但是,比延误工期更严重的是,一个臃肿不堪,难以修改的项目,最终将面临添加需求困难,运行效率低下,以至于达不到可用的性能,因此最终失败几乎无可避免。 因此作为开发者来说,如何处理好这个矛盾呢?一个比较可行的方法是,把重构当做开发的一部分,一边开发一边重构,先快速的堆叠代码,实现功能,然后在功能不变的基础上(写好单元测试),逐步重构。 2 周六一早,从湾区万里无云飞到了西雅图烟雨朦胧,无论是在

第二十四章 重构

余生长醉 提交于 2019-11-30 06:32:24
重构简介 重构定义: 在不改变软件外部行为的前提下,对其内部结构进行改变,使之更容易理解以便于修改; 尽可能地将一个程序分解为多个组成部分。 重构的理由 代码重复; 冗长的子程序; 循环过长或嵌套过深; 类的接口未能提供层次一致的抽象; 拥有太多参数的参数列表; 类的内部修改往往被局限于某个部分; 变化导致对多个类的相同修改; 对继承体系的同样修改; case 语句需要做相同的修改; 同时使用的相关数据并未以类的方式进行组织; 成员函数使用其他类的特征比使用自身类的特征还要多; 过多使用基本数据类型; 某个类无所事事; 一系列传递流浪数据的子程序; 中间人对象无事可做; 某个类同其他类关系过于亲密; 子程序命名不当; 数据成员被设置为公用; 某个派生类仅使用了基类的很少一部分成员函数; 注释被用于解释难懂的代码; 使用了全局变量; 在子程序调用前使用了设置代码,或在调用后使用了收尾代码; 程序中的一些代码似乎是在将来的某个时候才会用到的。 特定的重构 数据级的重构 用具名常量替代神秘数值; 使变量的名字更为清晰且传递更多信息; 将表示内联化; 用函数来代替表达式; 引入中间变量; 用多个单一用途变量代替某个多用途变量; 在局部用途中使用局部变量而不是参数; 将基础数据类型转化为类; 将一组类型码转化为类或枚举类型; 将一组类型码转换为一个基类及其相应派生类; 将组数转换为对象;

论文笔记-语境重构

柔情痞子 提交于 2019-11-30 06:31:56
原文出自 彼得攀的小站 论文 来自于华为和滑铁卢大学 该文章主要针对解决了汉语对话中语境重构的问题,即把代词、零代词等指称短语替换为它们指代的名词,这样可以在没有上下文中的情况,直接对当前对话句子进行处理。 Motivation 作者认为语境重构任务可以被分解为引用表达式检测(即代词和零代词检测)和引用还原(将代词还原为所指代的实体) 基于这样的认知,作者提出了一种新的端到端结构,来完成语境重构任务。该模型的主要特点是它包括基于神经网络的词性和位置编码以及一种新的代词掩模机制。 在构建此类模型时,一个长期存在的问题是缺乏训练数据,为解决这个问题,本文通过扩展以前提出的方法来生成大量实际的训练数据。由于结合了更多的数据和更好的模型,在共同引用解析(coreference resolution )和端到端上下文重建方面,本文模型可以获得比最先进的方法更高的精度 语境重构的目标是,从对轮对话历史中恢复历史信息,这样可以消除当前对话对于之前对话历史的依赖->这样当前对话的句子可以有全部且上下文无关的语义信息。 Introduction 文章利用词性标注模型来来解决指代和省略问题 文章的主要贡献: 将对话语境重构问题定义为一个检测问题和一个排序问题,并提出了其与传统的代词检测和零代词检测等任务的区别,提出了候选项的选择 分析了神经网络在对话系统中的应用,包括step-step和end-to

重构-在实践中理解

吃可爱长大的小学妹 提交于 2019-11-30 06:16:52
  在老大的推荐下买了Martin Fowler的<Refactoring improving the design of existing code>,其实这本书就是作者重构的经验之谈,随便翻一下,尽管你看的多么仔细,如果你没有在实践中感受到它或者应用到它,其实你很难在需要的时候用上。   昨天服务上线的时候,老大就给我上了一课,首先是一个同事定位到我的一个查询接口超时,于是老大就和我一起看着块超时的代码,看到了这样的代码: B(){ // 在B中发现了代码块BlockA是冗余代码,其实是可以使用一定的方法删掉的,但是我为了省事,就没有优化,并且也没有想到怎么去掉这个冗余 ... // 但是这个BlockA就是查询数据库的代码,是非常耗时的,考虑到性能,就该拿掉,如果是非耗时操作,也就算了,但是这个耗时影响了性能问题。 BlockA // 其实我一开始想不到怎么重构,因为在我的潜意思里还是认为B应该call A,有这个前提,可以证明,是无法拿掉冗余代码BlockA的。 ... // 看重构的第六章,第一节就是讲把一些块抽出来,创建函数,这个BlockA已经重复调用了,所以更应该抽出一个函数来。 A(); // 我潜意思里想B必要要调用A,是因为我先写好了A,已经把A当成了最基本的单元操作,其实不是的,还有更细的单元操作,后写B,没有将A,B放在一起看。 ... // haha

JavaScript代码重构技巧

浪子不回头ぞ 提交于 2019-11-30 06:09:50
JavaScript代码重构技巧 (1) 提炼函数 在js开发中,我们大部分时间在与函数打交道,将一段代码独立成函数可以避免出现超大函数、独立出来的函数有利于代码复用、独立出来的函数如果命名良好能够起到注释的作用。 (2) 合并重复的条件片段 如果一些条件分支散布着重复的代码,可以将这些代码合并。 (3) 把条件分支语句提炼成函数 如果条件分支语句比较复杂,可以独立成一个单独的函数。 (4) 合理使用循环 在函数内,如果有些代码实际负责的是一些重复性的工作,那么合理的使用循环可以使代码量更少。 (5) 提前让函数退出代替嵌套的条件分支 面对一个嵌套的条件分支,可以对外层if判断进行考虑是不是能提前判断退出函数。 (6) 传递对象参数代替过长的参数列表 (7) 尽量减少参数数量 (8) 少用三目运算符 如果三目运算符写出来难以理解,那宁愿用if...else (9) 合理使用链式调用 在JavaScript中,可以很容易地实现方法的链式调用,即让方法调用结束后返回对象本身。 (10) 分解大型类 (11) 用return退出多重循环 来源: CSDN 作者: Gyoung阿广 链接: https://blog.csdn.net/u012755393/article/details/69061169

2019年IntelliJ IDEA快捷键

六月ゝ 毕业季﹏ 提交于 2019-11-30 03:01:09
自动代码 常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码 。 例如要输入for(User user : users)只需输入user.for+Tab ; 再比如,要输入Date birthday = user.getBirthday()只需输入user.getBirthday().var+Tab即可。 代码标签输入完成后,按Tab,生成代码。 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如get,set方法,构造函数等) 或者右键(Generate) fori/sout/psvm + Tab Ctrl+Alt+T 生成try catch 或者 Alt+enter CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里 Ctrl + O 重写方法 Ctrl + I 实现方法 Ctr+shift+U 大小写转化 ALT+回车 导入包,自动修正 ALT+/ 代码提示 CTRL+J 自动代码 Ctrl+Shift+J,整合两行为一行 CTRL+空格 代码提示 CTRL+SHIFT+SPACE 自动补全代码 CTRL+ALT+L 格式化代码 CTRL+ALT+I 自动缩进 CTRL+ALT+O 优化导入的类和包 ALT+INSERT 生成代码(如GET,SET方法