- 博客(240)
- 收藏
- 关注
原创 还是搜索、索引的问题
搜索要弄清2个基本问题:1)要搜索出什么类型的entity?2)entity的哪个方面/维度和关键词发生关联的?一般来说可以有多个角度link到entity,一个entity支持多个索引,可以从不同的column检索对于 web search,这两个问题都很简单,1)只有一种entity,就是网页,2)关键词和网页也只有一种关联关系,就是包含关系对于linkedin
2016-01-10 13:02:56
875
原创 由SSTable想到的:快速的,可读可写的,实时的,Persistent的data store方案
搜索引擎那样的,如Lucene, MDS等,先build index,然后用index提供查询服务。index是基于某一时刻的snapshot的index,是滞后的并不实时反应数据的变化。内存数据结构,如平衡树,hashtable等,不是persistent的类似数据库那样的,用B+树在磁盘上组织数据,是一个可选方案,缺点是虽然B+树已经很低,但是因为是基于磁盘的,每一次都
2015-12-29 14:03:03
634
原创 几种自旋锁SpinLock,TicketLock,CLHLock,以及可重入实现要点,非阻塞锁实现要点
最核心的东西:synchronization state,同步状态:指示当前线程是否可以proceed还是需要wait的状态。1.普通SpinLock (支持可重入的版本)class SpinLock { private AtomicReference owner = new AtomicReference(); // use thread itself as synchronizat
2015-12-28 17:03:22
5604
2
原创 我的java DCL-based Singleton
1)instance完全创建好了,另一个线程得到的还是null:用volatile解决2)对象内存块地址赋给了instance,但对象还没完全construct完毕:先访问一下对象,再赋instance,class Singleton { private volatile Singleton instance = null; private Singleton() {} public
2015-12-21 15:59:55
501
原创 再谈搜索,索引等问题
索引的本质是关联、link,key -> 记录地址( row locator等)或者字段 -> 主Id 的一个映射正排索引:id -> (col1, col2, col3), docId - > { wordId }倒排索引:col -> id, wordId -> docId为什么需要倒排索引?关系是这样的:用col 通过倒排索引得到Id, 进而用Id通过正排得到整体,也就是得到
2015-12-21 12:14:15
554
原创 事务的并发控制big picture
Goal:即满足一致性又尽量提高吞吐量Sequential equivalence checking: 两个事务的所有conflicting operation pair的相对顺序都是一样的悲观并发控制:用锁实现 Sequential equivalence锁的理解,2个作用1)基本数据完整性,防止同时修改导致的坏数据,2)操作完整性、事务完整性,复合状态的完整性,比如
2015-12-19 21:51:47
686
原创 Java中 Happen-before 规则总结
详细见:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html比较重要的几条1)Actions prior to "releasing" synchronizer methods such as Lock.unlock,Semaphore.release, and CountD
2015-12-18 16:20:39
1561
原创 MVCC 、CAS 和CopyOnWrite
update一行的时候的时候不是in-place的修改,而是产生一个行的新版本,在新行上修改,最后有点类似copy on write array,在提交的时候切换到新版本。好处是不影响现有数据的读取,一致性好。概括为:准备数据 + 原子commit 切换版本,和无锁数据结构实现的思路很像,先准备好数据,最后往结构上挂的那一下用CAS原子性保证。MVCC是把一个复杂事务的原子性问题转化到comm
2015-12-17 16:55:21
2109
原创 version vector 和 vector timestamp(clock)
version vector 和 vector timestamp是 causality 关系的在分布式系统两个领域上的应用,前者是replica之间的causality关系,后者是event 的的causality关系对于前者一般用compatible 和 conflict,后者一般用happen-before 和 concurrent两个replica的version是compatib
2015-12-16 16:21:15
1418
原创 分布式Process之三: Time and Ordering
1 two approach to order events across process1)synchronize global clock, use absolute time2)use logical time-stamp本文关注第二个方法。2 Happen-Before关系定义逻辑关系 happen-before (" -> ") among pairs of ...
2015-12-14 16:54:40
1041
原创 分布式process总结之二:Mutual Exclusion
没有单机情况下OS这个共同媒介。有的只是process之间互发消息。三个目标1)safety (essential) : 没有2个process同时进入CS (no bad thing happen)2)liveness (essential) 最终每个进入CS的请求都会被满足 (wanted thing happen)3)ordering (desirable) FIFOc
2015-12-08 14:30:59
3116
原创 分布式process总结之一:Multicast,Membership,Election
从一个分布式系统面临的一般问题:1 Multicast 问题centralspan tree basedgossip2 membership 维护问题
2015-12-06 13:11:25
1152
原创 程序 = 核心direct问题 + 子问题的关系、顺序
比如快排,核心问题就是partition,然后就是一系列的partition问题的求解merge sort,核心问题是merge一个数组的有序的前后两个部分,然后就是一些列merge问题的求解,这里所谓核心问题,就是直接的操作,直接的去解决的问题,而不是递归到另一个问题的的问题。对应于循环体,或者递归函数里的非递归部分。核心问题不会很复杂,partition和merge已经是很复杂的了
2015-12-06 00:42:32
574
原创 双向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
4246
原创 等待锁和等待条件、临界区实现、读写锁实现
之前总结过,线程的halt只有两种可能,等待锁(lock.lock(), synchronized(lock))和等待条件(condition.await(), object.wait())其他的synchronizer,比如CountDownLatch, Barrier,BlockingQueue等,都是基于等待条件的,可以用condition实现。而condition又以锁为基础,cond
2015-11-23 00:35:26
2066
原创 compiler之automatic memory management以及Java GC
基本方案就3种1)mark and sweep2) stop and copy3) reference counting前2种方案GC是一个是独立的过程,要先进行扫描(object graph 遍历)检测reachable object,然后进行mark或者copy。引用计数是即时的,当一个object的RC变为0时候立刻回收。一个赋值语句 a = b;对应4条语句RC(b)
2015-11-17 16:20:23
638
原创 TODO List based 算法、任务分解、任务顺序、分治法
TODO List based 算法、任务分解、分治法就是围绕一个TODO list,不断取出并处理其中的work item。处理work item的时候一般可能会做一些处理,然后会产生新的子work item追加到todo list, 类似一个大任务分解成若干小任务。class ToList {public: void append(WorkItem wi); Work
2015-11-17 14:07:45
1603
原创 关于Iterable接口和 Iteraotor接口的关系和实现
Iterable是说这个对象支持iterate操作,是可iterate的,需要遍历的话,给你返回一个iterator进行遍历Iterator对应具体的一次遍历,核心数据是遍历指针Iterator 实现要点主要对象:flag: 标志当前是否有item 取出来了还未被取走current: 存放下一个itemboolean hasNext()如果fla
2015-11-13 14:32:55
481
原创 leetcode valid Number的2种状态定义
把一个valid number看做一个顺序序列,把各个关键位置应为状态,比如开始空白部分,符号后,整数部分,小数部分,指数部分等状态转移是递增的,往下走不会回退。这种定义类似KMP和正则的NFA的状态定义,状态就是处在pattern中的位置。下的程序有bug, "."会被当作valid,懒得改了,需要调整下有些状态定义,但是不出“状态就是pattern中的位置”bool isNumbe
2015-11-12 16:58:51
569
原创 一个完整的语法分析、词法分析例子——Universal Pasrser
需求:用户用formal notation指定语法、词法,然后可以匹配相应的文本。用法类似正则表达式,只需给出formal notation,不需要为每一种格式的文本单独写匹配器。formal notation主要是3个部分:1)BNF 列表 table:给出上下文无关文法的产生式规则,以及所有的符号(终端和非终端)2)起始符号 start3)终端符号Regular Express
2015-11-12 12:12:19
4616
原创 算术表达式的validation
经典的机遇单调栈的表达式求值时没有validate表达式是否正确的,1+2, 1 2 +都是可以evaluate出来的,因为它们的op栈和oprand栈都是一样的。和json validator一样,框架都是都是输入字符驱动的状态转移。合法的主要是保证:1)运算符和值交替出现,注意运算符可以首先出现但必须是+-,作为正负号2)最后必须是值值有2种:数和括号定义4个状
2015-11-12 01:19:59
416
原创 smart pointer的设计和实现
总体思想是用栈对象封装堆上的资源,利用栈对象必然被回收的性质,达到堆资源自动管理的目的,避免人工delete的error-prone和异常导致的泄露。1 unique_ptr没有拷贝构造函数,只能move。move的时候之前unique_ptr的内部指针置空,这样 析构的时候指针为空不deletetemplate class unique_ptr {private: T* p;
2015-11-05 16:49:28
694
原创 stream, parser, 文法的一些概念
stream就是个Iterable,最基础的unit是bit,对应二进制流,从二进制流到character流Iteralbe是encoding解决的问题,再往上一个层次是token流,或者word流1)基础的tokenize就是自然token,即按分隔符切割的,alphabet字符(a-z,1-9等)和非alphabet字符(空格,标点,括号等。2)自然token不一定是和合法的t
2015-11-04 17:45:27
550
原创 表达式文法以及parse实现
1.文法1)E->E+T2)E->E-T3)E->T4)T->T*F5)T->T/F6)T->F7)F->i8)F->(E)2.去左递归、提取左因子后的改写文法1) E -> TE'2) E'-> +TE' | -TE' | e3) T -> FT'3) T'-> *F | /F | e4) F -> int | (E)
2015-11-03 16:39:10
1424
原创 Regular Expression实现
先贴代码package code_practice;import java.util.*;class Edge { int from, to, weight; public Edge(int from, int to, int w) { this.from = from; this.to = to; this.weight = w; }}class Digraph {
2015-11-01 21:12:33
612
原创 FixedTTLCache实现
所有item的TTL都一样,比如所有的http session的过期时间默认30分钟,idle超过30分钟就失效。相对的是每个item指定TTL的缓存。实现和LRU类似,都是map + list,不同的是触发机制不是容量满,而是idle时间。专门一个线程check,这里也利用了队列能维护先后顺序的性质,对头是最老的,如果队头都没过期,其他的都不可能过期,而且check线程会wait这个时间差再
2015-10-28 17:22:15
678
原创 基于HashHeap的LFU实现
普通heap支持的操作和queue, stack一样,就是push, pop,只是pop出的是最小值,具体点就是add, delMinhashheap支持一般HashMap的功能,同时维护最小值,和LinkedHashMap是对等的,后者是HashMap加上维护先后关系,hashHeap其实叫HeapedHashMap更科学。LinkedHashMap -> LRUHeapedHash
2015-10-27 16:09:55
2125
原创 json validator,流事处理,字符事件驱动,状态维护
语法字符驱动,状态判断、维护。参考leetcode isValidNumdef isValidJson(json): stack, inWord, inKey, inQuote, empty, metaChars, pair = [], False, False, False, True, '[]{},: \t', {'}': '{', ']': '['} for c in json:
2015-10-26 16:40:16
664
原创 分词驱动的parser vs. meta character驱动
字符分为alphabet charactermeta character主框架就是分词,分出一个词做什么处理的问题,这个是根据当前的状态。而meta character主要就是决定状态。比如json parser,当分出一个词后,如果当前处在一个list的scope里,(之前出现过"[",还未出现"]"),那就parent.append(word),如果当前处在一个dict里,且在ke
2015-10-26 12:47:08
435
原创 key-value pair列表parser
类似属性文件那样, key1 = value1, key = value2简练的算法,只区分word字符和分隔字符(空格, tab, 逗号,=等等),不需要处理key和vaue的分隔符(=)。就是parse word,tokenize,分词驱动,分出一个词来做什么操作的问题,就是考虑一点,作为key还是value。用一个key变量记录状态就好了,key是空则当前word是key, key有值,
2015-10-23 18:05:51
855
原创 kmp和dfa
状态j的含义是已经匹配的长度,如果当前字符c正好是pattern的下一个字符pattern[j],状态转移自然是 j = j + 1,否则,状态转移是相当于把pattern[1: j - 1]放到状态机里运行得到的状态再以c作为转移。重点:状态机是部分可用的。在计算状态j的转移的时候,状态0到 j - 1的转移都已经算出来了,而pattern[1:j-1]总共只有j - 1个字符,产生
2015-10-22 00:48:58
899
原创 爬虫中网页分析的几种技术
一般来说我们只抓取网页中的特定数据,比如抓取某人所有的blog,我们就只关心list 页面中文章列表那部分的链接和title有3中可以选技术来分析网页1)正则匹配2)一般字符串匹配content.substring(pattern, startIndex),一般是带有startIndex的substring,而不是每次都是从头匹配3) 基于sax的事件4)DOM + XPath
2015-10-20 16:57:33
4066
原创 问题划分之二,乘法原理,笛卡儿积
一个问题有n个步骤,对应的就是搜索深度,每个步骤有m中方法,对应的就是一个节点的扩展节点个数(图论中的边的个数),总的方案数适用乘法原理,就是每个步骤的方案数相乘,具体的方案几个就是每个步骤的方案的笛卡儿积连乘。搜索就是求方案笛卡儿积。也可以用加法原理分解,之前讨论过。就是按第一步的采用哪种方案划分,root上的方案数= 每个分支上的方案数的和
2015-10-19 14:38:33
595
原创 深度搜素——搜索嵌套
搜索问题,扩展节点的时候会iterate一个link集合,一般就是一个for 循环,但有的时候,这个集合并不能直接得到,而是另一个搜索问题,比如n个数分k组问题的一种解法是:问题分成k个步骤,每个步骤确定一个组,具体一个组可分的方案的candidate集合就不是直接可以用for来iterate的,而是另一个搜索问题——子集问题。这就引出一个重点,iterate不光可以额用for,也可以用搜索,搜索...
2015-10-19 14:27:22
789
原创 表达式生成问题
题目:给定一个数组,问:这组数进行四则运算(每个数必须用到,且只用一次)可以得到多少个不同的值?如何划分:表达式是一步一步算的,划分的方法就是哪个数先加入和表达式的当前值进行计算,并且有4种计算方式(其实是6种,减法和除法各2种顺序)def uniqueValues(A): ans = set() def dfs(i, value): if i == len(A): ans
2015-10-11 22:59:55
476
原创 递归、加法原理,如何分解问题(独立且完备的划分)
加法原理适用于做一件事有n种独立不相交且完备的方向,每个方向上有ai种方案,则总的方案数就是 a1 + a2 +... + an例题:把n个数分为k个非空子集,有多少种分法?分解问题:第一个集合里放多少个数把原问题的解分成了独立且完备的方向,分别解每个方向上的方案数,然后相加memo = [[-1] * (1000) for i in xrange(1001)]def group(n
2015-10-10 23:54:14
1567
原创 买一送一的最小代价问题
一堆商品,买一个可以送一个,但送的那个的价格必须小于买的那个的价格(强调一下,不能等于)。给定商品总数n和每个商品的价格,求得到全部商品的最少开销。例如:4个商品价格为[5, 4, 3, 3],最优解为9,即买5和4,送3和3。分析:这样去分解问题:分两步,第一步买一个,第二步选择赠品(或者不要赠品),然后剩下的商品是个递归问题(先买一个,再选赠品)。第一步里,当前商品中最贵的那个
2015-10-10 19:06:35
684
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