
算法
文章平均质量分 80
in_han
这个作者很懒,什么都没留下…
展开
-
中缀表达式转后缀表达式 (中缀表达式的计算)
中缀转后缀需要处理的有:1. 操作数,操作符的提取2. 括号等关系到运算符优先级的符号3. 一元操作符(如 +(正), -(负)) 等4. 操作符和操作数的匹配,括号的匹配,(函数参数的个数是否正确等)基本思路如下:用一个链表 List 储存将要生成的后缀表达式用一个栈 Stack 储存操作符判断当前节点, 如果是操作数, 直接加入后缀表达式中, 如果是操作符,则比较前一个操作符和当前操作符的优先级,如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈(从顶到栈底),如果遇原创 2010-06-11 18:59:00 · 923 阅读 · 0 评论 -
后缀数组
参考:后缀数组就是将字符串所有后缀排序后的数组,设字符串为S,令后缀Suffix(i)表示S[i..len(S)]。用两个数组记录所有后缀的排序结果:Rank[i]记录Suffix(i)排序后的序号,即Suffix[i]在所有后缀中是第Rank[i]小的后缀SA[i]记录第i位后缀的首字母位置,即Suffix[SA[i]]在所有后缀中是第i小的后缀然后就是怎么快原创 2013-09-09 20:16:29 · 555 阅读 · 0 评论 -
Range Minimum Query( RMQ )
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j方法一:蛮力搜索,时间时间复杂度 O( n )。方法二:O(N^2), O(1)利用动态规划进行预处理,计算出M:M[ i ][ j-1 ] 为 i 到 j-1 最小值索引,则M[i][j] = A[j] 方法三:O(NlogN), O(原创 2013-09-10 00:50:38 · 687 阅读 · 0 评论 -
线段树的应用
定义线段树在区间[i, j] 上如下: 第一个节点维护着区间 [i, j] 的信息。 if i应用范围:对一个区间整体进行操作,如寻找最大(小)值,整体加线段树有如下应用:1. Range Minimum Query( RMQ )问题: 参见:http://blog.youkuaiyun.com/in_han/article/details/11493原创 2013-09-10 22:55:33 · 813 阅读 · 0 评论 -
[正整数划分]将正整数n表示一系列正整数之和
用python 实现之: #!/usr/bin/python# -*- coding: utf-8 -*-## 算法:求正整数n的所有可能和式组合, 并输出组合:## 思路:按照算法设计与分析上的:## q(n, m)= ## 1. m=1, n=1: 只有一种情况## 2. n## 3. n>m>1: q(n, m-1) + q(n-m, m)原创 2013-09-05 11:18:34 · 3231 阅读 · 0 评论 -
[背包问题] 01背包、完全背包、整数找零
01背包问题: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。完全背包: 完全背包定义是有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是c,价值是w。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。原创 2013-09-05 16:00:22 · 769 阅读 · 0 评论 -
整数找零[求所有方案 及 最高效方案]
问题1: 将20元钱,换成1, 2, 5, 10元面额的人民币,共有多少种方案?问题2: 将20元钱,换成1, 2, 5, 10元面额的人民币,求最少使用多少张? 问题1: 解决方法: 递归遍历所有方案 或 参考整数划分。 令方案数为q(n): q(n) = q(n-1) +原创 2013-09-05 17:48:35 · 1482 阅读 · 0 评论 -
由前序、中序遍历,求二叉树的结构
代码如下:#include "stdafx.h"#include using namespace std;string pre = "alicloud";string in = "illcaudo";typedef struct Node{ char ch; Node * left, *right;}*TreeNode;int rebuild( Tre原创 2013-09-14 15:22:41 · 582 阅读 · 0 评论 -
最长公共了序列、最长公共子串
1. 最长公共了序列( LCS )问题 用 lcs( i, j ) 表示 X[ 1...i ] 与 Y[ 1...j ] 的最长公共子序列长度。 则: lcs( i, j ) = 1) i == 0 or j == 0 : lcs(i, j) = 0. 2) 若 X[ i ] == Y[ j ] : lcs( i, j ) = lcs(原创 2013-09-16 23:41:38 · 667 阅读 · 0 评论 -
两个数组元素(相加、相乘)相关的问题
1.两个数组两个元素之和的最小K个值: 要求复杂度低于O(n^2).已知A B两个数组,元素有序,构造新的集合S={x+y | x属于A, y属于B}求S中最小的k个元素,最优解法。2.两个数组(正数)两个元素之积的最小K个值: 已知A B两个数组,元素有序,构造新的集合S={x*y | x属于A, y属于B} 求S中最小的k个元素,最优解法。原创 2013-09-18 16:09:00 · 6266 阅读 · 0 评论 -
求最小绝对值子串、一个整数数组求两两之差绝对值最小值
1. 求最小绝对值子串1) 暴力求解O(n^2)2) ...2.求整数数组两两之差绝对值最小值(不要求求出具体哪两个整数)1) 暴力求解 或 对相邻元素作差从而转化为 问题1: b1= a2-a1, b2=a3-a2, b3=a4-a3 ===>b2+b3 = a4-a2, ... 2) 先排序,再求相邻元素的差。原创 2013-09-17 23:32:46 · 966 阅读 · 0 评论 -
常见面试题合集
1. N对括号的所有合法排列题目:给定N对括号,输出其所有的合法的组合状态,例如,N=3,所有的合法状态为:"((()))”, “(()())”, “(())()”, “()(())”, “()()()”解法1, DFS: 在每个indx位置,分别进行扩展( 放入左括号 、 放入右括号),并且依据扩展的条件决定是否扩展。Python代码:#!/usr/bin/python#原创 2013-09-09 00:32:56 · 484 阅读 · 0 评论 -
Python实现 [堆] [堆排序]
用python的堆及堆排序:堆调整的两个方面(以最小堆说明):1. 删除堆顶元素:(自顶向下) 删除堆顶元素时,把最后一个节点 last_indx 移到堆顶, 将此节点称作cur。 当此cur元素的两个子节点元素中最小者大于其,则将其子节点最小者k与cur交换,并将k作为新的cur。再将cur与其两个子节点进行比较。直到cur两个子节点都比cur小 或者 cur 为原创 2013-09-08 02:12:42 · 847 阅读 · 0 评论 -
AI
AI哲学:(符号主义、连接主义), (行为主义,进化主义,群体主义), 以及以上几个途径都不可回避的( 学习主义)。符号主义:三个核心问题是知识表示、搜索和推理。[启发式搜索,极大极小搜索,Alpah-Beta剪枝], [归结原理,不确定性推理]。 [缺点:仅依靠逻辑推理,没有形象思维,使用的是搜索求解的机制]。连接主义:以及结构模拟为核心,自上而下,用学习来调整网络连接中的权值,基本核原创 2011-12-02 09:25:20 · 624 阅读 · 0 评论 -
希腊字母
1 Α α alpha a:lf 阿尔法2 Β β beta bet 贝塔3 Γ γ gamma ga:m 伽马4 Δ δ delta delt 德尔塔5转载 2012-03-14 21:55:20 · 465 阅读 · 0 评论 -
大数据计数:如何仅用1.5KB内存为十亿对象计数
摘要:AddThis的数据分析副总监Matt Abrams在High Scalability上发表了一篇文章,介绍了他们公司如何应对大数据。Matt Abrams表示,AddThis仅仅用了1.5KB内存的内存就计算了十亿个不同的对象,这与他们所使用的计算方法分不开的。AddThis(前身为Clearspring)的数据分析副总监Matt Abrams在High Scalabili转载 2013-01-09 11:12:00 · 446 阅读 · 0 评论 -
基数估计
基数就是,给一个数组,计算不同的数字的个数就是基数。 下面这些算法当数组非常大的时候,用概率的办法用很小的空间和误差估计大概的基数是多少。 想下面这个文档说的,用1.5kb的空间估算十亿个数字的基数。 淘宝工程师文档提到的一个应用就是统计访问一个链接的独立ip的数目。为每个连接分配一个基数估计需要的空间,然后把不同的ip和cookie之类的通过哈希函数,映射为一个数值。最后就是转换成基数估计问题转载 2013-01-09 16:26:09 · 742 阅读 · 0 评论 -
倒排索引
倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。有两种不同的反向索引形式:一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置原创 2013-05-22 11:12:22 · 558 阅读 · 0 评论 -
排列组合 A(n, m) 字典序
针对数字序列[1, 2, 3, 4, 5], 常见的排列组合情况有:1. 求n个数的全排列,要求各个排列升序.[1,2,3,4,5] ... [5,4,3,2,1]2. 求A(m, n),结果为升序. [1,2,3] .... [5,4,3]3. 求组合C(m, n), 结果为升序.[1,2,3] ... [3,4,5]4. 求{1, 2, 3, 4, 5, 6}的所有子集.原创 2013-08-24 00:40:56 · 1583 阅读 · 0 评论 -
[最长递增子序列]
问题定义:最长递增子序列又叫做最长上升子序列;子序列,正如LCS一样,元素不一定要求连续。本节讨论实现三种常见方法,主要是练手。题:求一个一维数组arr[i]中的最长递增子序列的长度,如在序列1,-1,2,-3,4,-5,6,-7中,最长递增子序列长度为4,可以是1,2,4,6,也可以是-1,2,4,6。 方法一:DP像LCS一样,从后向前分析,很容易想到,包括第i个元素以及其原创 2013-09-06 00:26:58 · 1530 阅读 · 0 评论 -
KMP
串的模式匹配算法:Index( S, T, pos ) 1. 常规算法:顺序比较,遇到不匹配的情况则回退。python 代码:(注意回退时回退步长)#!/usr/bin/python# -*- coding: utf-8 -*-# 算法:KMP# 传统算法, 返回template在 source中第pos个字符之后的位置def Index( source, t原创 2013-09-06 22:01:02 · 611 阅读 · 0 评论 -
python 树形结构
1. 使用dictionary 实现二叉排序树python 代码:#!/usr/bin/python# -*- coding: utf-8 -*-# python 二叉树def create_btree( e ): root = {"v":e[0], "left":None, "right":None} for i in e[1:-1]: inser原创 2013-09-07 10:15:30 · 2884 阅读 · 0 评论 -
分枝界限法
回溯法:求出解空间中满足约束条件的所有解。分支界限法:找出满足约束条件的一个解。搜索方式:回溯法使用深度优先的方式,而分支界限法使用广度优先或最小耗费的方式搜索解空间。1. 单源最短路径问题:问题描述:在有向图中,求出源顶点 s 到 目的顶点的最短路径。解决办法:使用优先队列式的分支界定法。算法描述: 1. 使用最小堆MinHeap来存储活结点列表原创 2013-09-07 16:46:05 · 1884 阅读 · 0 评论 -
基础问题[ 快速排序 ]、[ 归并排序 ]
1. 快速排序:快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。代码如下:原创 2013-09-18 00:15:39 · 623 阅读 · 0 评论