摘要: 对于T(n) = a*T(n/b)+c*n^k;T(1) = c 这样的递归关系,有这样的结论:if (a > b^k) T(n) = O(n^(logb(a)));logb(a)b为底a的对数if (a = b^k) T(n) = O(n^k*logn);if (a < b^k) T(n) = O(n^k);a=25; b = 5 ; k=2a==b^k 故T(n)=O(n^k*logn)=O(n^2*logn)T(n) = 25T(n/5)+n^2= 25(25T(n/25)+n^2/25)+n^2= 625T(n/25)+n^2+n^2 = 625T(n/25) + 2n^2 阅读全文
posted @ 2012-10-05 17:42 爱也玲珑 阅读(4238) 评论(1) 推荐(1) 编辑
摘要: 如何等概率的从N个元素中选取出K个元素?这个问题就是一个蓄水池抽样(Reservoir Sampling),算法可以如下描述:Init: a reservoir with the size: kfori= k+1toNM=random(1, i);if( M < k)SWAPthe Mthvalueandithvalueend for网上有人给出了证明,先转过来:【转】证明:每次都是以 k/i 的概率来选择例: k=1000的话,从1001开始作选择,1001被选中的概率是1000/1001,1002被选中的概率是1000/1002,与我们直觉是相符的。接下来证明:假设当前是i+1, 按 阅读全文
posted @ 2012-09-27 23:38 爱也玲珑 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 要想把字符串S1变成S2,可以经过若干次下列原子操作:1.删除一个字符2.增加一个字符3.更改一个字符字符串S1和S2的编辑距离定义为从S1变成S2所需要原子操作的最少次数。解法跟上面的最长公共子序列十分相似,都是动态规划,把一个问题转换为若干个规模更小的子问题,并且都借助于一个二维矩阵来实现计算。约定:字符串S去掉最后一个字符T后为S',T1和T2分别是S1和S2的最后一个字符。则dist(S1,S2)是下列4个值的最小者:1.dist(S1',S2')--当T1==T22.1+dist(S1',S2)--当T1!=T2,并且删除S1的最后一个字符T13.1+ 阅读全文
posted @ 2012-09-10 23:43 爱也玲珑 阅读(436) 评论(0) 推荐(0) 编辑
摘要: 题目:二叉树的结点定义如下:struct TreeNode{int m_nvalue;TreeNode* m_pLeft;TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。解法:要想找到两个节点的最低共同父结点,其实就是找一个节点,使得它的左子树包含两个结点中的一个结点,右子树包含另外一个节点。该算法的C代码可以写成如下:View Code Node * pResult = null; int GetChildNode(Node * pRoot, Node * node_1, Node * node_2) { if (null... 阅读全文
posted @ 2012-09-10 23:35 爱也玲珑 阅读(549) 评论(0) 推荐(0) 编辑
摘要: 问题背景:有一副牌假设有N张,请设计一个随机洗牌算法。解决方案:这里只给出一个可以使用数学证明每张牌出现在任何位置概率为1/N的算法。Poker[N]for (i = 0; i < N; ++i){k = rand() % ( i + 1)if (i != k){switch(Poker[k], Poker[i]);}}分析:第一次取第一张牌(i=0)保持位置不变。第二次取第二张牌(i=1),随机生成0-1的随机数k,如果随机生成数不为1,则交换下标为k和i的牌,否则不进行交换。假设现在取第Z张牌(i = Z - 1), k= rand()%Z, 如果k!=i则交换下标为k和i的两张牌。 阅读全文
posted @ 2012-09-10 22:18 爱也玲珑 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。解法:1> 求出5个数值中的最大和最小值 Max, Min.2> 如果Min = Max = 0, 则是连续的。3> 遍历整数数据将所有在Min 和 Max之间的数值求和sum, 包括min 和Max本身。4> 如果sum的与5个元素的和相等,则说明5个元素是相邻连续的。算法时间复杂度为O(N), 空间复杂度为O(1) 阅读全文
posted @ 2012-09-10 22:06 爱也玲珑 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 问题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。解答:假设我们要等概率生成一个3位的10进制数(000 - 999),我们可以在 随机生成整数0到9的函数 基础上,随机生成3个数字组成三位数就得到了结果。这里类似,我们首先必须认识到:任何一个数都可以用5进制的数来表示,如12 = 5进制(22) = 2*5 + 2。因此假设我们要随机生成[0,444]范围的数,我们只要随机生成3个5进制的数字组合就可以。这里的主要问题是:7不是5的幂次方。但是我们可以将某一个5的幂次方均分成 7 段(分别为0 - 6,等概率的落到每一段),利用5进制随机成一个数,看这个数在哪一个段,就代 阅读全文
posted @ 2012-09-10 22:02 爱也玲珑 阅读(373) 评论(0) 推荐(0) 编辑
摘要: C/C++中关于main()函数中argc 和argv[]的说明main(int argc,char *argv[]);argc代表命令行输入参数的个数argv存储了所有的命令行参数如:源代码如下#include <stdio.h>int main(int argc, char ** argv){ int i; for (i=0; i < argc; i++) printf("Argument %d is %s.\n", i, argv[i]); return 0;}编译后产生hello.exe文件在命令行下找到hello.exe的文件夹输入如下命令:he 阅读全文
posted @ 2012-08-14 15:56 爱也玲珑 阅读(17650) 评论(1) 推荐(0) 编辑
摘要: (1)用队列表示栈数据结构:一个队列Q1入栈:将数据插入队列Q1,若Q1满,则表示栈空间已满。出栈:从Q1中取出前n-1个元素,在入队列,则再跳出一个元素,就相当于出栈。若Q1为空,则表示栈空间为空。相当于数组循环移位。分析:栈空间是队列空间。出栈的时间复杂度为O(n)(2)用栈模拟队列数据结构:两个栈S1和S2入队:将数据入栈S1,若S1满,则判断S2中是否有元素,若有,则表示队列满,若没有,则将S1中的元素全部压入S2中,再将数据入S1.出队:从S2中出栈,若S2空,则判断S1中是否为空,若空,则表示队列为空,若有元素,则将S1中的元素压入S2中,再S2出栈。分析:S1表示入队,S2表示出 阅读全文
posted @ 2012-08-14 15:22 爱也玲珑 阅读(449) 评论(0) 推荐(1) 编辑
摘要: 2011-10-30 11:42:14|分类:默认分类|字号订阅问题:1、如何判断一个单链表是否有环?2、如果链表为存在环,如果找到环的入口点问题1解法:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:View Code bool IsExitsLoop(slist *head){ slist *slow = head, *fast = head; while ( fast && fast 阅读全文
posted @ 2012-08-14 15:15 爱也玲珑 阅读(1234) 评论(0) 推荐(0) 编辑