算法
liyinchen808
软件工程师之路
展开
-
把M位的2^M种不同的0-1串按圆排列划分(1)
原题描述如下:假定一个M bits的0-1串, 那么总共有2^M种不同的字符串, 凡是可以通过循环左移的字符串划为一组,找出每个组的一个代表即可。如何设计一个算法? M取值3-32思路如下:因为题目中涉及循环左移,移动过程中串中1和0的个数不变,因而可以先把所有串按其中1的个数分组,由于0的个数加上1的个数等于M,所以只需考虑0到(M + 1)/2个1的情况,(M + 1)/2 +1到原创 2012-10-07 21:18:57 · 1145 阅读 · 0 评论 -
codeforces 俄罗斯季度决赛题目sequence解答
原题大意如下:用两种操作产生数字序列:加倍和数字排序。数字排序就是升序方式排列数字,如数值6532,排列后的结果是2356。序列都是从1开始,序列前15个数值时1 2 4 8 16 23 46 29 58 116 223 446 289 578 1156。请编程算出第n个序列中的数值是什么。1分析:由于n的上界很大,如果逐一计算,一定不现实。因为它涉及大数据加法和超大数原创 2012-11-15 16:37:03 · 789 阅读 · 0 评论 -
解题报告 codeforces 242A
原题链接如下:http://www.codeforces.com/problemset/problem/242/A这题比较简单,但是这题给我个启示:不要时时苛求算法,有时性能稍逊一点,方法则简单很多,更容易理解。先给出一个复杂的解答(该方法的好处是找清了所有规律,让运算时间最省):#include int main(){int a, b, x, y,原创 2012-11-13 18:31:34 · 838 阅读 · 0 评论 -
解题报告 codeforces 242B
对于题目我不在此翻译,只给出链接。原题目链接如下:http://codeforces.com/problemset/problem/242/B解这小道题目让我大费周折。主要原因是轻视了。人一轻敌,思维就不缜密。自信满满,从而易有忽略之处,还不容易查出。但从这道题目,我也看出自己的确有算法的潜质:我的解是最优的,所用内存最少——别人的答案中大都使用了数据结构存储输入的端点值,我没有存原创 2012-11-12 23:55:35 · 1455 阅读 · 1 评论 -
韩信点兵算法解析
关于韩信点兵的叙述,大家可以看 http://baike.baidu.com/view/30671.htm这类问题,我想说,没有想象中的难!原来做题,总是想找更简单的,其实都是要经过枚举才能找到答案的,只不过枚举是有技巧的。这个问题给我们一个启发,就是条件合并!就韩信点兵这题来讲,就是怎样把3, 5, 7 的余数,化为一个模3 * 5 * 7 的余数。因此这个最小数一定不大于3 *原创 2012-11-11 22:55:30 · 22831 阅读 · 0 评论 -
编程之美——求二进制数中1的个数
文中讲了五种方法:1. 循环利用除法和模运算。该方法最容易想到。可谓没有技术含量的。2. 循环利用位移和按位与。用位操作代替算术运算,提高效率。3. 只考虑数字中的1。有经验规律知:对于2的方幂N与N-1取与为0.因而,可以利用该规律想法怎么把原数字变为0,经过的步数就是1的个数。如果没有相应的经验或常识,该方法不容易想到。4. 利用分支操作。该方法速度并不快。但提供了一个思路:利原创 2012-10-17 10:34:07 · 1253 阅读 · 2 评论 -
计算机编程艺术[排序部分]阅读感想
当着手解决一个新问题时,先找某些相当明显的解决方法,然后再试图改进它,往往是明智的。 为什么会有这么多种排序算法。因为每种方法都有其优缺点,对于某些数据和硬件配置来说,它有可能超过其他的方法。目前许多最好的方法,都是针对特定的机器,根据特定的目的,对特定对象进行排序所得到的。 计数排序:对元素两两比较,直接确定元素位置。需要一个同样大小的辅助数组。分布计数排序:假设元素分布原创 2012-10-16 05:41:06 · 1264 阅读 · 1 评论 -
把M位的2^M种不同的0-1串按圆排列划分(3)终结
接上篇对循环的解析原理就是把n分解成n个数相加的种类。对循环的解析如下(以M=6为例):上篇的杨辉三角数是:1,6,15,20,15,6,1对应的1的个数是0,1,2,3,4,5,6由于0和1的对称性,只需分析1的个数是0,1,2,3的情况。0个1,自然只有一个,自成一组1个1的情况,只能分解成1为1,因而这个循环中只有一个特征串:100000,可以表示6个串2个1原创 2012-10-15 15:23:53 · 1080 阅读 · 0 评论 -
把M位的2^M种不同的0-1串按圆排列划分(2)之再思考
上一篇忘了讲到:从M位中取出n位的分布规律符合杨辉三角数的分布规律。即:拿M=6举例:杨辉三角数为:1,6,15,20,15,6,1对应的0个1的6位数有一个数,1个1的6位数有6个数,2个1的6位数有15个。。。。下面分别对不同个数的1分类考虑。显然:0个1的6位数有一个数,只能包含一个循环;1个1的6位数有6个数,也只包含一个循环。那么2个1的6位数有15个数,包含几个原创 2012-10-15 11:13:58 · 1095 阅读 · 0 评论 -
MIT算法导论第四节笔记——快速排序
快速排序是基于分治思想的一种原地排序,但其效率依赖于输入数据的排序状况。视频中分析了最好情况,最差情况,以及最好最差交替出现的情况。研究表明:数据划分为1:9和5:5效率上市一个数量级;最好和最差交替的情况和趋向于最好。 随机化快速排序,即随机化选择主元素。其效率不依赖于输入数据的排序状况。它的效率通常是归并排序的三倍。视频中精彩的部分是对随机化快速排序算法复杂度的推导过程,其中不原创 2012-10-14 12:33:29 · 699 阅读 · 0 评论 -
MIT算法导论第三节笔记——分治思想
这一节主要讲了分治思想,首先我应该向大家推荐两本参考书:《算法导论》和《算法概论》,很多讲课内容都在这两本书上,但不限于这两本书。 这次视频中设计的算法如下:归并排序折半查找求X的幂斐波那契数,包括1. 递归算法;2. 用存储每一个计算过的斐波那契数的方式,降低计算次数;3. 利用公式(受计算机精度的限制;4. 利用定理(2*2的矩阵幂的形式),再次降低计算次数。矩阵乘原创 2012-10-14 10:31:31 · 485 阅读 · 0 评论 -
MIT算法导论第二节笔记
本节主要讲了一些算法分析的内容4种渐近符号求解递归式的三种方法:(P38)1. 代换法(通常可以)2. 递归树方法(对所有都可以,但不严谨)3. 主方法-主定理(只对特等的递归式有效,包含三种情况)原创 2012-10-11 06:35:40 · 336 阅读 · 0 评论 -
MIT算法导论第一节笔记
算法分析——研究性能和资源利用的算法设计 什么比性能更重要?为什么要学习算法?1. 解决最前沿的东西(重复十年前的东西,一般不需要算法);2. 是更好用户体验的基础,更好安全性的保障;3. 性能是最底层的东西,相当于“货币”;4.有趣。 伪代码的好处:使算法描述简洁,易书写。三种算法分析:最坏时间分析——运行的上界,用户承诺时间平均时间分析(需要原创 2012-10-10 22:49:08 · 519 阅读 · 0 评论 -
红黑树的创建+线索化+性质检验+笔画输入法
本文红黑树的实现参考《算法导论》第二版。写此算法之前,发现网络上很多版本均存在这样那样的错误,于是就自己实现了一个,用于做中文输入法。《导论》2的算法描述省略了很多情况,故不能直接拿来用。文中的代码已全部补齐。代码内容包括红黑树的创建(左旋,右旋,插入调整),中序线索化红黑树(参考严文敏的《数据结构》),及红黑树的性质检测。程序中读取的测试文件是笔画输入法的笔画笔顺及对应的汉字。下面是源程原创 2013-02-05 14:16:41 · 962 阅读 · 0 评论