2012年3月13日

摘要: 来自同学家铭的分享,整理下作为自己的笔记。算法的步骤如下:找出待排序的数组中最大和最小的元素将数组中值为i的元素出现的次数存入数组C的第i项对所有的计数累加C[i] += C[i-1];反向填充目标数组将元素i放在新数组的第C[i]项,每放一个就将C[i]减去1效果图:时间复杂度当输入是n个[0,k]之间的整数时时间复杂度为 Θ(n + k)。计数排序不基于比较,排序的速度快于任何比较排序算法。局限性在排序前需要知道数据的最大最小值对于数据范围很大的数组,需要大量的时间和内存桶排序基数排序 注意点:如果想从高位到低位来进行调整,没次都要需要考虑上一位是否需要调整,会很麻烦,不如从低位来的简单 阅读全文
posted @ 2012-03-13 21:15 aho 阅读(373) 评论(0) 推荐(0) 编辑

2012年3月12日

摘要: 问题:现在有一个函数int r()可以随机获得[0, 6]之间的随机整数,问:如何正确使用此函数来随机获得 [0, 9]之间的整数?答案:int rand_ten(){ x = 7 * r() + r(); if (x > 39) { return rand_ten(); } return x / 4; //或者x%10;}解析7 * r() + r()得到的是[0, 48]直接的随机数,每个数出现的概率是相等的。现在我们直接抛弃>39以上的数,即得到[0, 39]之间的随机数,每个数出现的概率也是一样的。之后的/4或者%10就无所谓了。 阅读全文
posted @ 2012-03-12 15:30 aho 阅读(167) 评论(0) 推荐(0) 编辑

2012年3月9日

摘要: 1 11 21 1211 111221 ?答案:3122111 -> 11(1个1)->21 (2个1)-> 1211(1个2,1个1) 依次类推 阅读全文
posted @ 2012-03-09 17:05 aho 阅读(234) 评论(0) 推荐(0) 编辑

2012年3月7日

摘要: 《编程之美》4.6读书笔记问题:有一个桶,里面有白球和黑球各100个,规则如下:每次随机从桶中取出两个球如果是两个同色的球,就再放入一个黑球如果是两个异色的球,就再放入一个白球问:最后桶中只剩下一个黑球的概率是多少?解法:刚拿到这个问题,我的第一个想法就是用程序来计算各种情形出现的概率,然后再用递归求出最终的结果,不过可能因为程序存在一个bug,结果一直得到的是一个错误的结果下面列出作者给出的正确解法,看来思维僵化实在太可怕了!解法一:我们可一个用一个set(黑球数量, 白球数量)来表示桶中的黑球和白球的个数。从桶中取出球后,只可能是下列三种操作:取出的是两个黑球,则放回一个黑球:(-2, 0 阅读全文
posted @ 2012-03-07 17:52 aho 阅读(547) 评论(1) 推荐(1) 编辑
摘要: 问题:写一个程序,求两个正整数的最大公约数。如果这两个整数都很大,有什么简单的算法吗?思路: 求最大公约数是一个很基本的问题,早在公元前300年左右,欧几里得就在他的著作《几何原本》中给出了高效的解法——辗转相除法。 辗转相除法的原理很简单,设两数为a、b(a>b),b最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零除数即为(a,b)的最大公约数。 阅读全文
posted @ 2012-03-07 12:26 aho 阅读(411) 评论(0) 推荐(0) 编辑

导航