DivideAndConquer

我在阿里写代码学会的六件事

醉酒当歌 提交于 2020-08-17 15:47:46
写了多年的代码,始终觉得如何写出干净优雅的代码并不是一件容易的事情。按 10000 小时刻意训练的定理,假设每天 8 小时,一个月 20 天,一年 12 个月,大概也需要 5 年左右的时间成为大师。其实我们每天的工作中真正用于写代码的时间不可能有 8 个小时,并且很多时候是在完成任务,在业务压力很大的时候,可能想要达到的目标是如何尽快的使得功能 work 起来,代码是否干净优雅非常可能没有能放在第一优先级上,而是怎么快怎么来。 在这样的情况下是非常容易欠下技术债的,时间长了,这样的代码基本上无法维护,只能推倒重来,这个成本是非常高的。欠债要还,只是迟早的问题,并且等到要还的时候还要赔上额外的不菲的利息。还债的有可能是自己,也有可能是后来的继任者,但都是团队在还债。所以从团队的角度来看,写好代码是一件非常有必要的事情。如何写出干净优雅的代码是个很困难的课题,我没有找到万能的 solution,更多的是一些 trade off,可以稍微讨论一下。 代码是写给人看的还是写给机器看的? 在大部分的情况下我会认为代码是写给人看的。虽然代码最后的执行者是机器,但是实际上代码更多的时候是给人看的。我们来看看一段代码的生命周期:开发 --> 单元测试 --> Code Review --> 功能测试 --> 性能测试 --> 上线 --> 运维、Bug 修复 --> 测试上线 --> 退休下线

图解排序算法(四)之归并排序

