重构

小波变换教程(十四)

无人久伴 提交于 2019-12-04 15:48:12
原文: http://users.rowan.edu/~polikar/WTpart3.html 译文: https://blog.csdn.net/alihouzi/article/details/45190467 小波合成 如果满足式3.18所示的条件,则CWT为 可逆变换 。幸运的是,这并不是一个非常苛刻的条件。只要满足式3.18所示的条件,即便 基函数并不是归一化正交基 。由小波系数计算原始信号值的 小波重构过程 可用如下公式计算: 式 3.17 逆连续小波变换 其中 C_psi为与所用小波有关的常数。这个与小波重构过程有关的常数称为 容许性常数。 式3.18所示的小波重构条件称为容许性条件。 式 3.18 容许性条件 其中psi^hat(xi)为psi(t)的傅立叶变换。式3.18还表明: psi^hat(0) = 0 即: 式 3.19 由前面的讨论可知,式3.19并不是一个非常苛刻的条件,因为许多小波函数的积分值为0。满足式3.19所示条件的小波必定是振荡的。 来源: https://www.cnblogs.com/sggggr/p/11872151.html

重构-改善既有代码设计

蓝咒 提交于 2019-12-04 09:33:38
重构是在不改变软件可观察行为的前提下,对代码作出修改,以改进程序的内部结构。本质上说就是在代码写好后改进它的设计 重构往往意味着不了解软件行为下重构程序 2.在设计前期使用模式常常导致过度工程,单凭对完美的追求无法写出实用的代码,而"实用"是软件压倒一切的要素 《设计模式》指出:设计模式为重构提供类目标 重构可以反"软件会慢慢腐烂"现象,通过重构,设计不再是一切动作的前提,而是在整个软件开发过程中逐渐浮现出来 【29页】 如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便地达成目的,那就先重构那个程序,使特性的添加比较容易进行,然后再添加特性。 【35页】 重构技术就是以微小的步伐修改程序。如果你犯下错误,很容易发现。 【37页】 任何一个傻瓜都可以写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员。 第二章: 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 两顶帽子:使用重构技术开发软件时,你把时间分配给两种截然不同的行为:添加新功能,以及重构,添加新功能时只能添加新功能,不能修改已有代码; 重构时,只管改进程序结构,不能添加新功能 为何重构?1.重构改进软件设计[防止软件腐烂] 2.重构使软件更容易理解

学习重构(0)-目录

那年仲夏 提交于 2019-12-04 08:12:47
代码坏味道 Duplicated Code(重复代码) Long Method(过长函数) Large Class(过大的类) Long Parameter List(过长参数列) Divergent Change(发散式变化) Shotgun Surgery(霰弹式修改) Feature Envy(依恋情结) Data Clumps(数据泥团) Primitive Obsession(基本类型偏执) Switch Statements(switch惊悚现身) Parallel InheritanceHierarchies(平行继承体系) Lazy Class(冗赘类) Speculative Generality(夸夸其谈未来性) Temporary Field(令人迷惑的暂时字段) Message Chains(过度耦合的消息链) Middle Man(中间人) Inappropriate Intimacy(狎昵关系) Alternative Classes with Different Interfaces(异曲同工的类) Incomplete Library Class(不完美的库类) Data Class(纯稚的数据类) Refused Bequest(被拒绝的遗赠) Comments(过多的注释) 来源: https://www.cnblogs.com

LeetCode 1253. 重构 2 行二进制矩阵 - Java - 统计

谁说胖子不能爱 提交于 2019-12-04 06:25:25
题目链接: https://leetcode-cn.com/contest/weekly-contest-162/problems/reconstruct-a-2-row-binary-matrix/ 给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1 。 第 0 行的元素之和为 upper 。 第 1 行的元素之和为 lower。 第 i 列(从 0 开始编号)的元素之和为 colsum[i] , colsum 是一个长度为 n 的整数数组。 你需要利用 upper , lower 和 colsum 来重构这个矩阵,并以二维整数数组的形式返回它。 如果有多个不同的答案,那么任意一个都可以通过本题。 如果不存在符合要求的答案,就请返回一个空的二维数组。 示例 1: 输入:upper = 2, lower = 1, colsum = [1,1,1] 输出:[[1,1,0],[0,0,1]] 解释:[[1,0,1],[0,1,0]] 和 [[0,1,1],[1,0,0]] 也是正确答案。 示例 2: 输入:upper = 2, lower = 3, colsum = [2,2,1,1] 输出:[] 示例 3: 输入:upper = 5, lower = 5, colsum = [2,1,2,0,1,0,1,2,0,1] 输出:[[1

Kruskal重构树

陌路散爱 提交于 2019-12-03 15:53:00
构造方法 按照Kruskal的传统步骤,先排序,按顺序枚举两个非连通块,合并后, 建一个点权为两点之间边权的父节点 。这样建出来的一棵树称为Kruskal重构树。 e.g. 假设原图(盗的)长这样: 建成树后就是这样(蓝色实线为最小生成树): 用途 克鲁斯卡尔重构树可以维护诸如“查询从某个点出发经过边权不超过w的边最远所能到达的节点”或“从某点到某点所有路径的最长(短)边的最小(大)值”(即最小(大)瓶颈路)之类的问题。 总之,算法处理范围有限,且多为同时包含“最大最小”、离线可二分的题目。 可与数据结构结合,以维护更复杂的数据结构。 支持在线,单次复杂度为 \(O(\log n)\) 。 性质 按照上述方法建出来的树有一些非常好的性质。 1.树上除叶子结点以外的点都对应着原来生成树中的边,叶子结点就是原来生成树上的节点。 2.由于新点的创建顺序与原来生成树上边权的大小有关(从大到小),可以发现,从每个点到根节点上除叶子结点外按顺序访问到的点的点权是单调的。 3.出于Kruskal算法贪心的性质,两个点u和v的lca的点权就对应着它们最小生成树上的瓶颈。 4.实际上这棵树就是一个二叉堆。 例题 [简单]NOIp2013 货车运输 [较难]NOI2011 归程 来源: https://www.cnblogs.com/wzzyr24/p/11802816.html

