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

利用 p, 1-p 随机数发生器知道等概率发生器
摘要:已有一个随机数发生器,生成0的概率为p,生成1的概率为1-p,求如何利用这个随机数发生器制作一个生成1~n的概率都是 1/n 的发生器制作 1 2 发生概率都是 1 / 2 的发生器,连续发生2次,则发生00,11的概率为p*p,(1-p)(1-p),发生10,01的概率都为p(1-p),在发生10时返回1,发生01时返回2,则发生1,2的概率相等制作 1 2 3 发生概率都是 1 / 3的发生器,连续发生3次,则发生001,010,100的概率都为p*p*(1-P),或者是110,101,011概率都为p*(1-p)*(1-p),则用001,010,100分别对应1,2,3返回,即可使得发生 阅读全文
posted @ 2012-09-25 01:03 ZimZz 阅读(3105) 评论(0) 推荐(2) 编辑
PHP 二叉树的深度优先与广度优先遍历
摘要:1 <?php 2 #二叉树的广度优先遍历 3 #使用一个队列实现 4 5 class Node { 6 public $data = null; 7 public $left = null; 8 public $right = null; 9 }10 11 #@param $btree 二叉树根节点12 function breadth_first_traverse($btree) {13 $traverse_data = array();14 ... 阅读全文
posted @ 2012-09-24 23:41 ZimZz 阅读(4351) 评论(0) 推荐(0) 编辑
PHP 查找有序数组中和为n的数对
摘要:1 <?php 2 #查找有序数组中和为n的数对 3 #思路是从数组两边开始找,当a[h] + a[t] == n,返回数对 4 #当a[h] + a[t] < n, h++ 5 #当a[h] + a[t] > n, t-- 6 7 function search_n($a, $n) { 8 $h = 0; 9 $t = count($a) - 1;10 $pairs = array();11 12 while ($h < $t) {13 $sum = $a[$h... 阅读全文
posted @ 2012-09-24 23:12 ZimZz 阅读(352) 评论(0) 推荐(0) 编辑
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... 阅读全文
posted @ 2012-09-24 22:11 ZimZz 阅读(642) 评论(0) 推荐(0) 编辑
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 ... 阅读全文
posted @ 2012-09-24 21:23 ZimZz 阅读(11824) 评论(0) 推荐(1) 编辑
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... 阅读全文
posted @ 2012-09-24 00:41 ZimZz 阅读(471) 评论(0) 推荐(0) 编辑
洗牌算法
摘要:1 <?php 2 #洗牌算法,假设共有n张各不相同的牌 3 #易知n张牌共有n!中排列方法,洗牌算法关键在于让这n!排列方法出现的概率相等 4 5 function swap(&$arr, $i, $j) { 6 $temp = $arr[$i]; 7 $arr[$i] = $arr[$j]; 8 $arr[$j] = $temp; 9 }10 11 function shuffle_poker(&$arr) {12 $len = count($arr);13 for ... 阅读全文
posted @ 2012-09-22 23:18 ZimZz 阅读(281) 评论(0) 推荐(0) 编辑
PHP 二叉查找树
摘要:二叉查找树:简单点说就是颗做孩子小,右孩子大的树说几个关键点最小值:总是树的最左节点的key最大值:总是树的最右节点的key前趋:按照中序遍历的顺序,遍历输出时当前节点的前一个节点 如果当前节点有左子节点,前驱就是当前节点的左边的最右节点,也可以认为是以当前节点的左孩子为根的树的最大值 如果当前节点没有左子节点,前驱就是找到一个父节点,使得当前节点位于该父节点的右边,不明白的看代码后继:按照中序遍历的顺序,遍历输出时当前节点的后一个节点 如果当前节点有右子节点,后继就是当前节点的右边的最左节点,也可以认为是以当前节点的右孩子为根的树的最小值 如果当前节点没有柚子节点,后... 阅读全文
posted @ 2012-09-19 00:08 ZimZz 阅读(1107) 评论(0) 推荐(0) 编辑
散列表小蛋B
摘要:散列表的意义直接寻址表需要申请全域U大小的空间来存储数据,其中全域U中的有效数据集合为K,那么其存储情况如下图而如果利用散列函数h,将全域U的值映射到h(U)->{0, 1, 2, 3 ... m - 1},则可以缩小存储空间,如下图冲突如上图,k2和k5发生了冲突,解决冲突的方法有如下几种1.链接法,如下图2.开放寻址法(一下内容抄自百科)①线性探查法(Linear Probing) 该方法的基本思想是:将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:d,d+l,d+2,…,m-1,0,1,…,d-1 .即:探查时从地址d开 阅读全文
posted @ 2012-09-18 02:32 ZimZz 阅读(321) 评论(0) 推荐(0) 编辑
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... 阅读全文
posted @ 2012-09-17 22:56 ZimZz 阅读(469) 评论(0) 推荐(0) 编辑
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)... 阅读全文
posted @ 2012-09-17 01:04 ZimZz 阅读(597) 评论(0) 推荐(0) 编辑
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 ... 阅读全文
posted @ 2012-09-16 23:31 ZimZz 阅读(1223) 评论(0) 推荐(0) 编辑
12小球称重问题
摘要:有12个小球,有一个质量和其它十一个不一样,不知道是重还是轻。用一个天秤称三次,把这个质量不同的球给区别出来将12个小球编号 1~C1 对比 1234 & 56781.1 1234 = 5678,则坏球在9ABC中,第二次称 1239 & 56AB1.1.1 1239 = 56AB,则坏球是C1.1.2 1239 > 56AB,则坏球在9AB中,且 9 > AB 第三次称 A & B1.1.2.1 A = B, 坏球是9, 9偏重1.1.2.2 A > B, 坏球是B, B偏轻1.1.2.3 A < B, 坏球是A, A偏轻1.1.3 1239 阅读全文
posted @ 2012-09-16 02:10 ZimZz 阅读(3394) 评论(1) 推荐(0) 编辑
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... 阅读全文
posted @ 2012-09-16 00:18 ZimZz 阅读(1686) 评论(0) 推荐(0) 编辑
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... 阅读全文
posted @ 2012-08-23 01:45 ZimZz 阅读(756) 评论(0) 推荐(0) 编辑
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) ... 阅读全文
posted @ 2012-08-22 01:58 ZimZz 阅读(8525) 评论(0) 推荐(1) 编辑
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) ... 阅读全文
posted @ 2012-08-21 02:07 ZimZz 阅读(540) 评论(0) 推荐(0) 编辑
PHP 快速排序
摘要:快排平均效率O(nlogn),最好情况O(nlogn),最坏情况是当数组有序时,退化成O(n^2) 1 <?php 2 #快速排序 3 #@param $arr 待排序数组 4 #@param $start 排序的开始坐标 5 #@param $end 排序数组的结束坐标 6 function quickSort(Array &$arr, $start, $end) { 7 $low = $start; 8 $high = $end; 9 10 #同时移动low和high,... 阅读全文
posted @ 2012-08-19 14:36 ZimZz 阅读(1948) 评论(0) 推荐(0) 编辑
PHP 堆排序
摘要:堆排序平均效率,最好效率,最坏效率均为O(nlogn) 1 <?php 2 #堆排序 3 function heapSort(&$arr) { 4 #初始化大顶堆 5 initHeap($arr, 0, count($arr) - 1); 6 7 #开始交换首尾节点,并每次减少一个末尾节点再调整堆,直到剩下一个元素 8 for($end = count($arr) - 1; $end > 0; $end--) { 9 $temp = $arr[0];10 ... 阅读全文
posted @ 2012-08-18 23:04 ZimZz 阅读(2228) 评论(0) 推荐(0) 编辑
PHP 直接选择排序
摘要:直接选择排序平均效率,最好情况,最坏情况均为O(n^2) 1 <?php 2 #简单选择排序 3 function selectSort(Array $arr) { 4 $len = count($arr); 5 for($i = 0; $i < $len; $i++) { #一共进行$len轮查找 6 $minInx = $i; 7 for($j = $i; $j < $len; $j++) { #每轮从第$j个元素开始,找出一个最小的元素,并和第$j个元素交换位置 8 ... 阅读全文
posted @ 2012-08-18 17:04 ZimZz 阅读(749) 评论(1) 推荐(0) 编辑