复杂度

优秀程序员的开发效率是普通程序员的 10 倍,那么如何提升呢?

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-09 16:00:07
1975 年,弗雷德里克·布鲁克斯(Frederick Brooks)出版了软件行业的名著《人月神话》,他给出了一个统计结果, 优秀程序员的开发效率是普通程序员的 10 倍 。40 多年过去了,这个数字得到了行业的普遍认同。 成为 10x 程序员是很多程序员的追求。但工作产出并不只是由写代码的效率决定的,一些不恰当工作方法很大程度上影响着你的产出。在接下来的这段时间里,我希望通过这个专栏和你一起探讨,作为一个程序员,该如何更高效地工作,怎样才能把时间和精力尽可能地放在处理本质复杂度的事情上,减少在偶然复杂度上的消耗。 作者 | 郑晔 出处 | 极客时间《10x 程序员工作法》专栏 作为整个专栏第一讲,我就从我常用的一个思考框架开始。 一个思考框架 我曾经组织过针对应届毕业生的培训,第一堂课往往是我亲自操刀,其中有一个头脑风暴的环节“畅想未来”,我会让大家思考三个问题: (1)我现在是个什么水平? (2)我想达到一个什么水平? (3)我将怎样到达那个目标? 大家会围绕着这三个问题,从各种角度展开讨论。这是一个有趣的练习,你会发现大家“最擅长”回答的是第一个问题:我现在处于什么水平?和有经验的人相比,他们大多自认为比较“菜”。但对于后两个问题的讨论,却可以切实看出人和人之间处理问题的能力差异。 有人通过之前的资料搜集,已经对自己的未来有了一个打算。比如想成为一个研发大牛

01-复杂度3 二分查找 (20分)

只愿长相守 提交于 2019-12-09 13:25:40
本题要求实现二分查找算法。 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中 List 结构定义如下: typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; L 是用户传入的一个线性表,其中 ElementType 元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记 NotFound 。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 #define NotFound 0 typedef int ElementType; typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /*

海量数据面试题整理

本小妞迷上赌 提交于 2019-12-08 19:06:28
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 s 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。 2. 有10个文件,每个文件1G

17道经典海量数据面试题整理

余生长醉 提交于 2019-12-08 18:49:53
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 s 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。 2. 有10个文件,每个文件1G

如何降低函数的圈复杂度

筅森魡賤 提交于 2019-12-08 11:05:39
圈复杂度就是统计一个函数有多少个分支(if,while,for等)每增加一个分支,复杂度加1。 简单来说,就是相当于需要多少个测试用例才能对这个函数做到全路径覆盖。 计算方法: (1)由1计算,一直往下通过程序。 (2)一旦遇到以下关键字或同类的词,如if ,while,repeat,for,and ,or,CC加1。 (3)switch-case语句的每一种情况加1。 降低函数复杂度的方法: 提炼函数、 替换算法、 分节条件表达式、 合并条件式、 合并重复的条件片段、 移除控制标志、 将查询函数和修改函数分离、 令函数携带参数 以明确函数取代参数。 来源: CSDN 作者: lulu-lu 链接: https://blog.csdn.net/smbluesky/article/details/42778641

白盒测试之圈复杂度,以及可以直接降低圈复杂度的10种重构技术

元气小坏坏 提交于 2019-12-08 11:02:33
圈复杂度 圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。 下面这个实例中,单元测试的覆盖率可以达到100%,但是很容易发现这其中已经漏掉了一个NPE的测试用例。case1方法的圈复杂度为2,因此至少需要2个用例才能完全覆盖到其所有的可能情况。 //程序原代码,圈复杂度为 2 public String case1( int num) { String string = null ; if (num == 1) { string = "String"; } return string.substring(0); } //上面代码的单元测试代码 public void testCase1(){ String test1 = case1 (1); } 圈复杂度主要与分支语句(if、else、,switch 等)的个数成正相关。可以在图1中看到常用到的几种语句的控制流图(表示程序执行流程的有向图)。当一段代码中含有较多的分支语句,其逻辑复杂程度就会增加。在计算圈复杂度时,可以通过程序控制流图方便的计算出来。通常使用的计算公式是V

(四)动态白盒测试:基本路径测试方法

