随笔分类 -  Algorithms

Varies of algorithms
关于素数
摘要:素数的定义:恰有两个不同正整数因子的整数成为素数。大于1的每个正整数都至少能被两个整数整除,因为正整数可以被1和他自己整除。合数的定义:大于1,又不是素数的正整数。算术基本定理:每个大于1的正整数都可以唯一地写为两个或多个素数的乘积,其中素数因子以非递减序出现。根据此定理可以看出,素数是构成正整数的积木。定理2:如果n是个合数,那么n必有小于或等于√n的一个素因子。定理3:有无限多个素数。整数的素因子分解算法分析: 给定一个整数n,可以从最小的素数2开始,从小到大用一个一个素数去除n。如果n有素数因子,那么必定能够找到一个不大于√n的素因子p,否则,根据定理2,n即为素数。如果找到了素因子p. 阅读全文
posted @ 2012-04-10 14:24 shosciation 阅读(481) 评论(1) 推荐(1)
锁和钥匙的分配问题
摘要:这个问题来自于How To Share a Secret -- Adi Shamir原文是这样的:Eleven scientists are working on a secret project. They wish to lock up the documents in a cabinet so that the cabinet can be opened if and only if six or more of the scientists are present. What is the smallest number of locks needed? What is the sma 阅读全文
posted @ 2012-03-19 22:06 shosciation 阅读(828) 评论(0) 推荐(0)
动态规划 -- 矩阵链乘法
摘要:矩阵链乘法n个矩阵相乘,A1A2...An,试着找到一种相乘顺序,使得整个相乘的过程中所做的标量乘法次数最少,即相乘的代价最小。问题分析: 记矩阵Ai的行列分别为Pi-1和Pi,那么A1*A2所做的乘法的次数为P0*P1*P2A1A2...An的最小相乘代价为f(1,n),Ai...Aj的最小相乘代价为f(i,j)则 f(1,n) = min{f(1,k)+f(k+1,n)+P0*Pk*Pn} k=1...n-1f(i,i)=0 f(i,i+1)=Pi-1*Pi*Pi+1So 可以由此产生递归式 1 Recursive_Matrix_Multiply(p, i, j) 2 { 3 ... 阅读全文
posted @ 2012-03-16 20:34 shosciation 阅读(708) 评论(0) 推荐(0)
桶中取黑白球问题
摘要:桶中有n个黑球,n个白球,取球规则如下:每次从桶中取两个球,如果两球同色,则放回一个黑球,否则放回一个白球。问:最后桶中剩下一个黑球的概率是多大?分析取球的规则,每次取完球之后,黑球的数量要么增1,要么减1,白球的数量要么不变,要么减2。如果说桶中只剩下一个球,鉴于白球的递减是以2为倍数,所以,当n为奇数时,桶中剩下的一定是白球,当n为偶数时,桶中剩下的一定是黑球。编程之美中,作者提出了用异或的数学逻辑来模拟取球的过程,黑球看作是0,白球看作是1,这样的话,取球规则就相当于把取出的数字异或之后再把结果丢回去。0 XOR 0 =01 XOR 1 =00 XOR 1 =1这样以来,每次取完数字之后 阅读全文
posted @ 2012-03-07 21:34 shosciation 阅读(469) 评论(1) 推荐(0)
读书笔记:编程之美--求二进制数中1的个数
摘要:1.最先想到的办法是x对2求余,判断是否为零,不为零则最低位为1,x除以2,以此往复2.考虑到求余是2比较耗时,想到能否用位操作来处理,于是有了一下解法:x&0x01,如果为1,则最低位为1,x右移一位,以此往复3.位操作虽然比求余效率高,但上述两种解法的时间复杂度都是x的最高位为1的位数,即log2x,例如x为00100100,那么时间复杂度即为O(6),能否把时间复杂度将为只和1的个数相关呢? 编程之美中作者给出了答案: int Count(BYTE v){ int num = 0; while(v) {v&=(v-1); num++; } return num;}为何上面 阅读全文
posted @ 2012-03-06 16:55 shosciation 阅读(226) 评论(0) 推荐(0)