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

Trie / Radix Tree / Suffix Tree
摘要:Trie (字典树)"A", "to", "tea", "ted", "ten", "i", "in", "inn" 这些单词组成的字典树.Radix Tree (基数树)基数树与字典树的区别在于基数树将单词压缩了, 节点变得更少Suffix Tree (后缀树)单词 "BANANA" 的后缀树. ... 阅读全文
posted @ 2015-04-06 18:11 ZimZz 阅读(3131) 评论(0) 推荐(0) 编辑
布隆过滤器
摘要:参照 :http://billmill.org/bloomfilter-tutorial/简介布隆过滤器是一个用来判断某元素是否在全集中的工具.实际上它是一个有 m 个槽的位图, 他拥有 k 个 hash 函数, 每个元素进来的时候会通过 k 个 hash 函数映射到任意 k 个槽中, 并将槽置为 ... 阅读全文
posted @ 2015-03-14 15:48 ZimZz 阅读(780) 评论(0) 推荐(0) 编辑
饮料供应问题
摘要:问题描述: 有一个饮料公司,供应 t_max 种饮料, 最大供应容量为 v_max, 每种饮料由如下属性组成 T { C, V, H }, 其中C,V,H分别代表每种饮料的最大供应数量(瓶数),每瓶的容量,没瓶的客户满意度。问题: 给出饮料序列,求满意度最高的饮料组合(每种饮料各需要多少瓶,以及满意度的最大值)最优化问题一般可以用动态规划或者贪心算法解决,此处容易将问题化为递推式用 f(v, t) 表示供应容量为 v 时, 第 t ~ t_max - 1 种饮料的最优满意度(饮料编号从0~t_max-1)。k表示第t中饮料需要k瓶,有如下式子f(v, t) = k * H[t] + f(v - 阅读全文
posted @ 2012-10-30 22:37 ZimZz 阅读(349) 评论(0) 推荐(0) 编辑
对已知有限集合中缺失或重复元素的查找
摘要:问题描述: 一直有限集U,U内元素各不相同,先从U中删去/添加元素 x1, x2, ... , xn (0<=n<=U.length, xi 属于 U)得到 U',找出所有删去/添加的元素, 要求时间复杂度为O(n),空间复杂度为O(1)1.先讨论最简单的情况,我们只从集合U中删除/添加 1个元素例如, U = {5, 3, 1, 4, 2} U' = {5, 3, 1, 2}又如 U = {5, 3, 1, 4, 2} U' = {5, 3, 1, 4, 1, 2}这种情况解法很简单,一般来讲如下:1) 设sum(U)表示集合U所有元素之和,则删除的元素为 阅读全文
posted @ 2012-10-28 19:09 ZimZz 阅读(436) 评论(0) 推荐(0) 编辑
Java 旋转数组查找旋转点和任意元素(元素可重复)
摘要:public class Test { // 已知数组A是由有序数组B(数组B未知)向右移动n(0<=n<=B.length)位得到 // 例如 A = {4, 5, 1, 2, 3} 由 B = {1, 2, 3, 4, 5} 向右移动2位得到 // 求在数组A中搜索元素x private static int search(int[] a, int h, int t, int x) { if (h > t) return -1; int result = -1; int mid = (h + t) / 2; i... 阅读全文
posted @ 2012-10-26 10:53 ZimZz 阅读(1411) 评论(0) 推荐(0) 编辑
Java 求最大连续子序列积及其起始结束坐标
摘要:public class Test { // 最大连续子序列积 // 假设有集合A,Max[n]表示从A[0]~A[n]的以A[n]结尾的最大连续子序列积, // Min[n]表示从A[0]~A[n]的以A[n]结尾的最小子序列积,则有如下递推式 // Max[n] = Max{ Max[n-1]*A[n], A[n], Min[n-1]*A[n] } // Min[n] = Min{ Max[n-1]*A[n], A[n], Min[n-1]*A[n] } private static void getMaxProduct(float[] a) { ... 阅读全文
posted @ 2012-10-25 00:51 ZimZz 阅读(1095) 评论(0) 推荐(0) 编辑
PHP 括号配对判断及修正
摘要:1 <?php 2 #判断输入的括号序列是否合法 3 #解决思路,如果在某一段出现了右括号数比左括号数大,则非法,否则到最后判断左括号和右括号是否相等即可 4 define("LEFT", "("); 5 define("RIGHT", ")"); 6 7 function validate($seq) { 8 $len = strlen($seq); 9 $left = 0;10 $right = 0;11 12 for ($i = 0; $i < $len; $i++) {13 ... 阅读全文
posted @ 2012-10-08 22:34 ZimZz 阅读(1095) 评论(0) 推荐(0) 编辑
PHP Catalan数的几个应用
摘要:1 <?php 2 #给定入栈序列,求出栈序列组合总数 3 #这是一个catalan数问题 4 #设共有n个数入栈,将入栈序列和出栈序列写在一起共有2n个数 5 #将第一个入栈的数作为基点,则第一个数肯定是在第2i+1的位置出栈 6 #否则第一个数入栈编号是0,如果是在2i,则在第一个数入栈和出栈之间共有2i-1个数,是奇数 7 #既然是奇数,则说明有数在第一个数出栈之前入栈却没有出栈,矛盾 8 #那么,我们可以找到地推规律,设f(2n)表示n个数的入栈出栈序列总数 9 #则 f(2n) = f(0)f(2n-2) + f(2)... 阅读全文
posted @ 2012-10-08 00:14 ZimZz 阅读(269) 评论(0) 推荐(0) 编辑
PHP 平分数组
摘要:1 <?php 2 /** 3 *一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值 4 *比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; 5 *{3,6}{2,4,3} m=2 6 *{3,3}{2,4}{6} m=3 所以m 的最大值为3 7 **/ 8 9 #解题思路10 #首先m必须满足两个条件11 #1. 1<=m<=n12 #2. sum(a) % m = 0,即sum(a)必须是m的倍数,其中a为待切分数组13 #解题步骤:14 #1. m... 阅读全文
posted @ 2012-10-07 19:47 ZimZz 阅读(2410) 评论(0) 推荐(0) 编辑
PHP 求链表并集
摘要:1 <?php 2 #合并两个非降序链表并去重,并且不能修改原链表数据 3 #非降序,则链表内部有可能重复 4 5 class Node { 6 public $data = null; 7 public $next = null; 8 } 9 10 function traverse($head) { 11 while ($head != null) { 12 echo $head->data . " "; 13 $head = $h... 阅读全文
posted @ 2012-10-06 21:53 ZimZz 阅读(486) 评论(0) 推荐(0) 编辑
词语搭配系统
摘要:1 <?php 2 /** 3 *设计一个系统处理词语搭配问题,比如说中国和人民可以搭配, 4 *则中国人民人民中国都有效。要求: 5 *系统每秒的查询数量可能上千次; 6 *词语的数量级为10W; 7 *每个词至多可以与1W 个词搭配 8 *当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。 9 **/10 11 /**12 *解决思路13 *假设10W的词语都是二字词语,UTF8存储,则每个词语占 2*3 bytes = 6 bytes14 *现在先对10W个词语建一棵二叉查找树,... 阅读全文
posted @ 2012-10-06 19:17 ZimZz 阅读(1857) 评论(0) 推荐(0) 编辑
PHP 串联珠子问题
摘要:1 <?php 2 #串连珠子问题(类似于关键字搜索) 3 4 function shortest_sub($a, $m) { 5 $color = array(); #用于存储当前子串某种颜色出现的次数,如color[0] = 2表示颜色0出现2次 6 $sum = 0; #用于存储当前子串共出现了几种颜色 7 $bstart = 0; #最短字串的开始坐标 8 $blen = count($a); #最短子串长度 9 10 #将color数组初始化为011 for ($i =... 阅读全文
posted @ 2012-10-06 01:48 ZimZz 阅读(285) 评论(0) 推荐(0) 编辑
PHP 有n 个长为m+1 的字符串, 如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接, 问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误
摘要:1 <?php 2 #有n个字符串,每个数组长度m+1,如果数组的后m个元素和另一个数组的前m个元素相同,则两个数组可以相连 3 #求n个数组中连接起来的最长路径是多少,如果遇到环路则报错退出 4 5 function longest($a, $m) { 6 $len = count($a); 7 #把二维数组$a的每个字符串元素看成一个节点 8 #建立节点之间的联通关系数组g,g[i][j]代表节点ij之间的最长路径 9 10 #初始化g,讲可连通的节点值设为111 $g = arra... 阅读全文
posted @ 2012-10-05 21:32 ZimZz 阅读(1254) 评论(0) 推荐(0) 编辑
PHP 队伍比赛问题
摘要:n 支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强的一支。 所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中, 比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是4 对3, 5 对8。....... 胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排, 下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4 对5,直至出现第一名 编程实现,给出二维数组w,一维数组order 和用于输出比赛名次 阅读全文
posted @ 2012-10-05 18:35 ZimZz 阅读(394) 评论(0) 推荐(0) 编辑
PHP 二叉树非递归遍历
摘要:1 <?php 2 #二叉树的非递归遍历 3 class Node { 4 public $data; 5 public $left; 6 public $right; 7 } 8 9 #前序遍历,和深度遍历一样10 function preorder($root) {11 $stack = array();12 array_push($stack, $root);13 while (!empty($stack)) {14 $cno... 阅读全文
posted @ 2012-10-05 03:23 ZimZz 阅读(1980) 评论(0) 推荐(0) 编辑
PHP 输入n,判断从1~n序列中十进制数里1出现的次数
摘要:1 <?php 2 #输入n,判断从1~n序列中十进制数里1出现的次数 3 #例如输入12,则含有1的数字有1,10,11,12, 这里1一共出现了5次 4 5 #判断十进制数出现1的次数 6 function count1dec($x) { 7 $i = 1; 8 $count = 0; 9 10 #从个位数开始获取x的每一位数,并判断是不是111 while ($x >= pow(10, $i - 1)) {12 $r = floor($x % pow(10,... 阅读全文
posted @ 2012-10-03 16:39 ZimZz 阅读(411) 评论(0) 推荐(0) 编辑
PHP 输入两个整数序列。其中一个序列表示栈的push 顺序, 判断另一个序列有没有可能是对应的pop 顺序
摘要:<?php #输入一个栈的压栈序列和一个弹栈序列,判断该弹栈序列是否可能是压栈序列的输出 #例如压栈序列 12345,则弹栈序列可以是 54321 或者 45321 #解题思路,建一个空栈,按照压栈序列入栈,当压入的栈顶元素与弹栈序列的指针指向元素相同时,将元素弹出 #直到将压栈序列的元素全部压完,如果弹栈序列是正确的,则最后栈内元素可以按照弹栈序列顺序弹出,最后栈为空 #否则栈不为空 function test($push, $pop) { $len = count($push); $stack = array(); ... 阅读全文
posted @ 2012-10-02 20:55 ZimZz 阅读(766) 评论(0) 推荐(0) 编辑
PHP 输入一个整数,求该整数的二进制表达中有多少个1
摘要:1 <?php 2 #计算某个二进制数共有几个1 3 #例如十进制11 = 二进制1011,则结果是3个1 4 5 #解题思路:利用 n & (n - 1) 可以将最后一个1变0 6 # xxxx1000 & (xxxx1000 - 1) = xxxx1000 & xxxx0111 = xxxx0000 7 # 1011 & (1011 - 1) = 1011 & 1010 = 1010 8 #直到最后一个1被与为0,得出结果 9 10 function count1($n) {11 $r = 0;12 ... 阅读全文
posted @ 2012-10-02 19:13 ZimZz 阅读(1821) 评论(0) 推荐(0) 编辑
PHP 跳台阶问题
摘要:1 <?php 2 #跳台阶问题 3 #规定跳台阶有两种跳法,一次跳1阶或一次跳2阶,问有n个台阶共有几种跳法 4 #如果n=1,则只有一种跳法,n=2有两种跳法-一次跳1阶,一次跳2阶 5 #如果n > 2时,可以分为两种情况,第一种是第一次跳1阶,那么剩下的跳法就是f(n - 1)种了 6 #第二种是第一次跳2阶,那么剩下的跳法就是f(n - 2)种,则f(n) = f(n - 1) + f(n - 2) 7 #于是有递推公式 8 # | 1 n = 1 9 # f(n) = < 2 n = 2... 阅读全文
posted @ 2012-10-02 19:00 ZimZz 阅读(441) 评论(0) 推荐(0) 编辑
PHP 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
摘要:1 <?php 2 #输入sum和n,要求输出1,2...n里所有和为sum的组合 3 #这是一个可划分子问题问题 4 #若用f(sum, n)表示问题的界,则元素组合共有两种情况 5 #1. 和为sum的组合里包括n,则f(sum, n) = f(sum - n, n - 1) 6 #2. 和为sum的组合里不包括n,则 f(sum, n) = f(sum, n - 1) 7 #所以 f(sum, n) = f(sum - n, n - 1) U f(sum, n - 1) 8 9 function combination($sum... 阅读全文
posted @ 2012-10-02 13:56 ZimZz 阅读(1181) 评论(0) 推荐(0) 编辑