摘要:问题: 程序的输入包含两个整数m和n,其中m<n,输出是1~n-1范围内m个随机整数的有序列表,不允许重复。从概率的角度来说,我们希望得到没有重复的有序选择,其中每个选择出现的概率相等。解决方法1:找一个随机数,在没有被筛选出来的数字里面求模,然后输出。当还剩5个数字时,每个元素的概率为20%,选出一个,每个元素的概率为25%。这样对于选出的每个元素来说,都是平等的。void genkunt...
阅读全文
随笔分类 - 算法基础
描述算法上的内容,扎实基础
摘要:1.插入排序的进化 第一个版本的插入排序isort1: for i = [1,n) for(j=i; j>0 && x[j-1] > x[j]; j-- ) swap(j-1,j); 第一个思路,将swap函数内联化,或者替换为语句,节省函数切换时间 isort2: for i = [1,n) for(j=i; j>0 && x[j-1] >...
阅读全文
摘要:关键在于简单,算法的简单,空间使用的简单。可以使用稀疏矩阵代替多维数组存储数据,同时可以使用占用空间更小的shortint等数据类型代替指针等数据类型。 数据空间技术:1.不存储,重新计算2.稀疏数据结构3.数据压缩4.动态分配5.垃圾回收今天看完了编程珠玑的前两部分的内容,下面开始看真正的问题解决部分了。下一部分要正式的开始解决问题了,期待中。
阅读全文
摘要:1. 常用计算方法调优a.整数取模 k = (j+rotdist)%n 替换为: k = j + rotdist; while( k>= n ) k -= n; 取模运算大概运行100ns,加减法运算一般在10ns左右,所以,当k/n< 5的时候,新算法比较快,当大于10以后,取模运算快速。 如果程序的运行时间主要消耗在输入输出上,那么对程序中的计算进行加速是毫无意义的。如果对内存...
阅读全文
摘要:初始阶段: 初始阶段不是需求阶段,它是建立项目共同设想和基本范围的比较简短的起始步骤,包括对10%的用例进行分析,关键的非功能需求的分析,业务案例创建和开发环境的准备。作用:建立一些初始的共同构想,确定项目是否可行,决定是否值得进入细化阶段加以认真研究。初始阶段的持续时间很短。产出(可选的,概要的): 设想和业务用例, 用例模型 补充性规格说明 词汇表 风险列表和风险管理计划 原型和概念验证 迭代...
阅读全文
摘要:问题定义: 具有n个浮点数的向量x,求出输入向量的任何连续子向量的最大和。立方算法:maxsofar = 0;for i = [0,n) for j=[i,n) sum = 0; for k=[i,j] sum += x[k] maxsofar = max(maxsofar,sum);平方算法:maxsofar = 0;for i =[0,n) sum = 0; for j=[i,n) su...
阅读全文
摘要:1. 初始化。 循环初次执行的时候不变式为真。确立一个不变式。2. 保持。 如果在某次迭代开始的时候以及循环体执行的时候,不变式为真,那么循环体执行完毕的时候不变式依然为真。每次循环完成和过程中进行检验。3. 循环能够终止,并且可以得到期望的结果。在算法编写过程中为了对算法的每一步进行检验,经常需要用到ASSERT断言。算法导论和编程珠玑中都有提及,给我们在算法的编写和实现的时候提供一定的保证。
阅读全文
摘要:性能估算小伎俩1:72法则内容: 假设以年利率r%投资一笔钱y年,金融版本的“72法则”指出,如果r*y=72,那么你投资差不多会翻倍。例如: 以年利率6%投资1000美元12年,可得到2012美元。 1998年的世界人口为59亿,年增长率为1.33%,按照这个速率下去,到2050年的时候世界人口是多少? 72/1.33 =54年, 1998+54 = 2052年,大概等...
阅读全文
摘要:算法设计小伎俩1:偶数的判断方法判断n为偶数,一般的方法:bFlag = (n%2==0);改进方法: bFlag = (n&1==0);改进原理: 偶数的二进制表示中,最后一位肯定是0,所以采用和1相与的为0的方式来判断偶数。改进点: 位运算比除法运算要快很多。算法设计小伎俩2:无序无符号数据的二分法,其中一部分中的任何一个数据要比另一部分的数据要大。一般方法: 遍历一边,找出一个中位...
阅读全文

浙公网安备 33010602011771号