生来就可爱ヽ(ⅴ<●) 提交于 2020-08-17 03:24:35
基本思想    归并排序(MERGE-SORT)是利用 归并 的思想实现的排序方法,该算法采用经典的 分治 (divide-and-conquer)策略(分治法 将问题 分 (divide) 成一些小的问题然后递归求解,而 治(conquer) 的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之 )。 分而治之    可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。 分 阶段可以理解为就是递归拆分子序列的过程,递归深度为log 2 n。 合并相邻有序子序列    再来看看 治 阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。 代码实现 package sortdemo; import java.util.Arrays; /** * Created by chengxiao on 2016/12/8. */ public class MergeSort { public static void main(String []args){ int []arr = {9,8,7,6,5,4,3,2,1 }; sort(arr); System.out.println

图解排序算法(四)之归并排序

北城余情 提交于 2020-08-16 23:23:31
基本思想    归并排序(MERGE-SORT)是利用 归并 的思想实现的排序方法,该算法采用经典的 分治 (divide-and-conquer)策略(分治法 将问题 分 (divide) 成一些小的问题然后递归求解,而 治(conquer) 的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之 )。 分而治之    可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。 分 阶段可以理解为就是递归拆分子序列的过程,递归深度为log 2 n。 合并相邻有序子序列    再来看看 治 阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。 代码实现 package sortdemo; import java.util.Arrays; /** * Created by chengxiao on 2016/12/8. */ public class MergeSort { public static void main(String []args){ int []arr = {9,8,7,6,5,4,3,2,1 }; sort(arr); System.out.println

归并排序(Java)

时间秒杀一切 提交于 2020-08-13 19:21:02
归并排序(Java) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 归并排序介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 代码 package cn.guizimo.sort; import java.util.Arrays; public class MergetSort { public static void main(String[] args) { int arr[] = {8, 4, 5, 7, 1, 3, 6, 2}; int temp[] = new int[arr.length]; System.out.println("排序前"); System.out.println(Arrays.toString(arr)); mergeSort(arr, 0, arr.length - 1, temp); System.out.println("排序后"); System.out.println(Arrays.toString(arr)); } public static

MyDLNote-Enhancment : 基于解耦特征表示的混合失真图像修复算法

徘徊边缘 提交于 2020-08-13 10:49:19
Learning Disentangled Feature Representation for Hybrid-distorted Image Restoration 【paper】: https://arxiv.org/pdf/2007.11430v1.pdf 目录 Learning Disentangled Feature Representation for Hybrid-distorted Image Restoration Abstract Introduction Related Work Image Restoration on Hybrid Distortion Approach Primary Knowledge Feature Disentanglement Module Feature aggregation Module Auxiliary Module Overview of Whole Framework Loss Function Experiments Dataset Comparison with State-of-the-Arts Interpretative Experiment Ablation Studies Abstract Hybrid-distorted image restoration (HD-IR) i s dedicated

归并排序(Java)

心已入冬 提交于 2020-08-12 19:11:10
归并排序(Java) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 归并排序介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 代码 package cn.guizimo.sort; import java.util.Arrays; public class MergetSort { public static void main(String[] args) { int arr[] = {8, 4, 5, 7, 1, 3, 6, 2}; int temp[] = new int[arr.length]; System.out.println("排序前"); System.out.println(Arrays.toString(arr)); mergeSort(arr, 0, arr.length - 1, temp); System.out.println("排序后"); System.out.println(Arrays.toString(arr)); } public static

动态规划

筅森魡賤 提交于 2020-08-10 23:48:27
概述 什么是动态规划 # 算法导论 15 章 开篇 Dynamic programming, like the divide-and-conquer method, solves problems by combining the solutions to subproblems. (“Programming” in this context refers to a tabular method, not to writing computer code.) # 翻译 动态规划和分治策略类似,通过将子问题的解组合起来解决整个问题。 (这里的programming指的不是计算机的写代码,而是一种表格法,或者叫做字典法) 观后感 表格法是一种空间换时间的策略。 将需要重复求解的子问题的解记录下来,在下一次求解的时候可以直接获取。 消耗一定的内存来节省重复计算的时间开销。 学习之后个人觉得最难的还是根据现象来分析问题,怎样构建动态规划的最优子结构。 有时候问题的解法不仅仅动态规划,还有很多,可能相比下来动态规划更加的费时费力。 动态规划的要素只有几个,主要在于对问题进行抽象。 动态规划要素 最优子结构 整个大的问题由若干个相似结构的子问题组成。 也就是说动态规划是可以用递归求解的。 递归那么就需要列出其递归方程和状态转换。 重复子问题 分析出了最优子结构

十大排序算法

☆樱花仙子☆ 提交于 2020-08-10 01:40:19
本博客只写实现的思想,相关代码地址在: gitee github 排序动画演示: 排序动画演示 0、排序算法概述 0.1 排序算法分类 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 快速记忆上表打油诗 : 30秒让你记住所有排序算法-宋词记忆法 . 0.3 复杂度分析递推式 . 0.4 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度 :是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.1 经典冒泡

算法漫游指北(第十一篇):归并排序算法描述、动图演示、代码实现、过程分析、复杂度

帅比萌擦擦* 提交于 2020-08-10 00:54:44
一、归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 所谓“分”,指的是将一个乱序数列不断进行二分,得到许多短的序列。 所谓“治”,指的是将这些短序列进行两两合并,然后将合并的结果作为新的序列,再与其他序列进行合并,最终得到一个新的序列。 归并排序算法描述 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 归并排序动图演示 动画演示图2 归并排序代码实现 def merge_sort(alist): """归并排序""" n = len(alist) #递归结束条件 # 剩一个或没有直接返回,不用排序 if n <= 1: return alist # 拆分 mid = n//2 ​ # left 采用归并排序后形成的有序的新的列表 left_li = merge_sort(alist[:mid]) ​ # right 采用归并排序后形成的有序的新的列表 right_li = merge_sort(alist[mid:]) ​ # 将两个有序的子序列合并为一个新的整体 #

面试官:手撕十大排序算法,你会几种?

我与影子孤独终老i 提交于 2020-08-06 12:08:06
原文链接: 面试官:手撕十大排序算法,你会几种? 演示地址: 点击查看演示 在前面三期,介绍了动态规划的两个主要特性:交叠子问题和最优子结构,并用七种方式求解第n项斐波那契数,感受了算法的强大,你是否也领略到它的精髓呢? 《深入浅出理解动态规划(一) | 交叠子问题》 《深入浅出理解动态规划(二) | 最优子结构》 《用x种方式求第n项斐波那契数,99%的人只会第一种》 今天我们就来讨论面试官最喜欢问到的排序算法吧,从冒泡排序、选择排序、插入排序等十大排序算法的排序步骤、代码实现两个方面入手,彻底搞清实现原理,保证面试道路一路畅通。 01 排序算法的概述 所谓排序算法,就是通过特定的算法因式将一组或多组数据按照一定模式进行重新排序。 这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。 02 排序算法的分类 03评价标准 (1)时间复杂度:即从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。 (2)空间复杂度:就是从序列的初始状态经过排序移位变换的过程一直到最终的状态所花费的空间开销。 (3)稳定性:稳定性是不管考虑时间和空间必须要考虑的问题,往往也是非常重要的影响选择的因素。 04 实现步骤与代码 冒泡排序(Bubble Sort) 冒泡排序是一种简单直观的排序算法