
同类问题汇总
文章平均质量分 76
binling
这个作者很懒,什么都没留下…
展开
-
代数思维训练之一:二分查找
代数思维要点identify变量确定变量之间的关系状态如何转移,驱动变量(自变量),因变量循环不变式有界,收敛二分问题输入是一个区间和一个值,要收敛到区间一个具体位置1 标准二分变量:区间[l, r], 查找值x。衍生变量mid循环不变式:如果有解,必在[l, r]中状态转移:进行状态转移的条件:[l,r]不为空: l <= r驱动变量: x, A[mid]规则:x和A[mid]比较大小收敛:[l, r]每次都变小int search(vector<in原创 2021-10-19 10:50:21 · 140 阅读 · 0 评论 -
程序 = 核心direct问题 + 子问题的关系、顺序
比如快排,核心问题就是partition,然后就是一系列的partition问题的求解merge sort,核心问题是merge一个数组的有序的前后两个部分,然后就是一些列merge问题的求解,这里所谓核心问题,就是直接的操作,直接的去解决的问题,而不是递归到另一个问题的的问题。对应于循环体,或者递归函数里的非递归部分。核心问题不会很复杂,partition和merge已经是很复杂的了原创 2015-12-06 00:42:32 · 529 阅读 · 0 评论 -
路径搜索问题
之前碰到的很多问题都可以归结为路径搜索问题,就是求两点之间的路经1)是否存在路径2)求任意一条路径3)求所有路径求是否有路径和任意一条路径的时候,和正常遍历一样,一个点被mark之后不再访问,因为如果这个结点到终点有路径,之前就应该结束了,没结束说明没路径,再访问也无益。是 O(n)的,对于求所有路径,usedInPath 在进入结点时候mark,退出结点时候unmark, ...原创 2015-06-02 10:29:37 · 1154 阅读 · 1 评论 -
深度搜素——搜索嵌套
搜索问题,扩展节点的时候会iterate一个link集合,一般就是一个for 循环,但有的时候,这个集合并不能直接得到,而是另一个搜索问题,比如n个数分k组问题的一种解法是:问题分成k个步骤,每个步骤确定一个组,具体一个组可分的方案的candidate集合就不是直接可以用for来iterate的,而是另一个搜索问题——子集问题。这就引出一个重点,iterate不光可以额用for,也可以用搜索,搜索...原创 2015-10-19 14:27:22 · 749 阅读 · 0 评论 -
概率题汇总
1. shuffle对于当前位置i,等概率地从[0,i](或者[i,n-1])选取一个数。1)从[0,i]选取循环不变式:当前数组[0,i]的每个数在位置[0,i]出现的概率是相等的随机函数形式:rand(i), 产生等概率的生成[0,i]上的数2)从[i,j]选取循环不变式:原数组的每个数在位置[0,i]出现的概率是相等的随机函数形式:rand(i, j), 等概率的原创 2014-12-21 22:33:52 · 657 阅读 · 0 评论 -
背包问题,硬币问题
至少有4种背包问题:1)01背包,原创 2014-10-02 14:36:35 · 1291 阅读 · 0 评论 -
双向BFS搜索和A*算法
适合给出起点和终点,求最短路径的问题分别从起点和终点扩展,每次选择待扩展节点少的那个方向进行扩展,扩展一层。然后下一轮。int doubleBFS(int start, int end, vector> &G) { vector marked[2] {vector(G.size()), vector(G.size())}; //including dead nodes and to-be原创 2015-12-03 11:22:30 · 4175 阅读 · 0 评论 -
再谈缓存
凡是涉及管理数据的系统,都可以用图书馆来考虑,都要面临图书的位置查找和实际摆放两个问题,对应的两大组件就是就是index + store,所有的数据管理系统都包含这两部分。最基本的缓存可以只用一个map,index直接指向数据的物理地址(Object 的reference)。更general的情况是存一个locator,这个locator交给store能直接返回数据。因为缓存需要过期策原创 2015-09-19 20:10:53 · 465 阅读 · 0 评论 -
一个完整的语法分析、词法分析例子——Universal Pasrser
需求:用户用formal notation指定语法、词法,然后可以匹配相应的文本。用法类似正则表达式,只需给出formal notation,不需要为每一种格式的文本单独写匹配器。formal notation主要是3个部分:1)BNF 列表 table:给出上下文无关文法的产生式规则,以及所有的符号(终端和非终端)2)起始符号 start3)终端符号Regular Express原创 2015-11-12 12:12:19 · 4533 阅读 · 0 评论 -
分词驱动的parser vs. meta character驱动
字符分为alphabet charactermeta character主框架就是分词,分出一个词做什么处理的问题,这个是根据当前的状态。而meta character主要就是决定状态。比如json parser,当分出一个词后,如果当前处在一个list的scope里,(之前出现过"[",还未出现"]"),那就parent.append(word),如果当前处在一个dict里,且在ke原创 2015-10-26 12:47:08 · 397 阅读 · 0 评论 -
关于树的算法的总结
之前总结过,主要分为liang'da'lie原创 2014-09-21 11:52:33 · 1921 阅读 · 0 评论 -
回文问题汇总
1最长回文子串O(n^2) 枚举中心法DPO(n) Manacher算法2 最小割:最少割多少下,把字符串切割成全都是回文子串DP3 最少插入几个字符把原字符串变成一个回文串 1)只插前面 2)前后都可以插 3)任意位置可以插 DP O(n^2)#include #include using namespace std;const int MAXN原创 2015-06-29 20:59:56 · 740 阅读 · 0 评论 -
前序序列化/反序列化二叉树
序列化:vector serializeTreePreOrder(TreeNode* root) { vector ans; function preOrder = [&](TreeNode* root) { ans.push_back(root ? to_string(root->val) : "#"); if (!root) return; preOrder(root->原创 2015-09-06 15:07:04 · 642 阅读 · 0 评论 -
还是搜索、索引的问题
搜索要弄清2个基本问题:1)要搜索出什么类型的entity?2)entity的哪个方面/维度和关键词发生关联的?一般来说可以有多个角度link到entity,一个entity支持多个索引,可以从不同的column检索对于 web search,这两个问题都很简单,1)只有一种entity,就是网页,2)关键词和网页也只有一种关联关系,就是包含关系对于linkedin原创 2016-01-10 13:02:56 · 838 阅读 · 0 评论 -
分布式process总结之一:Multicast,Membership,Election
从一个分布式系统面临的一般问题:1 Multicast 问题centralspan tree basedgossip2 membership 维护问题原创 2015-12-06 13:11:25 · 1090 阅读 · 0 评论 -
大数据问题汇总
1最基本的,一个数据流(文件),求top k biggest. solution:维护大小为K的最小堆,和堆顶比,大于堆顶的加入堆,如果size 超过K,移除堆顶。2一般的是Top K frequent,需要先统计每个数据的个数(频率)。主要看全部unique的数据size(乘上计数值size)是否可以装进内存,可以的话,直接symbol table计数,然后再维护key为频率,原创 2015-07-03 23:16:43 · 617 阅读 · 0 评论 -
有限自动机总结
有限自动机A用来识别字符串,它由5部分组成:1)alphabet,字符集2)states,状态集合3)init,初始状态4)trans(s, ch),状态转移函数5)end 可接受state 集合A(str) == true的意思是,A可以接受字符串str,即从初始状态init读入str所有字符之后所达到的状态属于集合end, tran(init, str) 属于 end原创 2016-09-26 13:07:10 · 6540 阅读 · 0 评论 -
再谈 循环/递归就是状态机
状态是相关变量的组合状态,一个变量相当于一个分量一次循环就是一轮状态状态转移初始状态 -> 按某种规则转移,有些状态属于终止状态,然后状态的某个变量就是所求当前状态下,各个变量间互动,迁移,达到另一个状态,状态机的一般形式是 while (true) { //转移规则}, for (int i = 0; i int state1 = 0, state2 = 1; //state原创 2016-08-04 19:20:27 · 1696 阅读 · 0 评论 -
彻底解决数据库去中心化问题
1)首先垂直切分,按业务模块把一些紧密联系的表分在一起(按表切分),形成一个抽象的vertical partition2)水平切分。垂直切分之后的单个vertical partition(甚至其中单个表)仍然可能太大,一个server放不下,进一步按行切分,这时候需要选择一个聚合根作为记录的horizontal partiotion的标志,一般是userId,对于Forum模块,forumId原创 2016-08-12 18:40:16 · 4003 阅读 · 1 评论 -
自己动手写一个key value store
一涉及到persistent, 哪怕只是最基本的需求,很多人都会依赖数据库,或是其他现成的库或工具。确实,对于文件,大部分人很少直接打交道,或者只是诸如整体反序列化/序列化、按行读取、append new line等有限的操作。一个persistent store最基本的问题是如何组织数据,也就是access method, 大致有:1)队列(定长记录 or 不定长记录): kaf原创 2016-10-10 18:08:41 · 1533 阅读 · 0 评论 -
再谈Parser
Parser的作用就是把一个字符串(一维,流)parse成一个数据结构。Parser的写法大概有2种方式1)递归下降(recursive descend)2)事件驱动的状态机。状态就是一些表明当前状态的变量和最终要parse出的data structure。xml parser, json parser,key value pair parser, 都是第二种方法,其中所谓原创 2016-09-19 22:41:10 · 871 阅读 · 0 评论 -
二叉树 level order 遍历问题汇总
一 如何确定层结束?1 维护一个levelEnd,如果当前结点是level end,更新levelEnd 为queue.back(),注意先判断queue是否empty,(最后一层结束后,queue就空了)。2 维护一个curLevelNum 和 一个nextLevelNum,当curLevelNum count down 到0时候,交替3 遍历完一层的时候,队列里的元素就是下一层的所原创 2014-12-26 16:29:49 · 1718 阅读 · 0 评论 -
merge sort 一些变种、应用
1 逆序对数目:int countInvertion(vector &A, int l, int r, vector &B) { if (l >= r) return 0; int m = (l + r) / 2; int a = countInvertion(A, l, m, B); int b = countInvertion(A, m + 1, r, B); int原创 2015-05-29 19:32:16 · 662 阅读 · 0 评论 -
中缀表达式求值问题
1)有无括号2)一种优先级运算符(只有+-或*/) 还是2种(+- 和*/都有)3) 求逆波兰序列,求值,求表达式树两种思路1.分治 (求值,和求表达式树都可以用)1)先去掉冗余括号(两边最外面的,如(1), (1 + 2) ),如果有的话。找到优先级最小的运算符的位置p,如果不存在,说明是一个数字,返回atoi后的值2)两边递归求值 3)对两边的值应用该运算符原创 2015-06-24 13:13:38 · 1750 阅读 · 0 评论 -
再谈type ahead 问题
问题:给定一个词典,包括一些词和其出现的频率。实现type ahead功能,要求用户每键入一个字符,下拉框显示以当前输入为前缀的前10个最热门的词解法1:用不带data的Trie,实时查询法框架就是Triie的 startWithPrefix 查询,不同的是并不是返回遍历得到的所有词,而是像经典求top k那样,用一个大小为k的最小堆过滤。解法2: 用 带data的 T原创 2016-08-02 21:32:54 · 1211 阅读 · 0 评论 -
爬虫中网页分析的几种技术
一般来说我们只抓取网页中的特定数据,比如抓取某人所有的blog,我们就只关心list 页面中文章列表那部分的链接和title有3中可以选技术来分析网页1)正则匹配2)一般字符串匹配content.substring(pattern, startIndex),一般是带有startIndex的substring,而不是每次都是从头匹配3) 基于sax的事件4)DOM + XPath原创 2015-10-20 16:57:33 · 4003 阅读 · 0 评论 -
递归、加法原理,如何分解问题(独立且完备的划分)
加法原理适用于做一件事有n种独立不相交且完备的方向,每个方向上有ai种方案,则总的方案数就是 a1 + a2 +... + an例题:把n个数分为k个非空子集,有多少种分法?分解问题:第一个集合里放多少个数把原问题的解分成了独立且完备的方向,分别解每个方向上的方案数,然后相加memo = [[-1] * (1000) for i in xrange(1001)]def group(n原创 2015-10-10 23:54:14 · 1495 阅读 · 0 评论 -
图论的一些总结
有向图的环判断:当前结点在path中存在, path就是 stack里的结点。marked 正常标记, inStack在进入结点标记,退出前unmark无向图的判断:当前结点的某个扩展结点mark过,且不是当前结点的前驱,因为无向无环图每个结点只有一个前驱,拓扑排序 = 原图后序dfs遍历的reverse order , 也是反图的后序dfs序列。 反图就是原图每条边反向后的图原创 2015-06-11 11:00:55 · 501 阅读 · 0 评论 -
寻找数组中丢失的、者重复的、或者出现一次的的数的问题汇总
1. 集合增量问题一组大小为1到n的牌,抽走一张,求抽走的是哪张牌?此类问题特点:输入:1)已知原始集合:或者是直接给定一个数组,或者是给一个描述,比如1到n,每个数出现一次(或2次),总之原始集合是确定的2)改变后的集合:原始集合拿走(添加)一个或2个数之后的集合求:少了的数,多出来的数等,其实就是求两个集合的增量思路:题目所求就是求2个集合之间的增量(差异),所以...原创 2014-12-22 18:18:17 · 1001 阅读 · 0 评论 -
算法的三种练习
除了具体写代码,做这些练习:1)循环不变式 用循环不变式去解释算法2)递归、动归的 递推式3)搜索问题的隐式图构造 隐式树还是图(一个前驱,多个前驱) 点是什么,边是什么, 怎么扩展?原创 2015-06-07 14:21:45 · 399 阅读 · 0 评论 -
STL 的一些数据结构比较
从功能的角度,基本上vector都支持,这里重点是支持的高效的操作。每种数据结构支持不同的高效操作,所谓高效操作就是O(1) 或者O(lgn)的复杂度。stack 高效的尾部增删vector 高效的尾部增删,但是开放了其他的操作,这些操作是低效的queue 高效的尾部增,头部删deque 高效的头尾都可以增删list 高效的头尾都可以增删,基于双向链表。基于原创 2015-06-04 10:50:57 · 1717 阅读 · 0 评论 -
几个子数组问题的相互转换
两个条件:1)元素是任意数还是都是正数2)数组A是否有序1 一般问题:元素可正可负,无序求前缀和数组B,问题转化为,数组B求差等于target的两个数的方案个数,即2Minus问题。2Minus问题可以排序后直接同向移动双指针法求解,也可以进一步转换求差分数组C,因为是排好序求的差分数组,C数组的元素都是正数,但是相邻元素的差不同,C不是有序的。B中两个元素的差,相当于是累加两原创 2015-06-03 13:10:42 · 452 阅读 · 0 评论 -
最大子数组和系列
1 给定一个矩阵,求最大子矩阵和思路:尝试直接二维dp,发现f[i][j] 和 f[i - 1][j], f[i][j- 1], f[i- 1][j - 1]没有明显的递推关系。solution: 枚举子矩阵的上下界,列聚合,转化成一维最大子数组问题。先对原矩阵按列求前缀和,第i行与第j行之间第k列上的和就是A[j][k] - A[i - 1][k]。def maxMatrixSum(原创 2015-05-30 09:16:28 · 797 阅读 · 0 评论 -
子串/子段问题总结
1. 一般子串问题:求一个串中满足某种条件的子串1)如果所求子串的条件是一个值,比如sum,则考虑子段问题,注意这样一个性质,子段= 前缀差,子段和=前缀和的差,2)如果满足满足滑动窗口的条件,滑动窗口法。3)回文子串等不满足1),2)的,dp的方向考虑4)暴力,但注意不是枚举所有子串(O(n^2))而是枚举终点。2. 两个串中子串问题,或者一个串中多个子串问题LC原创 2014-12-03 09:23:03 · 553 阅读 · 0 评论 -
组合数学几种“数”
1 卡塔兰数:以k为轴划分子问题,左边子问题的解的个数和右边子问题的解的个数是原问题以k为轴的解法的2个独立步骤,适用乘法原理;分别以1,2,。。。n为轴,是原问题的n种解法,适用加法原理。f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0) = f(k-1)f(n-k) k=1...n2. 错排公式:原创 2014-12-23 18:36:45 · 915 阅读 · 0 评论 -
最大公约数,最小公倍数,素数等问题
两个数的 最小公倍数 等于两个数的乘积除以最大公约数,scm (a, b) = a * b / gcd (a, b),所以主要是最大公约数gcd 问题:辗转相除法依据就是欧几里得定理: gcd(a, b) = gcd(b, a%b)def gcd (a, b): while b > 0: c = a % b a, b = b, c re原创 2014-12-24 13:58:48 · 630 阅读 · 0 评论 -
re-arrange 数组问题汇总
一 re-arrange 数组1排序2 shuffle3 partition(2 way, 3 way, n way)4 interleave3 错排原创 2014-12-21 20:39:24 · 736 阅读 · 0 评论 -
关于线段的算法汇总
基本知识:线段树:存储线段的二叉排序树,以start作为key, 同时维护树中最大的右端点值 maxclass Node { int start; int end; int max;}经典应用:query any interval that intersect(overlap) with a given interval. 如果是查询所有与给定线段重合的线段,则查原创 2015-05-15 16:39:37 · 2814 阅读 · 0 评论 -
动归题目分类汇总
九章的分类:1 Matrix DP 代表题目1)Number Triangle: 从三角顶到底边的路径最小和状态定义:f[i][j] 为 从位置(i,j)到底边的路径最小和递推式:f[i][j] = min(f[i + 1][j], f[i + 1][j + 1]) +triangle[i][j]初始化:最后一行和三角形底边一致2) Unique Path :一个矩阵,从原创 2015-01-13 00:33:57 · 797 阅读 · 0 评论 -
数组双指针法汇总
指针移动方向:相向夹逼,同向移动维护的是一个区间还是只是关心指针指向的两个元素同向移动的、维护一个区间的双指针法即滑动窗口法,2Sum两头往中间夹逼的双指针法。指针为什么可以不回退?即为什么可以i只++, j只--?当A[i]+A[j]2MinusCloset: 寻找两个数,其差值最接近給定值target排序后,同向移动的双指针法。当A[j]-A[i]>ta原创 2014-12-14 17:12:27 · 1583 阅读 · 0 评论