自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

binling的专栏

主要是备忘性质的笔记和零言碎语

  • 博客(240)
  • 收藏
  • 关注

原创 LeetCode 827 最大人工岛 题解

给你一个大小为 n x n 二进制矩阵 grid。最多 只能将一格 0 变成 1。返回执行此操作后,grid 中最大的岛屿面积是多少?岛屿 由一组上、下、左、右四个方向相连的 1 形成。经典的图论中连同分量的题目。

2022-09-18 16:39:49 223 1

原创 预处理在快速判断两个单词是否有相同字符的应用

这里面利用到单词的字符集是有限的这一特性,比如,英文单词就是26个字母,可以把一个单词包含的字母的情况,转化为一个26位的位图,两个单词如果有相同的字母,那么相应的bit位置上就同为1。把位图当成一个数,两个位图做一个“与”操作,结果为0就得出对应的单词无重复字符。,一般的做法是,采用辅助的集合类容器,先遍历一个字符串,把它的字符放到集合中;如果是一个单词的集合,需要判断两两判断两个单词是否有重复字符,按照上面的算法,总的复杂度变为 O(n * len), len是字符串长度的上限。...

2022-08-10 17:50:51 301

原创 二叉树非递归后序遍历的4种优雅解法

方法1:状态机法状态由两个部分组成当前树的根节点root辅助Stack的状态算法就是根据当前的状态,不断跳转到下一个状态,直到root和Stack都为空。Stack里存的是当前树遍历之后再处理的节点,也就是当前树的父亲节点。class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> output = new ArrayList&lt

2022-04-24 18:51:56 812

原创 理清Java中的各种内部类

中文都是说内部类,英文原文其实分的很清楚top level classnested classstatic class: declared as a static member of another classinner class: declared as a instance member of another classlocal inner class: declared inside an instance method of anther classanonymous inn

2022-01-07 10:30:11 303

原创 Shell Programming的一些常见问题

