摘要: 全排列的hash函数,可以利用N位变进制,一般做法是用逆序数,但时间复杂度比较大。 设n位变进制数M,+i位逢i+1进一,显然M可表示的数的范围为[0, n!)共n!个 要生成n个数的排列,可以先从n个数挑一个,再从剩下的n-1个数挑一下,如此反复n次。 若最初的n个数是 0,1,2 ... n-1,第一次挑选的数是t,则可以将t放入到M的n-1位, 若第二次挑选的数是m,则 0 <= r <= n-1 且 r != t,当r等于n-1时, 不能将r放入到M的n-2位(可以放的最大数为n-2),但是注意到r值不可能为t, 该情况下将它的值改为t,得到的新r值肯定小等于n-2,因而可 阅读全文
posted @ 2011-05-08 22:00 flyinghearts 阅读(2075) 评论(0) 推荐(0) 编辑
摘要: 假设有某种很低级的芯片,不提供乘除法指令。问题1 计算从1加到N的和 (即 1 + 2 + 3 + ... + n)。问题2 求3的余数。对问题1,直接从1加到N,效率太差了,肯定不能这么干(小高斯都知道用乘法) 。既然不能用乘除法,那只好用加法来模拟了。 m * n,可以看做是 n个m相加,可以看做是 m,2*m, 4*m, 8*m, 16*m,... 中的几个相加。对问题2 设 n = 4 * a + b,则 n ≡ a + b (mod 3)unsignedsum(unsignedn){unsignedmin_v,max_v,ret=0;if(n&1){max_v=n;min_v 阅读全文
posted @ 2011-05-08 21:42 flyinghearts 阅读(317) 评论(0) 推荐(0) 编辑
摘要: SingleList*Reverse_SingleList(SingleList*head){SingleList*prev=NULL;while(head!=NULL){SingleList*next=head->next;head->next=prev;prev=head;head=next;}returnprev;} 阅读全文
posted @ 2011-05-08 19:53 flyinghearts 阅读(288) 评论(0) 推荐(0) 编辑