随笔分类 -  算法与数据结构

PHP 希尔排序
摘要:希尔排序平均时间复杂度O(n^1.3),最好情况O(n),最坏情况O(n^2) 1 <?php 2 #希尔排序 3 function shellSort(Array $arr) { 4 $k = initStep(count($arr)); 5 $step = pow(2, $k) - 1; 6 #根据步长进行多次插入排序,依次减少步长, 7 for(;$step >= 1; $step = pow(2, --$k) - 1) { 8 $arr = insertSort($arr, $ste... 阅读全文
posted @ 2012-08-17 00:46 ZimZz 阅读(647) 评论(0) 推荐(0) 编辑
PHP 直接插入排序
摘要:一般直接插入排序的时间复杂度为O ( n^2 ) ,但是当数列基本有序时,如果按照有数列顺序排时,时间复杂度将改善到O( n ) 1 <?php 2 #指定部分数组元素全部向后移动一位 3 function move(Array $arr, $start = null, $end = null) { 4 if(!isset($start) || $start < 0) $start = 0; 5 if(!isset($end) || $end >= count($arr)) $end = count($arr) - 2; #最后只能选到倒数... 阅读全文
posted @ 2012-08-16 21:07 ZimZz 阅读(1960) 评论(0) 推荐(0) 编辑
给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?
摘要:可以估计每个文件的大小为5G*64=300G,远大于4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。遍历文件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个小文件(设为a0,a1,...a999)当中。这样每个小文件的大小约为300M。遍历文件b,采取和a相同的方法将url分别存储到1000个小文件(b0,b1....b999)中。这样处理后,所有可能相同的url都在对应的小文件(a0 vs b0, a1 vs b1....a999 vsb999)当中,不对应的小文件(比如a0 vs b99)不可能有相同的url。然后我们只要求出1 阅读全文
posted @ 2012-08-16 00:25 ZimZz 阅读(5071) 评论(0) 推荐(0) 编辑
[转]给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词
摘要:一个单词如果交换其所含字母顺序,得到的单词称为兄弟单词,例如mary和army是兄弟单词,即所含字母是一样的,只是字母顺序不同,用户输入一个单词,要求在一个字典中找出该单词的所有兄弟单词,并输出。给出相应的数据结构及算法。要求时间和空间复杂度尽可能低目前思想:struct {char data;int n};根据数学定理:任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积 N=(P_1^a1)*(P_2^a2)......(P_n^an) , 这里P_1<P_2<...<P_n是质数,且唯一。例如a=2 b=3 c=5 d=7 e=11...f(abcd)=2*3*5 阅读全文
posted @ 2012-08-15 23:13 ZimZz 阅读(2861) 评论(0) 推荐(0) 编辑
用最简单的方法判断一个LONG整形的数A是2^n(2的n次方)
摘要:如果一个数是2的n次方,则化成二进制数肯定是 1000...000 的形式,那么 假设这个数是x,则 x-1 肯定是 0111...111 的形式,位数比x少一位那么 x & (x-1) 则有1000...000 &0111...1110000...000所以当 x & (x-1) = 0时,说明x是2的n次方 阅读全文
posted @ 2012-08-15 23:03 ZimZz 阅读(1730) 评论(0) 推荐(0) 编辑
设计一个复杂度为n的算法找到链表倒数第m个元素,最后一个元素假定是倒数第0个
摘要:使用两个指针,每次前进一个元素,第一个指针前进到第m+1个元素的时候,第二个指针开始前进,此时第二个指针指向第1个元素,当第一个指针前进到链表尾的时候,第二个指针指向的元素就是倒数第m个元素 阅读全文
posted @ 2012-08-15 21:53 ZimZz 阅读(357) 评论(2) 推荐(0) 编辑
判断链表是否有环,找链表中间节点,判断两个链表是否相交
摘要:判断是否有环和查找中间节点使用两个指针,p1每次前进1个节点,p2每次前进2个节点,如果链表有环,则最后两个指针指向的节点将会重合,若无环,则p2最后将走到链表尾,当p2走到链表尾时,p1指向的节点就是中间节点检测环的入口当p1p2重合以后,让p2回到表头,步长设为1重新开始走,当p1p2再次重合时,重合点即为环入口证明:如图表头到环入口长度为l1,环的长度为l2,环的入口为h点,p2p1第一次重合点为h'点,设hh'长度为l3,则有在第一次重合时p1走过的路程 = l1 + l3p2走过的路程 = l1 + l3 + n * l2 = 2 * (l1+l3)=> l2 阅读全文
posted @ 2012-08-15 21:49 ZimZz 阅读(687) 评论(0) 推荐(0) 编辑
关于敏感词过滤的一点想法
摘要:问题背景:有一个用户留言板,留言在100字内,另外有一个滤词表,现在需要对用户留言进行过滤,清楚留言中出现并且出现在滤词表中的单词针对留言长度相对于滤词表单词而言较短,可采用如下滤词法1.构建滤词表的HashMap(filterMap)对滤词表中的每个单词做一次Hash,以Hash散列值作为Key,单词内容作为Value2.构建滤词表单词的起始符表和结束符表2.1起始符表将滤词表中每个单词的起始字符构建成一个表,作为起始符表(startList)2.2结束符表将滤词表中每个单词的结束字符构建成一个表,作为结束符表(endList)3.搜索留言敏感词1)从留言第一个字开始,与startList中 阅读全文
posted @ 2012-05-09 17:31 ZimZz 阅读(1232) 评论(0) 推荐(0) 编辑
PHP 求n*m二维矩阵最大子矩阵 O(n*n*m)
摘要:1 <?php 2 #求二维矩阵的最大子矩阵 3 4 #构造求和表 5 #s[i][j]表示从1..i行,1..j列所有元素之和 6 #可以利用公式s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1]s[j - 1] + a[i][j]求得 7 function build_sum_tab($a) { 8 #初始化第0列和 9 for ($i = 0; $i < count($a); $i++) {10 $s[$i][0] = 0;11 for ($j = 0; $j <= $i; ... 阅读全文
posted @ 2012-05-05 02:17 ZimZz 阅读(1386) 评论(0) 推荐(0) 编辑
PHP猴子选大王问题
摘要:问题简介:n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王. 这里使用一个递推公式: f[i] = 0 i = 1 f[i] = (f[i-1] + m) % 阅读全文
posted @ 2012-05-05 00:26 ZimZz 阅读(1903) 评论(0) 推荐(0) 编辑
PHP冒泡排序
摘要:1 <html> 2 <body> 3 <?php 4 function bubble_sort($array) { 5 for($i = 0; $i < count($array) - 1; $i++) { //$i为已经排过序的元素个数 6 for($j = 0; $j < count($array) - 1 - $i; $j++) { //$j为需要排序的元素个数,用总长减去$i 7 if($... 阅读全文
posted @ 2012-05-04 17:39 ZimZz 阅读(2836) 评论(0) 推荐(0) 编辑