引号单引号 v.s. 双引号单引号不进行变量替换,双引号会进行变量替换变量是否加引号一个保险的做法是变量总是加引号, 因为变量的值有可能带空格[[ ]]内会把变量替换后的值当成一个整体,但[ ]不会[ ] 和 [[ ]][ 等于 test, 是一个程序,会把] 当成参数列表里最后一个参数[[ ]] 是bash specific的,是bash关键字。[ -f “a.txt” ] && [ -f "b.txt ] 中的&&是连接两个命令的运算符;[

2021-12-15 12:32:50 630

原创 代数思维训练之一:二分查找

代数思维要点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 104

原创 Coding的心态

这里写自定义目录标题新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入dddd11# 欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑

2021-09-14 12:06:57 67

原创 基于代数思维的coding

大概有两种思维,一种是面向过程的,就是想象一个数据结构上的操作步骤,推演一下,看看能不能接近一个solution。这种思维有诸多弊端:1)靠灵光一现的乱试,不可控,不可重复2)面向过程,比较复杂、麻烦,易出错3)逻辑性不强,为什么这么操作一番就能得出解? 这个问题很难回答,缺乏一种确信感。离散,不易证明代数的特点是什么?都是变量和公式推导,从不需要带入离散的具体值去验证,是自证明的,或者说你可以代入任何具体值,都是成立的,逻辑性非常强。比如求斐波那契数列的代数式算法:```def

2021-08-10 13:15:24 108

原创 LeetCode 32 Longest Valid Parentheses 2种优雅解法

思路一 递归DP定义子问题 : f(i) 为 以s[i] 结尾的子串的原问题,有:如果s[i] == ‘(’:f(i) = 0如果s[i] == ‘)’:如果s[i - 1] == ‘(’:f(i) = f(i - 2) + 2如果s[i - 1] == ‘)’:令 l = f(i -1), 如果s[ i - l - 1] == ‘(’,那么f(i) = f(i - 1) +...

2020-03-17 15:28:44 137

原创 c++ 二进制兼容本质

总的一条就是让client只依赖“名字”,而不依赖任何"实现"。“实现” 具体的就是2类1)函数体,code2)任何内存块大小,layout细节为什么会有二进制兼容问题,就是因为一般的c++头文件并不是单纯的接口声明,其中也还包括了“实现细节”,因为成员变量就是一种内存layout,就属于实现细节。对于函数,也有2种情况使得client依赖了实现:1)inline functi

2017-07-24 16:35:41 574

原创 Elastic Search 的分布式特点(和MongoDB对比)

Elastic Search 的分布式特点(和MongoDB对比)回顾一下mongoDB的分布式: replica set:若干mongod组成,只有一个master可写,自动选举 。 sharding: 若干mongos 作为前端router,每个shard对应一个replica set,还有一个replica set作为sharding metatadata的存储(config s

2016-12-31 01:24:54 6294

原创 MongoDB 的分布式属性(replication and sharding)

Cluster  and Replicate和mysql 类似,全局级的replicate 配置(cassandra 是每个key space可以独立配置) ,一个master,多个secondary,写只能在master上一致性:写操作返回可以配置为1)全部副本写成功(complete),2)多数(majority),3)只是primary写成功,4)仅仅是成功交给primary(f

2016-11-15 17:18:33 1359

原创 资源调度器的一些基本问题

1 调度算法Capacity based, DRF(dominant recourse fairness),label based等多态化,插件化,可以多种策略一起工作,对应于不同Job (优先级,job特性,service or batch job)2 容错,HA调度器一般处在一个中心位置,存在SPF问题。可以采用类似HDFS,JobTracker的HA方案1)act

2016-10-28 21:04:02 1431

原创 redis中hashtable 的 rehash/ resizing 策略

依赖于连续存储的数据结构(具体的,就是依赖array)都有一个resizing问题。对于vector,一般的策略就是满的时候double and copy,降到1/4时候 half 。Hashtable也可以这么做,均摊的复杂度模型是一样的。比如load factor (number of entry / hash table size) 大于5的时候触发 resize,创建一个double

2016-10-26 16:36:17 1342

原创 文件洞的处理

存储引擎经常要面对的一个问题,就是洞的处理。1)Segment File:2)segment file 之间整理3)Copy

2016-10-26 16:01:49 908

原创 自己动手写一个key value store

一涉及到persistent, 哪怕只是最基本的需求,很多人都会依赖数据库,或是其他现成的库或工具。确实,对于文件,大部分人很少直接打交道,或者只是诸如整体反序列化/序列化、按行读取、append new line等有限的操作。一个persistent store最基本的问题是如何组织数据,也就是access method, 大致有:1)队列(定长记录 or 不定长记录): kaf

2016-10-10 18:08:41 1464

原创 有限自动机总结

有限自动机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 6404

原创 爬虫,索引,PageRank,搜索,综合例子

indexer 主要包含:html parser,word generator, url id generator,inverted index(keyword->[docId],docs table(url, id, refCount)word generator的职责是输入一个text文本,返回一个word iterable。具体参数有,最小word长度,exclude list,

2016-09-23 16:34:56 1365

原创 再谈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 777

原创 TrieMap 实现

最大问题是占空间,R = 256,插入百万数量级的key就 OutOfMemory了。在key的数目比较小的情况下,正如理论指出的一样,性能高于HashMap;但到了占内存比较多的时候由于影响系统整体运行,性能不如HashMap。用HashMap而不是大小为256的数组作为link的时候,占内存少的多,几千万级的都不会OutOfMemory。仔细算一下 256-way Trie的一个N

2016-09-18 23:14:48 1683

原创 AC 自动机

多pattern的匹配, 比KMP更generalpublic class ACAutomata { static final int R = 26; private class Node { Node next[] = new Node[R]; Node fail; String prefix; int count; } public Node root = new

2016-09-18 10:38:28 304

原创 树堆TreapMap 实现

测试结果居然比红黑树,AVL都好。RBT,AVL,SBT,Treap 区别只是节点信息和 maintain函数。所有的读操作都可以放在普通BST里,insert 和 delete(除了RBT)也可以,只需要扩展Node 和 maintain函数就行。import java.util.Random;public class TreapMap, Value> { private

2016-09-15 19:48:51 625

原创 SBT(size balanced tree) 和AVL 合二为一

SBT 和AVL类似,只是是基于size 进行balance的,旋转的case是一样的。public class AVLOrSBTTreeMap, Value> { public enum BF {HEIGHT, SIZE, NONE}; //balance factor private BF bf = BF.HEIGHT; public AVLOrSBTTreeMap() { }

2016-09-15 19:40:04 668

原创 基于LLRB 红黑树的 TreeMap 实现

public class LLRBMap, Value> { private static final boolean RED = true; private static final boolean BLACK = false; private class Node { Key key; Value value; Node left, right; int sz, ht;

2016-09-14 14:51:32 651

原创 基于AVL自平衡树的TreeMap实现

自平衡的插入struct node { int val; struct node* left; struct node* right; int ht; node(int v) : val(v), left(nullptr), right(nullptr) {} node() : left(nullptr), right(nullptr) {} node(i

2016-09-08 16:35:35 750

原创 彻底解决数据库去中心化问题

1)首先垂直切分,按业务模块把一些紧密联系的表分在一起(按表切分),形成一个抽象的vertical partition2)水平切分。垂直切分之后的单个vertical partition(甚至其中单个表)仍然可能太大,一个server放不下,进一步按行切分,这时候需要选择一个聚合根作为记录的horizontal partiotion的标志,一般是userId,对于Forum模块,forumId

2016-08-12 18:40:16 3899 1

原创 再谈 循环/递归就是状态机

状态是相关变量的组合状态,一个变量相当于一个分量一次循环就是一轮状态状态转移初始状态 -> 按某种规则转移,有些状态属于终止状态,然后状态的某个变量就是所求当前状态下,各个变量间互动,迁移,达到另一个状态,状态机的一般形式是 while (true) { //转移规则}, for (int i = 0; i int state1 = 0, state2 = 1; //state

2016-08-04 19:20:27 1598

原创 再谈type ahead 问题

问题:给定一个词典,包括一些词和其出现的频率。实现type ahead功能,要求用户每键入一个字符,下拉框显示以当前输入为前缀的前10个最热门的词解法1:用不带data的Trie,实时查询法框架就是Triie的 startWithPrefix 查询,不同的是并不是返回遍历得到的所有词,而是像经典求top k那样,用一个大小为k的最小堆过滤。解法2: 用 带data的 T

2016-08-02 21:32:54 1168

原创 欧拉路径 LeetCode 332

图中一条路径,包含了所有边(且只包含一次)如果起点和终点是同一个点,则是一种特殊的欧拉路径——欧拉环路求法1:暴力法:遍历所有的路径,如果当前路径长度为总边数,则当前路径是一条欧拉路径,如果一直没有碰到这样的路径,则无解。一个图总共多少条路径(一般是有环的)1)不允许路径里有环,也就是路径里的点都只出现一次的,|V|!(第一个点|V|种选择,第二个|V| - 1种。。 n

2016-06-23 14:30:43 2235

原创 一致性的3种协议,并发,事务

Two Phase CommitMVCCPaxosTPC对应于传统数据库上的local cluster的一致性,分布式事务,每个节点上的local事务可以是不同的亦可以是相同的(replica)MVCC的思想是抓住Transaction的本质:server state从一个一致性state迁移到另一个一致性state,也就是Transaction是工作在一个snap

2016-04-14 16:26:54 457

原创 map reduce takeaways

首先是数据的partition,  share nothing parallel architecture,  执行task的machine独立,各自处理自己的partition,不需要通信暴露给用户的控制点只有2个 map function 和 reduce function,但是整个流程包含更多的步骤,(其他的步骤是infrastructure做的)load: 文件写到 hdfs 就完

2016-04-13 11:03:09 412

原创 关系代数,关系数据库基本概念

Data Model:1)structure  2) constraints 3) operationhierarchy/Treelike(give me my children), table, graph, stream(give me next n bytes)数据库 key ideaphysical data independence : interface with

2016-04-12 16:16:03 934

原创 顺序读写文件的实验

一个OutputStream不断append文件,一个InputStream读同一个文件,读的速度比写快。当Reader 赶上Writer的时候会EOF,但不存在data corruption问题,不需要用户同步。理论上也应该是这样:文件是按块存取的1)如果读写不在一个块,挨不着2)在一个块,变成了一个内存块的顺序读和顺序写的问题,也不需要同步内存块顺序读和顺序写的scen

2016-04-06 16:53:07 1550

原创 面向对象OO 设计、架构终极理解, 以及如何学习一个领域

程序就是一些互相引用的内存快,互相发消息。每个内存块就是一个状态机,状态的迁移规则是定制好的一些消息(方法)。构造函数用来初始化状态。一个内存块的方法除了改变自身状态,也有可能向引用的别内存快发消息,引起别的内存块发生状态转移。重点不在过程化的code,而在对象的状态,code只是定制好的对象状态转移的规则,重在掌握状态怎么转移。程序运行就是对象状态转移,一切都是状态,结果

2016-03-28 22:18:00 1161

原创 BigArray算法核心

几个Object: logical array, paged index files, data filesLogical Array: 1) head index: next array index to append2) tail index: start index of the array, typically 0, if not wrapped这两个是logica

2016-03-21 17:23:23 526

转载 BigQueue:The Architecture and Design of a Publish & Subscribe Messaging System Tailored for Big Data

The Architecture and Design of a Publish & Subscribe Messaging System Tailored for Big Data Collecting and AnalyticsMAR 27TH, 2013 | COMMENTSOverviewWith the advent of big data era, we a

2016-03-18 15:45:13 3181

原创 文件操作总结

seek 到一个大于文件length的值写:产生hole, size 包含hole的部分,size on disk只包含实际字节。seek到文件中间:覆盖,类似编辑模式中的覆盖,而不是insert,没有覆盖到的还是原来的内容,

2016-03-14 18:18:17 344

原创 队列实现的一些问题(scalable, persistent)

Persistent Queue的实现方式:1)Berkeley DB,一个基于文件的高效的key-value store。需要一个从key-value 存取系统到 FIFO存取系统的转换。维护一个自增的Long型的key,队头就是最小的key,队尾就是最大的key。2)paged file。队列由一系列文件或者块组成,只有第一个块和最后一个块是hot的,需要map到memory里

2016-03-14 17:42:49 508

原创 facebook 照片存储系统haystack的学习

之前的solution是POSIX based filesystem: 一些NAS(Network attached storage) 设备mount 到NFS上主要问题:per file metadata 导致过多的disk operation because of metadata lookup。读取一个文件一般至少3个步骤1)一次或者多次disk operation 访问到dir

2016-03-11 16:02:23 1863

原创 kafka设计要点

producer library linked to all kinds of services which generate logsbroker processes consumer library linked to consumer applicationzookeeper hold global informationMessage是有key的,map到topic的一个p

2016-01-23 16:20:51 426

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除