学习重构(4)-重新组织数据

柔情痞子 提交于 2019-12-03 13:42:04
1. Self Encapsulate Field(自封装值域) 你直接访问一个值域,但与值域之间的耦合关系逐渐变得笨拙。为这个值域建立取值/设值函数(get/set),并且只以这些函数来访问值域。 应用场景:其实这种为每个变量提供两个操作函数的做法并不是百分百可取的,这样做的一个好处就是做到数据存储和使用隔离,尤其对于对象数据的保护是非常好的,可以返回给调用方一个数据拷贝,不用担心自己的数据会被篡改。但是也有不好的地方,就是会带来非常多的小函数,无形中增大了类的体量。 示例: private int _low, _high boolean includes (int arg) { return arg >= _low && arg <= _high; } 重构为: private int _low, _high boolean includes (int arg) { return arg >= getLow() && arg <= getHigh(); } int getLow() {return _low}; int getHigh() {return _high}; 2. Replace Data Value with Object(以对象取代数据值) 将一些数据按照一定的规则或特征整合到一个对象中 应用场景:开发代码初期,仅需要一些简单的数据,比如一个人的基本信息:姓名

代码重构方向原则指导

删除回忆录丶 提交于 2019-12-03 12:03:38
重构是 一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量。代码重构之于软件,相当于结构修改之于散文。每次人们对如何对代码进行重构的讨论就像是讨论如果对一篇文学作品进行修订一样无休无止。所有人都知道应该根据项目的自身情况来对代码进行重构,而重构是无止境的。莫扎特从来不不对他的作品进行修订,特罗洛普对自己作品修订的恰到好处,大多数作家认为他们俩这样做都是合适的,但他们的合适对于 你我来说未必是合适的。 最常见的基本重构方法 可以归纳为两个方向。通过归纳方法将一个长的过程分解为小的可以重用的组件,和通过内联(inline)方法来消除那些不够份量的小方法。我们可以提炼方法来让大量的子类共享相同的功能特征,我们可以下放方法来让只有用到这些功能的子类才知道它们的存在。 重构就是爬山,通过一步一步的小的提高来逐渐的改进整体的质量,但在重构时,我们如何知道哪种方法是上山的正确道路? 关于代码地形学的这个问题公认的方法有两种。去除有异味的代码和重构成模式。 如果能做到这样,当然是很好的。就像是纠正作文里的一个语法错误或不恰当的比喻。如果我们可以找到这些四处隐藏的有异味的代码,将它们重写成整洁的,条理 的,结构化的形式,何乐而不为。但这些都是特殊情况。如果没有明显的模式来重构,或没有很直接的方法来去除代码异味,那该怎么办呢? 这才是

【学习】Kruskal重构树

落爺英雄遲暮 提交于 2019-12-03 11:17:24
## 介绍 求图中任意两点最大边权最小或最小边权最大 ## 题目 1. BZOJ3732 Network 模板题。 #include<iostream> #include<cstdio> #include<cstdlib> #include<ctime> #include<cctype> #include<algorithm> #include<cstring> #include<iomanip> #include<queue> #include<map> #include<set> #include<bitset> #include<vector> #include<stack> #include<cmath> #include<bits/stdc++.h> #define ri register int #define ll long long #define For(i,l,r) for(ri i=l;i<=r;i++) #define Dfor(i,r,l) for(ri i=r;i>=l;i--) using namespace std; const int M=200010; int n,m,cnt,q,fa[M],tot,head[M],val[M],size[M],top[M],son[M],dep[M],f[M]; struct node{ int u,v,dis

使用JDK8新特性重构你的代码

我是研究僧i 提交于 2019-12-03 07:28:58
lambda 表达式 当一个接口只有一个方法的时候都可以使用lambda 表达式代替 这种称为函数接口可以用 @FunctionalInterface 修饰 // 使用匿名类的方式 new Thread(new Runnable() { @Override public void run() { System.out.println("hello"); } }); //使用lambda 表达式方式 new Thread(()-> System.out.print("hello") ); lambda 表达式多种形式 1) ActionListener listener= event-> System.out.print("hello"); // event表示方法的参数括号 lambda表达式返回可以看成是一个函数的引用 2) BinaryOperator<Long> add = (x,y)->x+y; // 同样如果有2个参数可以这样表示 3) BinaryOperator<Long> add =(Long x,Long y)-> { x+y; System.out.print("hello"); } // 同样 我们可以加上具体的参数类型 如果是多行需要加 {} 使用lambda表达式实现设计模式 这里我们实现一个解压算法的策略模式 // 定义好接口

Krustal重构树

心不动则不痛 提交于 2019-12-03 06:45:01
Kruskal重构树基于Kruskal算法。在执行算法过程中,Kruskal算法会把u,v两点所在的连通块连一条边。而这里会 新建一个节点,点权为原来的图中这条边的边权,并把此节点与u,v的祖先分别连边。最终便会得到一棵Kruskal重 构树。 很明显有如下结论: 1,这是一棵二叉树; 2,叶子节点代表原图的点,非叶子节点表示原图的一条边; 3,对于所有非叶子节点,其点权<父亲节点的点权。举个栗子: 原图: 重构树 来源: https://www.cnblogs.com/cutemush/p/11781143.html