做~自己de王妃 提交于 2019-12-08 11:00:54
基本路径方法设计测试用例步骤 1、画出控制流程图 2、计算圈复杂度(环路复杂度) 3、整理基本路径集合 4、导出测试用例 一、常见结构的控制流图 控制流图是退化了的流程图,将流程图中执行语句、判定语句、开始、结束等退化成节点,将流程线退化成一个节点到另一个节点的带箭头的弧线 红色标出的是判定节点、蓝色标出的是区域 流图只有两种图形符号: - 每一个圆称为流图的 节点 ,代码一条或多条语句 - 箭头称为 边或连接 ,代表控制流 - 包含条件的节点称为 判定节点 (也叫谓词节点),由判定节点发出的边必须终止于摸一个节点(判断是否为判定节点:该节点会有多个流出的边) - 由边和节点限定的范围称为区域(图形外也算一个区域) 多个逻辑运算符的情况 如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有但条件的嵌套的判断 在程序流图中一系列的顺序执行语句可以合成为一个节点,但是对于多分支的判断则需要分界为独立的分枝,每个分支一个节点 二、计算圈复杂度(环路复杂度) 圈复杂度是一种为程序逻辑复杂性提供定量测试的软件度量,该度量用于计算程序的基本的独立路径数,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边 有以下三种方法计算圈复杂度: 流图中区域的数量对应于环形的复杂度

数据结构 算法(Algorithm)

谁都会走 提交于 2019-12-06 19:16:45
算法(Algorithm)    一个有限指令集    接受一些输入(有些情况下不需要输入)    产生输出    一定在有限步骤之后终止    每一条指令必须    有充分明确的目标,不可以有歧义    计算机能处理的范围之内    描述应不依赖于任何一种计算机语言以及具体的实现手段    例子:    void SelectionSort(int List[],int N)    {/*将N个整数List[0]...List[N-1]进行非递减排序*/    for( i = 0;i < N; i++){    Minposition = ScanForMin(list,i,N-1)    从Lsit[i]到List[N-1]中找最小元,并将其位置赋给MinPosition;    Swap(List[i],List[MinPostion]);    将未排序部分的最小元换到有序部分的最后位置;    }    }    抽象-    List到底是数组还是链表(虽然看上去很像数组)?    Swap用函数还是用宏去实现?    什么是好的算法    空间复杂度S(n)--根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。    时间复杂度T(n)-

SHA-1算法

蓝咒 提交于 2019-12-06 16:56:59
SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种 密码散列函数 , 美国国家安全局 设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160 位 (20 字节 )散列值,散列值通常的呈现形式为40个 十六进制 数。 介绍 SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种 密码散列函数 , 美国国家安全局 设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160 位 (20 字节 )散列值,散列值通常的呈现形式为40个 十六进制 数。 [1] SHA-1已经不再视为可抵御有充足资金、充足计算资源的攻击者。2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自2010年以来,许多组织建议用 SHA-2 或SHA-3来替换SHA-1。 Microsoft 、 Google 以及 Mozilla 都宣布,它们旗下的浏览器将在2017年前停止接受使用SHA-1算法签名的 SSL证书 。 2017年2月23日,CWI Amsterdam与 Google 宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA

算法的复杂度

空扰寡人 提交于 2019-12-06 12:51:54
1.1.3 算法的复杂度 算法的复杂度主要包括 时间复杂度 和 空间复杂度。 1.算法的时间复杂度 所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。 算法所执行的基本运算次数还与问题的规模有关。 算法的工作量用算法所执行的基本运算次数来度量,而算法所执行的基本运算次数是问题规模的函数。 在同一个问题规模下,如果算法执行所需的基本运算次数取决于某一特定输入时,可以用以下两种方法来分析算法的工作量。 (1)平均性态(Average Behavior) 所谓平均性态分析,是指用各种特定输入下的基本运算次数的加权平均值来度量算法的工作量。 (2)最坏情况复杂性(Worst-Case Complexity) 所谓最坏情况分析,是指在规模为n时,算法所执行的基本运算的最大次数。 2.算法的空间复杂度 一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。 一个算法所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。其中额外空间包括算法程序执行过程中的工作单元以及某种数据结构所需要的附加存储空间。 来源: https://www.cnblogs.com/iglesias/p/11984933.html