随笔分类 - PHP
PHP 查找一个在数组中出现次数超过一半的数,时间复杂度O(n),空间复杂度O(1)
摘要:1 <?php 2 #查找一个在数组中出现次数超过一半的数,时间复杂度O(n),空间复杂度O(1) 3 4 #使用b存储数组中某个数,c存储其出现次数 5 #遍历数组,如果b == a[i],则 c++; 6 #如果b != a[i], c == 0, 则 b = a[i], c = 1; 7 #如果b != a[i], c != 0, 则 c--; 8 #易知,如果一个数出现次数超过了一半,则无论其c怎么减,也不可能减到0,并被替换掉 9 #所以数组遍历完以后,b就是出现超过一半的数 10 function searc...
阅读全文
PHP 短连接生成
摘要:1 <?php 2 #短连接生成算法 3 4 class Short_Url { 5 #字符表 6 public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 7 8 public static function short($url) { 9 $key = "alexis";10 $urlhash = md5($key . $url);11 ...
阅读全文
PHP 求最大递增子序列长度
摘要:1 <?php 2 #最大递增子序列的查找 3 function max_subincseq($a) { 4 $len = count($a); 5 $lis = array(); #lis数组用于存储当前最长子序列长度,lis[i]表示以a[i]结尾的最长递增子序列长度 6 $lis[0] = 1; 7 $max_seqlen = 1; 8 9 for ($i = 1; $i < $len; $i++) {10 $lis[$i] = 1;11 f...
阅读全文
PHP 二叉查找树
摘要:二叉查找树:简单点说就是颗做孩子小,右孩子大的树说几个关键点最小值:总是树的最左节点的key最大值:总是树的最右节点的key前趋:按照中序遍历的顺序,遍历输出时当前节点的前一个节点 如果当前节点有左子节点,前驱就是当前节点的左边的最右节点,也可以认为是以当前节点的左孩子为根的树的最大值 如果当前节点没有左子节点,前驱就是找到一个父节点,使得当前节点位于该父节点的右边,不明白的看代码后继:按照中序遍历的顺序,遍历输出时当前节点的后一个节点 如果当前节点有右子节点,后继就是当前节点的右边的最左节点,也可以认为是以当前节点的右孩子为根的树的最小值 如果当前节点没有柚子节点,后...
阅读全文
PHP 带哨兵双向队列
摘要:1 <?php 2 #带哨兵的双链表实现 3 4 #链表节点 5 class Node { 6 public $pre = null; 7 public $next = null; 8 public $key = null; 9 }10 11 #查找链表值12 function search($list, $key) {13 $cnode = $list->next;14 while ($cnode !== $list && $cnode->key !== $ke...
阅读全文
PHP 查找数组第i小元素
摘要:1 <?php 2 #随机选择第i小的数字,用随机快排实现 3 4 #交换元素 5 function swap(&$arr, $i, $j) { 6 $temp = $arr[$i]; 7 $arr[$i] = $arr[$j]; 8 $arr[$j] = $temp; 9 }10 11 #随机划分12 function randomized_partition(&$arr, $begin, $end) {13 $rand_inx = rand($begin, $end)...
阅读全文
PHP 基数排序(计数排序实现)
摘要:1 <?php 2 #基数排序,此处仅对正整数进行排序,至于负数和浮点数,需要用到补码,各位有兴趣自行研究 3 4 #计数排序 5 #@param $arr 待排序数组 6 #@param $digit_num 根据第几位数进行排序 7 function counting_sort(&$arr, $digit_num = false) { 8 if ($digit_num !== false) { #如果参数$digit_num不为空,则根据元素的第$digit_num位数进行排序 9 ...
阅读全文
PHP 优先队列的实现
摘要:优先队列其实就是一个最大堆,主要是对最大堆的操作上的一些调整 1 <?php 2 #最大优先队列的实现 3 4 #交换函数 5 function swap(&$arr, $inx1, $inx2) { 6 $temp = $arr[$inx1]; 7 $arr[$inx1] = $arr[$inx2]; 8 $arr[$inx2] = $temp; 9 }10 11 #最大堆节点下沉调整12 #@param $arr 待调整数组13 #@param $sta...
阅读全文
PHP 二进制数相加
摘要:1 <?php 2 #二进制相加 3 function binary_plus($binstr1, $binstr2) { 4 $bin_arr1 = str_split($binstr1); 5 $bin_arr2 = str_split($binstr2); 6 $arr_len1 = count($bin_arr1); 7 $arr_len2 = count($bin_arr2); 8 $sum_arr = array(); 9 10 if ($arr_len1 < $arr...
阅读全文
PHP 树的先序,中序,后序遍历
摘要:1 <?php 2 #树节点 3 class Node { 4 public $lc = null; #左孩子 5 public $rc = null; #右孩子 6 public $val; 7 8 public function __construct($val) { 9 $this->val = $val;10 }11 }12 13 #先序遍历14 function preTraverse(Node $ro...
阅读全文
PHP 二分查找
摘要:二分查找需要数组有序,效率为O(logn) 1 <?php 2 #二分查找 3 function binarySearch(Array $arr, $target) { 4 $low = 0; 5 $high = count($arr) - 1; 6 7 while($low <= $high) { 8 $mid = floor(($low + $high) / 2); 9 #找到元素10 if($arr[$mid] == $target) ...
阅读全文
PHP 合并排序
摘要:合并排序是稳定排序,平均效率为O(nlogn),需要的辅助空间是O(n) 1 <?php 2 #归并排序 3 #@param $arr 待排序数组 4 #@param $from 排序的起始坐标 5 #@param $end 排序的结束坐标 6 function mergeSort(&$arr, $from, $end) { 7 #切分数组直到数组元素只剩下一个 8 if($from < $end) { 9 $mid = floor(($from + $end) ...
阅读全文
PHP array_splice函数实现数组任意位置插入
摘要:定义和用法array_splice() 函数与 array_slice() 函数类似,选择数组中的一系列元素,但不返回,而是删除它们并用其它值代替。如果提供了第四个参数,则之前选中的那些元素将被第四个参数指定的数组取代。最后生成的数组将会返回。语法array_splice(array,offset,length,array)参数描述array必需。规定数组。offset必需。数值。如果 offset 为正,则从输入数组中该值指定的偏移量开始移除。如果 offset 为负,则从输入数组末尾倒数该值指定的偏移量开始移除。length可选。数值。如果省略该参数,则移除数组中从 offset 到 结尾
阅读全文
PHP查找数组中最大值与最小值
摘要:<?php function maxMin(Array $arr) { $cmpTime = 0; $count = count($arr); $big = $small = $arr[0]; for($i = 1; $i < $count; $i++) { $cmpTime++; if($big > $arr[$i]) { $cmpTime++; if($small > $arr[$i]) { ...
阅读全文
关于正则的贪心匹配与换行符匹配
摘要:最近做一个问题,去除html中代码的JS脚本,代码如下 1 <?php 2 $text = <<<EOF 3 ilove you 4 <scrip></sss> 5 <script> ok </script> 6 kkyz <dd>m,dfd 7 <script> 8 sdfsdf 9 </script>10 <script> no </script>11 ook12 EOF;13 14 echo "orginal text: \n\n" .
阅读全文
PHP实现mb_substr函数
摘要:1 <?php 2 function myMbSubstr($str, $start, $length, $charset){ 3 $charsets["utf-8"] = $charsets["utf8"] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; 4 $charsets["gb2312"] = "/[\x01-\x7f]|[\xb0-\xf7][\xa
阅读全文
PHP求两个数组的交集
摘要:1 <?php 2 $arr1 = array(1, 3, 5, 8, 9); 3 $arr2 = array(1, 3, 4, 7, 9); 4 $intersaction= array(); 5 foreach($arr1 as $val) { 6 if(in_array($val, $arr2)) $intersaction[] = $val; 7 } 8 9 var_dump($intersaction);10 ?>输出array(3) { [0]=> int(1) [1]=> int(3) [2]=> int...
阅读全文
PHP双向队列
摘要:1 <?php 2 # 双向队列 3 class Deque { 4 public $queue = array(); 5 6 public function frontAdd($obj) { 7 array_unshift($this->queue, $obj); 8 } 9 10 public function frontRemove() {11 return array_shift($this->queue);12 ...
阅读全文
PHP各种魔术方法测试
摘要:1 <?php 2 #自动加载方法,当new一个class时,若class未被引入,则会自动调用__autoload()方法 3 function __autoload($className) { 4 include $className . ".php"; 5 } 6 7 class Son { 8 private $name; 9 10 public function __construct($name) { 11 $this->name = $n...
阅读全文