<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>-Flyぁ梦- &#187; 数据结构</title>
	<atom:link href="http://blog.11034.org/tag/ds/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.11034.org</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jun 2025 08:59:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>hulu校招</title>
		<link>http://blog.11034.org/2013-10/hulu.html</link>
		<comments>http://blog.11034.org/2013-10/hulu.html#comments</comments>
		<pubDate>Thu, 31 Oct 2013 15:50:52 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[interview]]></category>
		<category><![CDATA[hulu]]></category>
		<category><![CDATA[MSTC]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://blog.11034.org/?p=2049</guid>
		<description><![CDATA[hulu公司知名度不是很大，直到MSTC众所周知的光哥大神去了之后才了解到的公司吧，麻雀虽小五脏俱全而且是个很 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>hulu公司知名度不是很大，直到MSTC众所周知的光哥大神去了之后才了解到的公司吧，麻雀虽小五脏俱全而且是个很牛逼的公司，筛选员工的标准非常高。浙大算是hulu比较看重的京外高校了，9月下旬来我浙校招，那就去试一下，还真没报什么心态。只有提前了几天去找了下光哥试着内推，在gtalk上被赤裸裸地无视了&#8230;</p>
<p><span id="more-2049"></span></p>
<p>白天还在阿里西溪园区上班，没有参加下午的宣讲会，晚上来到浙江广播电视大学那边进行笔试，之前听闻北京站高mm说起hulu笔试非常难都是数学，想想估计是挂归的节奏，尽力就好。</p>
<p>笔试真的比较难，前面填空题就是非常基础的数学和计算机基础题，还有数据结构和算法，最后几道大题还真不容易。使劲全力，把题目都做完了，大题算法也都写上了虽然不一定对也不是最优解。有点意外的，晚上收到面试通知了，第二天一大早8点钟正门口的灵峰山庄。</p>
<p>第一天的面试，8点钟到了灵峰山庄，遇到其他3个同学为一组，来到面试官所在的2个房间，每个房间里又有2个小房间，刚好四人可以同时被面。第一轮之后，小房间里的面试官交换继续第二轮。外企似乎都喜欢每一轮45-50分钟，然后休息10来分钟。</p>
<p>第一轮，因为到的早了几分钟，面试官就看着简历谈起了各种项目和coding的一些事，聊的很开心，比如经典的喜欢括号在行末还是另起一行啊之类的，谈谈对Python语言的看法啊喜欢或者不喜欢的地方，很好玩。聊了好久才开始做题，然后就是在白纸上coding，题目就是笔试时的最后一个大题，被提示后想到用Huffman树的构造方法，然后又提示下了不需要按段的长短排序，终于做出来了。</p>
<p>第二轮，直接就是做题了。记得一道题一说完马上就有思路了，不过是NlogN的算法，始终想不出最优解O(N)。还有道题目给忘了，做的应该还行。</p>
<p>面完就回去了，看到了周MJ、明铭哥也来面试了。晚上收到了第二天继续面试的通知，依旧早上8点钟。</p>
<p>第二天，第一个来到灵峰山庄，看到了依旧ws的光哥聊了一会儿，然后到了另外一个房间开始面试。因为光哥是四个面试官中的一个，但是因为认识不能面试我，这个面试官连续面了我两轮。主要也是做题和coding，然后聊一会儿项目。记得一道题，在二维横竖递增数组中找一个数，悲剧地和leetcode上那道简单的题目给搞错了（承认leetcode那道题当时没仔细看，自己也没有coding），简单的方法一直是不对的，然后只能自己再想办法。然后在算法题的基础上加上了设计题，磁盘、内存、cache的使用，和一些常用的LRU算法，扯扯也还好。</p>
<p>再面完出来，碰到和光哥同一级的博士生也刚面完，就一起聊着回玉泉然后发现都是25舍的，两人聊了很多关于阿里今年招人的等级制度和P级制度，挺感慨。</p>
<p>再接下来到现在为止都还在一直等结果，和HR聊了几轮，说因为Boss出差了大概要10月中下旬才能给结果。另外和柿子同学聊过，今年hulu招的人也不多而且估计业务方向要有大变化，看这两天CEO都换了，不由心虚。</p>
<p>总的来说，hulu的确和G、FB公司差不多，看重基本能力，一则是数学题看你够不够聪明，二则是数据结构和算法看基础，能进hulu的人员真的都是非常聪明的，也真的很想如果能的话就在这么一家都是非常厉害的同事而且还比较小的公司里工作了。可惜就是远了点在北京，这点其实也还好薪酬只要高一点就能cover掉了，不过最近北京的雾霾&#8230;真的无解啊&#8230;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;分割线：2013-10-14&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>今天HR打电话来给了口头offer，啊呀开心！能和光哥这种级别的人物拿到同样的offer真是兴奋！不过具体offer细节还要等到月底据说~</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;分割线：2013-10-29&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>hulu的offer是这次校招所有offer中薪资最高的了，不过因为其在北京感觉和百度上海也就差不多了，因为能留在杭州实在就不想跑这么远了北京实在是有点太恐怖了，爸妈也不希望自己去，最终非常伤心可惜的拒掉了offer，哎损人品啊&#8230; <img src="http://blog.11034.org/wp-includes/images/smilies/icon_cry.gif" alt=":cry:" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h4  class="related_post_title">看看 hulu , MSTC , 数据结构 , 算法</h4><ul class="related_post"><li>2013-10-17 -- <a target="_blank" href="http://blog.11034.org/2013-10/google.html" title="Google校招">Google校招</a></li><li>2012-07-03 -- <a target="_blank" href="http://blog.11034.org/2012-07/trie_in_php.html" title="敏感词过滤，PHP实现的Trie树">敏感词过滤，PHP实现的Trie树</a></li><li>2012-03-22 -- <a target="_blank" href="http://blog.11034.org/2012-03/java_util_collections.html" title="java.util中的集合类解析">java.util中的集合类解析</a></li><li>2010-12-31 -- <a target="_blank" href="http://blog.11034.org/2010-12/summary_2010.html" title="总结，@2010">总结，@2010</a></li><li>2010-10-17 -- <a target="_blank" href="http://blog.11034.org/2010-10/beijing_baidu.html" title="北京，百度">北京，百度</a></li></ul><h4 class="related_post_title">看看 interview </h4><ul class="related_post"><li>2013-10-17 -- <a target="_blank" href="http://blog.11034.org/2013-10/google.html" title="Google校招">Google校招</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2013-10/hulu.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>敏感词过滤，PHP实现的Trie树</title>
		<link>http://blog.11034.org/2012-07/trie_in_php.html</link>
		<comments>http://blog.11034.org/2012-07/trie_in_php.html#comments</comments>
		<pubDate>Tue, 03 Jul 2012 14:43:25 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trie]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://blog.stariy.org/?p=1174</guid>
		<description><![CDATA[项目需求，要做敏感词过滤，对于敏感词本身就是一个CRUD的模块很简单，比较麻烦的就是对各种输入的敏感词检测了。 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>项目需求，要做敏感词过滤，对于敏感词本身就是一个CRUD的模块很简单，比较麻烦的就是对各种输入的敏感词检测了。用Trie树来实现是比较通用的一种办法吧，之前一直没机会用过这种数据结构，正好试着写了一下。</p>
<p>因为用PHP实现，关联数组用的很舒服。第一个要解决的是字符集的问题，如果在Java中就比较好办统一的Unicode，在PHP中因为常用UTF-8字符集，默认有1-4个字节不同的长度来表示一个字符，于是写了个Util类来将普通的UTF-8字符串转换成字符数组，每一个元素是一个UTF-8串形成的字符。这一点比较容易实现的，根据UTF-8字符集的格式而来就好。<br />
<span id="more-1174"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> get_chars<span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$s</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$utf8_str</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$s</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$n</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>		<span style="color: #666666; font-style: italic;">//0xxx xxxx, asci, single</span>
			<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$c</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> 	<span style="color: #666666; font-style: italic;">//1111 xxxx, first in four char</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$c</span><span style="color: #339933;">.</span><span style="color: #000088;">$s</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$s</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$s</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$i</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> 	<span style="color: #666666; font-style: italic;">//111x xxxx, first in three char</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$c</span><span style="color: #339933;">.</span><span style="color: #000088;">$s</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$s</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$i</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> 	<span style="color: #666666; font-style: italic;">//11xx xxxx, first in two char</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$c</span><span style="color: #339933;">.</span><span style="color: #000088;">$s</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$i</span><span style="color: #339933;">++;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$chars</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>字符单位确认以后，就是写Trie树了。简单的算法，从根路径开始给每个字符建一个关联数组，当字符串结束的时候，用一个null表示结尾。</p>
<p>删除一个串，只要找到串中任意一个字符的子元素数量为1，就表示只有这个串了，整个删除就好了；若子元素数量大于1，则继续根据字符找下去，直到末尾的null。</p>
<p>查找一个串（完全匹配），一直根据字符找到null为止就表明存在，任一字符不存在就表明串不存在。</p>
<p>验证一个长串是否含有任一串，这边算法比较挫，按照每个字符开始都在Trie树种搜索一遍，走的回头路比较多，复杂度有O(n * m)，n为长串长度，m为Trie树深度，不过因为中文Trie树深度很浅，勉强还过得去（英文字符串深度很长）。</p>
<p>然后因为PHP没有全局缓存的机制，每次都要从数据库中读取全部的敏感词，然后建立Trie树再去匹配串的话太麻烦了，采取的办法是将Trie内部的关联数组序列化后直接保存在数据库中，每次只要读取这条数据，然后反序列化，Trie树就回来了。当然进行串的插入和删除，将更新这个序列化数据。</p>
<p>可改进的地方：</p>
<ol>
<li>当某一条路径只有这个串即关联数组数量为1时，可以压缩子树</li>
<li>改进Trie树为AC自动机，即每个节点都添加一个失败指针，指向匹配失败后回到树的哪个节点，这样就仅仅是O(n)的复杂度了。建树的过程比较复杂，对每个插入的串的子串进行处理，运行时查询的效率非常高</li>
</ol>
<p>贴代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> TrieTree<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$tree</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> insert<span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>UTF8Util<span style="color: #339933;">::</span><span style="color: #004000;">get_chars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">//串结尾字符</span>
		<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tree</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$count</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$T</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$T</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">//插入新字符，关联数组</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$T</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> remove<span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>UTF8Util<span style="color: #339933;">::</span><span style="color: #004000;">get_chars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_find<span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>	<span style="color: #666666; font-style: italic;">//先保证此串在树中</span>
			<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tree</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$count</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$T</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>		<span style="color: #666666; font-style: italic;">//表明仅有此串</span>
					<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$T</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$T</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _find<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tree</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$count</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$T</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$T</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> find<span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>UTF8Util<span style="color: #339933;">::</span><span style="color: #004000;">get_chars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_find<span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> contain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #339933;">,</span> <span style="color: #000088;">$do_count</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$chars</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>UTF8Util<span style="color: #339933;">::</span><span style="color: #004000;">get_chars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$utf8_str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$chars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$Tree</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tree</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$Tree</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>	<span style="color: #666666; font-style: italic;">//起始字符匹配</span>
				<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$Tree</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span><span style="color: #000088;">$j</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$chars</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
					<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$T</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$do_count</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
							<span style="color: #000088;">$count</span><span style="color: #339933;">++;</span>
						<span style="color: #009900;">&#125;</span>
						<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
							<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
						<span style="color: #009900;">&#125;</span>
					<span style="color: #009900;">&#125;</span>
					<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,</span> <span style="color: #000088;">$T</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
					<span style="color: #000088;">$T</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$T</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$do_count</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$count</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> contain_all<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str_array</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str_array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">contain</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> export<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tree</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> import<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tree</span> <span style="color: #339933;">=</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4  class="related_post_title">看看 Trie , UTF-8 , 字符串 , 数据结构</h4><ul class="related_post"><li>2013-10-31 -- <a target="_blank" href="http://blog.11034.org/2013-10/hulu.html" title="hulu校招">hulu校招</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/string.html" title="整理下字符串的一些数据结构和算法">整理下字符串的一些数据结构和算法</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/suffix_array.html" title="一套可用的后缀数组代码">一套可用的后缀数组代码</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/ac_automachine.html" title="一个OOP的AC自动机代码">一个OOP的AC自动机代码</a></li><li>2012-03-22 -- <a target="_blank" href="http://blog.11034.org/2012-03/java_util_collections.html" title="java.util中的集合类解析">java.util中的集合类解析</a></li></ul><h4 class="related_post_title">看看 PHP </h4><ul class="related_post"><li>2012-06-28 -- <a target="_blank" href="http://blog.11034.org/2012-06/get_video_cover_image.html" title="各大视频网站的视频截图抓取">各大视频网站的视频截图抓取</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2012-07/trie_in_php.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>java.util中的集合类解析</title>
		<link>http://blog.11034.org/2012-03/java_util_collections.html</link>
		<comments>http://blog.11034.org/2012-03/java_util_collections.html#comments</comments>
		<pubDate>Wed, 21 Mar 2012 16:15:37 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://blog.stariy.org/?p=1101</guid>
		<description><![CDATA[Java源码学习的第二个重点块，也是jdk中最有意义最有价值的一块，这里的集合类都是数据结构和算法，上手快学到 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Java源码学习的第二个重点块，也是jdk中最有意义最有价值的一块，这里的集合类都是数据结构和算法，上手快学到的东西也多，而且在日常Java代码中出现率仅次于java.lang包。java.util中集合类必须是最重要的一块了，当然其他还有日期日历时区、货币、线程等工具类，不过这些类并没有太大的价值去精读。<br />
<span id="more-1101"></span></p>
<p>java.util中的集合类整体，在javadoc中被称为Java Collections Framework，详细可wiki。</p>
<p>主要有以下线路：(I)表示接口，(A)表示抽象类</p>
<ul>
<li>(I)<span style="color: #993366;">Iterable</span>-&gt;(I)<span style="color: #993366;">Collection</span>-&gt;(I)<span style="color: #993366;"><strong>List </strong></span>[ArrayList、LinkedList、Vector、Stack]</li>
<li>(I)<span style="color: #993366;">Iterable</span>-&gt;(I)<span style="color: #993366;">Collection</span>-&gt;(I)<span style="color: #993366;"><strong>Set </strong></span>[HashSet、LinkedHashSet、TreeSet]</li>
<li>(I)<span style="color: #993366;">Iterable</span>-&gt;(I)<span style="color: #993366;">Collection</span>-&gt;(I)<span style="color: #993366;"><strong>Queue </strong></span>[ArrayDeque、PriorityQueue]</li>
<li>(I)<strong><span style="color: #993366;">Map</span> </strong>[HashMap、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap]</li>
<li>(A)<span style="color: #008000;">Dictionary</span>-&gt;Hashtable</li>
<li>BitSet、<span style="color: #ff9900;">Arrays<span style="color: #000000;">、</span>Collections</span></li>
</ul>
<h2><span style="color: #993366;">List</span></h2>
<h4><span style="color: #0000ff;">ArrayList&lt;E&gt;</span></h4>
<p>由数组实现的链表，每次调用add(E e)时调用ensureCapacity(size + 1)，可能导致元素数组扩容1.5倍。因为它是随机访问的（即实现RandomAccess接口），javadoc中表示使用for(int i = 0)的循环遍历会比Iterator遍历和foreach()循环快（foreach循环即Iterator遍历），这也在很多源码中体现出来若实例为RandomAccess的，会采取for循环来遍历。</p>
<h4><span style="color: #0000ff;">LinkedList&lt;E&gt;</span></h4>
<p>由结点链接而成的链表，API较多用来当做栈、队列、双向队列都可以。</p>
<h4><span style="color: #0000ff;">Vector&lt;E&gt;</span> 和 <span style="color: #0000ff;">Stack&lt;E&gt;</span> extands Vector&lt;E&gt;</h4>
<p>Vector类似ArrayList，但是此为线程安全版本。小有区别的，每次需要扩容时元素数组扩容2倍。</p>
<p>Stack就是个线程安全的栈，没啥好说。</p>
<h2><span style="color: #993366;">Queue</span></h2>
<h4><span style="color: #0000ff;">ArrayDeque&lt;E&gt;</span> implements Deque&lt;E&gt;</h4>
<p>由数组实现的双向队列（Deque接口）。这个类的代码实现有点意思的，元素数组大小一定是power-of-2，然后可以方便地使用位运算来判断长度溢出等。因为要保持数组容量的这个特性，数组扩容代码也挺有意思，有个简单的算法将某个数二进制中最高位1右边所有的位全部置为1，然后再+1，即得到了一个更大的power-of-2。</p>
<h4><span style="color: #0000ff;">PriorityQueue&lt;E&gt;</span></h4>
<p>由数组实现的优先队列，元素E必须实现Comparable接口或选择带有Comparator的PriorityQueue构造，因为在比较元素E时会强制转化类型为Comparable。看这个类的源代码可以好好复习下优先队列及满二叉树的实现。数组扩容的代码有点意思，当原容量&lt;64时，扩容2倍，否则扩容1.5倍，综合ArrayList和Vector的扩容方案。</p>
<h2><span style="color: #993366;">Set</span></h2>
<p>set是Java Collections Framework最坑爹的实现了，因为它根本没有任何实现，所有的set都在内部保存有一个对应的map类型实例&#8230;</p>
<h2><span style="color: #993366;">Map</span></h2>
<p>map是Java Collections Framework最复杂的一块。</p>
<h4><span style="color: #0000ff;">HashMap&lt;K, V&gt;</span></h4>
<p>一般的Hash表实现，冲突机制使用在原位置接链表的方式。与教科书推荐的不太一样的是，桶的个数并不是推荐的质数个（据说这样可以减小冲突率）而是power-of-2，为的是通过位操作的代码高效实现。</p>
<ul>
<li>默认加载因子是0.75，即75%的桶被沾满了就会扩容重新hash，每次double容量</li>
<li>冲突机制：接链表</li>
<li>hash函数，static int hash(int h)，对元素E.hashCode()再进行一次hash，hash算法很复杂各种移位抑或操作，表示看不懂&#8230;</li>
<li>允许null键，而且null键必定位于0号位桶</li>
<li>键的比较采用Object.equals()方法（null键带有特判）</li>
<li>foreach循环或Iterator遍历，按照桶的顺序（当一个桶有多个键时，按照插入顺序遍历）</li>
</ul>
<h4><span style="color: #0000ff;">Hashtable&lt;K, V&gt;</span></h4>
<p>姑且算放在Map这里吧，主要可以和HashMap来个对比。算是线程安全的HashMap，但是相比来说代码没有HashMap优化的好。</p>
<p>Hashtable与HashMap的不同之处：</p>
<ul>
<li>Hashtable继承自Dictionary抽象类；HashMap继承自AbstractMap抽象类</li>
<li>Hashtable的hash函数直接使用的E.hashCode()，使用取余操作；HashMap使用位操作并进一步hash</li>
<li>Hashtable不允许null键，也不允许null值；HashMap都允许</li>
<li>Hashtable中是contains()方法；HashMap是containsKey()或containsValue()</li>
<li>Hashtable中由Enumerator来实现Enumeration和Iterator；HashMap则单由Iterator实现</li>
</ul>
<h4><span style="color: #0000ff;">LinkedHashMap&lt;K, V&gt;</span> extends HashMap&lt;K, V&gt;</h4>
<p>数据存储和读取和HashMap无异，但是多了一个链表来保存插入键的顺序。当foreach循环或Iterator遍历时，会按照这个链表来遍历。比较有意思的是，LinkedHashMap为后续提供了一个LRU容器的选择，可以自建个类继承自LinkedHashMap，重写protected boolean removeEldestEntry()然后return true。</p>
<h4><span style="color: #0000ff;">IdentityHashMap&lt;K, V&gt;</span></h4>
<p>对外而言这个Map与HashMap最大的不同在于比较Key用==操作符，其实内部实现有很大的区别。同样使用power-of-2大小的元素数组，但是没有用一个内部静态类去封装Key和Value，用偶数桶存放Key奇数桶存放Value，即每一项占用2个桶，然后冲突策略使用的index + 2策略，即冲突就往下一个最近的桶放。</p>
<ul>
<li>冲突机制：开放定址法，并为线性探测；效率低、删除元素非常麻烦</li>
<li>hash函数：对System.identityHashCode(E)继续一些位操作来得到hash值</li>
<li>允许null键</li>
<li>键比较采用==操作符</li>
<li>foreach循环或Iterator遍历，按照桶的顺序</li>
<li>OO封装不好，key、value连着放除了性能上很小的提升外没有啥优点</li>
</ul>
<h4><span style="color: #0000ff;">TreeMap&lt;K, V&gt;</span></h4>
<p>由红黑树实现的Map，Key必须实现Comparable接口或选择带有Comparator的TreeMap构造。也是非常值得精读的一个类，不仅仅在于了解一下红黑树这个效率比较优秀的平衡二叉树的实现更在于对一般的二叉树这个数据结构和算法的掌握。为了看懂源码学习了一会儿红黑树，真心表示复杂，所以觉得大致了解红黑树就可以了无需看懂插入元素和删除元素的每一步操作这么具体。因为TreeMap是唯一实现SortedMap接口的Map，很多API的代码实现对二叉树的操作十分的美，特别是static successor()、static predecessor()、getCeilingEntry()、getFloorEntry()的实现很关键。</p>
<ul>
<li>拒绝null键，因为键需要比较，但允许null值</li>
<li>树的重建，用最平衡的方法重建红黑树，递归则重建左子树、中间节点、右子树。而且红色节点计算很方便，最后一层（若没有满）则所有节点都是红色的（即保证所有的黑色节点为一棵满树）</li>
</ul>
<h4><span style="color: #0000ff;">WeekHashMap&lt;K, V&gt;</span></h4>
<p>基本和HashMap一样，就是Entry的实现继承自WeakReference，key是弱引用，value是强引用。适用于元素量巨大，内存可能不足够用的时候，自动GC某些key并在下次访问Map时删除这些映射。适合作缓存，某些项突然消失也无关紧要的那种。</p>
<ul>
<li>Entry&lt;K,V&gt; extends WeakReference&lt;K&gt;，当GC工作时某些Key会被GC并放入WeekHashMap的ReferenceQueue中。每次对WeekHashMap的调用，会检查ReferenceQueue中已被GC的Key，然后找到那项Entry将里面的强引用Value给设置为null便于GC，并删除Map中对此Entry的引用，更新计数。</li>
<li>键冲突机制、hash函数、null键、键比较、遍历全部与HashMap相同</li>
</ul>
<h2><span style="color: #0000ff;">BitSet</span></h2>
<p>使用long数组来实现的位向量，使用了大量位运算，值得一读。</p>
<h2><span style="color: #0000ff;">Arrays</span></h2>
<p>全静态方法的针对数组的工具类。主要提供了排序、二分搜索、复制、填充等功能。</p>
<p>排序方法中：</p>
<ul>
<li>所有Java基础类型的数组排序使用QuickSort，在元素量&lt;7时使用InsertSort。选取pivot有一定改进。</li>
<li>对double和float数组的排序有预处理，将NaN放到数组最后不参与排序，将-0.0d设为0.0d参与排序</li>
<li>对Java类型的数组排序使用MergeSort，在元素量&lt;7时使用InsertSort。改进：当2个子序列a和b，max(a)&lt;=min(b)则直接copy a和b至目标数组</li>
</ul>
<h2><span style="color: #0000ff;">Collections</span></h2>
<p>全静态方法的针对集合类的工具类。主要提供排序、元素移位、封装集合为不可变集合、封装集合为线程安全集合、封装集合为类型检查集合等功能。</p>
<p>所有的集合封装方法，都是将传入的集合封装一层类，然后在外层提供的API中拒绝修改方法（抛出UnsupportedOperationException）、提供线程安全（synchronized关键字）、检查插入类与泛型类来实现。</p>
<h2>综合</h2>
<ul>
<li>所有的集合类都有modCount这个field，它的作用是记录集合实例被改变的次数，特别是调用Iterator时这个modCount会被保存副本，在遍历过程中若发现集合实例被修改（即副本modCount与集合类实例的modCount不相等），立即停止遍历并抛出异常，即javadoc中提到的<tt>iterator</tt> 和 <tt>listIterator</tt> 方法返回的迭代器是快速失败的。</li>
<li>Map和Set中支持KeySet、ValueSet、EntrySet这些方法，返回的Set并不是一个独立的Set，内部无任何元素只有一个指向原来集合实例的指针（内部类），所以一般只用来作遍历用，如果修改这些Set会同步地修改原来集合实例。</li>
<li>所有的集合类实现了java.lang.Cloneable接口，从而支持clone()方法，然后又全部重写clone()方法，集合实例的确被clone了，但是内部包含的所有集合元素只是copy了引用，而没有完整copy一份（当然因为元素本身不一定实现了Cloneable不能被clone），因为本质只是调用了System.arraycopy()而已。</li>
</ul>
<h2>感想</h2>
<ul>
<li>大多数集合类的实现其实一点都不难，慢慢改进调试我们也写得出来</li>
<li>有很好的OO思想直接体现在整个Java Collections Framework的层次结构设计，是值得学习的</li>
<li>Iterator思想也是很值得学习的，因为这一点也许接触地更少</li>
<li>也许算Java语言的一个无奈之处，因为基础类型没有共同可替代的方式，所以针对基础类型的方法全部要重载一遍，而不像针对类类型只要写一个Object版本就可以。这导致基础类型的方法中，比如System.out.println()，比如Arrays的所有方法，代码大量冗余重复，这是非常不美的地方啊，不知道以后的Java会不会改进</li>
</ul>
<h4  class="related_post_title">看看 oop , 数据结构</h4><ul class="related_post"><li>2014-07-07 -- <a target="_blank" href="http://blog.11034.org/2014-07/ruby_on_rails.html" title="ruby on rails">ruby on rails</a></li><li>2013-10-31 -- <a target="_blank" href="http://blog.11034.org/2013-10/hulu.html" title="hulu校招">hulu校招</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/ac_automachine.html" title="一个OOP的AC自动机代码">一个OOP的AC自动机代码</a></li><li>2012-07-03 -- <a target="_blank" href="http://blog.11034.org/2012-07/trie_in_php.html" title="敏感词过滤，PHP实现的Trie树">敏感词过滤，PHP实现的Trie树</a></li><li>2010-11-17 -- <a target="_blank" href="http://blog.11034.org/2010-11/python2x_first_impression.html" title="Python2.x的第一印象">Python2.x的第一印象</a></li></ul><h4 class="related_post_title">看看 Java </h4><ul class="related_post"><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><li>2016-08-18 -- <a target="_blank" href="http://blog.11034.org/2016-08/java_concurrency_in_practice.html" title="读java concurrency in practice">读java concurrency in practice</a></li><li>2016-08-05 -- <a target="_blank" href="http://blog.11034.org/2016-08/thread_stop.html" title="线程清理">线程清理</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/futuretask.html" title="FutureTask简单分析和用法">FutureTask简单分析和用法</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/semaphore.html" title="Semaphore简单分析">Semaphore简单分析</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2012-03/java_util_collections.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>北京，百度</title>
		<link>http://blog.11034.org/2010-10/beijing_baidu.html</link>
		<comments>http://blog.11034.org/2010-10/beijing_baidu.html#comments</comments>
		<pubDate>Sat, 16 Oct 2010 16:19:23 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Life in intern]]></category>
		<category><![CDATA[SCDA]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[面试]]></category>

		<guid isPermaLink="false">http://blog.stariy.info/?p=466</guid>
		<description><![CDATA[得知保研后，就找了徐串学长内推去百度实习。eBay实习了刚好三个月，主要觉得继续呆下去技术上实在不能学到什么了 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>得知保研后，就找了徐串学长内推去百度实习。eBay实习了刚好三个月，主要觉得继续呆下去技术上实在不能学到什么了，意义也不大，上海也几乎都玩转了，换个环境是个很不错的想法。<span id="more-466"></span></p>
<p>10月8日，电话面试。搜索研发部，下午3点半到4点半，1个小时，4题算法数据结构体，然后是一些项目经验的介绍和分析。面试前，面试官还详细介绍了一下组内的状况，用的技术之类的情况，听的我一愣一愣，这个倒是第一次没有碰到过的。印象最深的就是百度使用C++和Python，555，都不熟&#8230;</p>
<ul>
<li>前2题都比较简单，基础题，就不说了</li>
</ul>
<ul>
<li><strong>一堆String，要求所有字符都相同的分到一个组内，比如face和cafe，都包含a c e f4个字符</strong></li>
</ul>
<p style="padding-left: 60px;">听到这个问题就感觉悲剧了，直接说好像是微软的那本《编程之美》里面的题目，面试官也笑了。一下子记不起来方法了，还是自己想吧。我的方法是，按照String长度和字符ASC值的和划分N个小组，然后在小组内，用O(n<sup>2</sup>)的比较得出结果。面试官继续问我具体怎么比较2个字符串呢？这个问题没考虑过，一个一个字符地比较过去效率太低，是O(m<sup>2</sup>)的，m为字符串长度，想到把字符串串内排序，降到O(nlgn)。</p>
<ul>
<li><strong>有2个桶A、B，容量不一样。三排金币X、Y、Z，每个金币体积为1，但价值不一样，且X只能被放到A中，Z只能被放到B中，Y两边都可以，求A B桶的价值最大的算法</strong></li>
</ul>
<p style="padding-left: 60px;">一开始理解错题意，还以为是背包问题，没注意到金币体积都是1的条件，瞎搞了一段时间。只知道先把X、Y、Z排序，然后就是遍历了，O(A*B)，想不出什么好办法。这题算是没有做出来吧。面试官给的答案是：排序后，每将X、Z的金币放入A和B，都计算Y中可以放入的数量的价值总和和X、Z可以放入总和的比较，哪个优就放哪个。也听得迷迷糊糊，大概是这个意思，没具体搞清楚，呵呵。</p>
<p>接下来是项目经验，先讲了淘宝开源网店程序的二次开发，然后是讲了关于eBay的实习做的事，就结束了。整个电话面试过程气氛挺融洽，面试官也很nice，居然也是浙大的，01届的学长，哈哈。</p>
<p>10月12日正式拿到了百度的实习offer，10月27日入职，这是第二次拿到实习offer了，2次的offer居然还是基本一模一样，囧&#8230;</p>
<p>继魔都暑期三月之后，即将展开帝都寒冬三月之旅，但求我这个怕冷的不要冻死在北京的街头&#8230;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;分割线：百度校园招聘笔试&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>今天还去百度校园招聘的笔试了，虽然对我已经没有什么意义，但是一次不错的机会。抱着打酱油的心态去了，果然很轻松，题目也不难，本开打算看个题15分钟就出来的，因为下午有SCDA七周年庆要赶着去。不过题目做着做着，还是想看看自己有多少水平，于是走正规途径，1个小时做完，基本没检查也没再继续优化，就交卷了。估计全场第一个完成笔试的，哈哈，好爽！ <img src="http://blog.11034.org/wp-includes/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;分割线：SCDA七周年庆&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>SCDA七周年了，生日快乐！下午的庆祝party倒是没怎么参与，就和大家聊天了。晚上，老朋友一起在名人名家吃饭，各种特价菜给力！借用沛沛的话“还是和SCDA的朋友吃饭来的舒服”！ <img src="http://blog.11034.org/wp-includes/images/smilies/icon_wink.gif" alt=":wink:" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h4  class="related_post_title">看看 SCDA , 数据结构 , 百度 , 面试</h4><ul class="related_post"><li>2010-05-05 -- <a target="_blank" href="http://blog.11034.org/2010-05/interview_of_baidu.html" title="记百度面试">记百度面试</a></li><li>2013-10-31 -- <a target="_blank" href="http://blog.11034.org/2013-10/hulu.html" title="hulu校招">hulu校招</a></li><li>2012-07-03 -- <a target="_blank" href="http://blog.11034.org/2012-07/trie_in_php.html" title="敏感词过滤，PHP实现的Trie树">敏感词过滤，PHP实现的Trie树</a></li><li>2012-03-22 -- <a target="_blank" href="http://blog.11034.org/2012-03/java_util_collections.html" title="java.util中的集合类解析">java.util中的集合类解析</a></li><li>2012-01-01 -- <a target="_blank" href="http://blog.11034.org/2012-01/summary_2011.html" title="2011年的总结">2011年的总结</a></li></ul><h4 class="related_post_title">看看 Life in intern </h4><ul class="related_post"><li>2013-10-13 -- <a target="_blank" href="http://blog.11034.org/2013-10/tianmao_intern.html" title="天猫实习经历">天猫实习经历</a></li><li>2010-12-31 -- <a target="_blank" href="http://blog.11034.org/2010-12/summary_2010.html" title="总结，@2010">总结，@2010</a></li><li>2010-05-05 -- <a target="_blank" href="http://blog.11034.org/2010-05/interview_of_baidu.html" title="记百度面试">记百度面试</a></li><li>2010-04-27 -- <a target="_blank" href="http://blog.11034.org/2010-04/interview_of_taobao.html" title="记淘宝的笔试和面试">记淘宝的笔试和面试</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2010-10/beijing_baidu.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>记百度面试</title>
		<link>http://blog.11034.org/2010-05/interview_of_baidu.html</link>
		<comments>http://blog.11034.org/2010-05/interview_of_baidu.html#comments</comments>
		<pubDate>Wed, 05 May 2010 06:15:37 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Life in intern]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[百度]]></category>

		<guid isPermaLink="false">http://blog.stariy.info/?p=52</guid>
		<description><![CDATA[百度，一直是曾经的理想，大二之前一直想毕业能进百度就好了，居然真的有机会如愿了&#8230; 昨天，下学期第一 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>百度，一直是曾经的理想，大二之前一直想毕业能进百度就好了，居然真的有机会如愿了&#8230;</p>
<p><span id="more-52"></span></p>
<p>昨天，下学期第一天上课。网络实验课竟然在教四，真蛋疼&#8230;8点半左边，一个陌生的固定电话打来，一看大清早的应该不是骚扰电话，毅然当着当老师面偷偷跑出教室接电话。果然，来者也不说身份，直接说要电面，哪家公司都不知道，我说在上课，下午好，他说好，挂了。后来一看是010开头的电话，是北京的，北京投了好多的，天知道是哪家了&#8230;不过一点都没想到是百度&#8230;</p>
<p>还有点兴奋，继拿到淘宝offer后，终于又有别的机会了。谁知道下午等了半天没电话&#8230;晚上电话也没关机，怕类似情况。</p>
<p>今天一大早，果然电话又来了，还是8点半，全寝室都还在睡觉&#8230;真郁闷，百度有那么早上班的？？做了下准备工作(穿衣、刷牙)去面试，脸都还没洗&#8230;</p>
<p>一开场直接问我：一大串文本中，要统计出几个字符串出现的次数和。囧，题目类似见过，但是没去看过解答方案，自己都没思考过&#8230;百度果然还是主要考数据结构和算法的。没办法，硬着头皮上，最土的遍历呗，如果有数据库支持就好了(完全是扯开一下话题而已&#8230;)。他说，那你用数据库怎么实现&#8230;继续傻了，坦言不会&#8230;问，有没有只要扫描一遍就能解决的方法？继续不会&#8230;提示，用数据结构怎么解决。我想，用链表？不行。树，貌似行。也没多想，说用二叉树，不确定行不行，试了再说。大致说了下思路，问算法复杂度是多少？继续傻，刚才说扫描一遍么，大概是O(n)吧？确定？额，O(nlog字符串数量)？确定？额额额，无语中，O(n<sup>2</sup>)应该不至于。不管了，O(n)，错了就错了。对方一笑&#8230;也没有继续问问题，一开始说要问几题的，估计看我太菜了，懒得问了&#8230;咳，完全被BS&#8230;</p>
<p>然后是要我谈PHP的项目经验，才知道是招PHP的实习生，当初貌似第一志愿是Java，二三志愿是PHP，貌似。这个还是比较轻松的，把淘宝的独立网店讲了一遍，其实也没什么好讲的，做的时间本来就不长，技术含量也不高，扯了一会儿。对方貌似也没什么其他问题，就结束了面试。终于喘了一口气&#8230;</p>
<p>百度这面试官也太啥了，面试没通知也就算了，还连续2天大清早的来面试，的确搞的我很不爽。反正招的也是PHP，PHP还是适合业余玩玩，不太适合作为正当职业啊。</p>
<p>面试完，发现寝室都被我的电话吵醒了&#8230;道个歉额&#8230;我也不想这样的 &#8211; &#8211;</p>
<p>起码有一点让我比较开心，我的简历能通过淘宝、百度到达面试，辛苦经营的简历还是过得去的，嘿嘿，SCDA对我的帮助不小啊 <img src="http://blog.11034.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p style="text-align: center;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;我是分割线，5月19日&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p style="text-align: left;">以为百度一面后肯定悲剧了，谁知19号又被电面了，依然 是技术面，依然是数据结构和算法。</p>
<ul>
<li>有2个文件，里面都装了上亿个URL，找出2文件中匹配的URL的算法</li>
</ul>
<p>百度果然喜欢问这种大数据的问题，忽略数据大的问题。我直接用hash_table把小的文件存进去，然后大的文件一一去匹配，复杂度应该是O(m + n)的，当时说错了，郁闷</p>
<ul>
<li>玩过华容道没？ 回：没……这个比较囧&#8230;</li>
<li>编译一个project，有很多模块，模块间有依赖，怎么一次性编译完整个project？</li>
</ul>
<p>类似森林，不过有交叉，应该是多入口的图。将没有编译依赖的节点作为入口，有编译依赖的就有一条边指向它依赖的节点，这样一个图就形成了，然后从每个入口拓扑排序遍历整个图，复杂度应该是O(v + e)。一开始脱口而出O(n)，囧</p>
<ul>
<li>从N个点种找出离某个点最近的k个点</li>
</ul>
<p>这个简单，就如同n个数找出最小的k个数一样，一个最小堆，遍历一遍就OK了，复杂度O(n*log(k))</p>
<p>百度到现在也没问过我关于任何语言方面的基础知识，就问DS和算法&#8230;相近难度的确高，不过给的补贴的确是很nice的，不过在北京，所以面试嘛，多多益善！</p>
<p style="text-align: center;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;我是分割线，5月25日&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p style="text-align: left;">今天突发奇想，于是就回家了，明天反正没课，可以在家呆一天。下午也回了ebayHR的邮件，决定是去ebay了。晚上在家，出乎意料的又接到了010打头的电话，一看一紧张知道多半是百度，接起，果然，是百度的HRmm，问我能来实习的时间。有点兴奋，竟然进HR面了，小隐瞒了下去ebay的事实，HRmm也没多问，说过几天会给我答复是否给我offer。哈哈，挺开心。晚上还教老妈玩植物大战僵尸，自己连玩了2个小时，囧&#8230;</p>
<p style="text-align: left;">百度实习（150工资 + 20饭补）*出勤 + 房补75 * 30，那个叫爽啊，可惜在北京&#8230;只能眼红了&#8230;</p>
<h4  class="related_post_title">看看 数据结构 , 百度</h4><ul class="related_post"><li>2010-10-17 -- <a target="_blank" href="http://blog.11034.org/2010-10/beijing_baidu.html" title="北京，百度">北京，百度</a></li><li>2013-10-31 -- <a target="_blank" href="http://blog.11034.org/2013-10/hulu.html" title="hulu校招">hulu校招</a></li><li>2012-07-03 -- <a target="_blank" href="http://blog.11034.org/2012-07/trie_in_php.html" title="敏感词过滤，PHP实现的Trie树">敏感词过滤，PHP实现的Trie树</a></li><li>2012-03-22 -- <a target="_blank" href="http://blog.11034.org/2012-03/java_util_collections.html" title="java.util中的集合类解析">java.util中的集合类解析</a></li><li>2012-01-01 -- <a target="_blank" href="http://blog.11034.org/2012-01/summary_2011.html" title="2011年的总结">2011年的总结</a></li></ul><h4 class="related_post_title">看看 Life in intern </h4><ul class="related_post"><li>2013-10-13 -- <a target="_blank" href="http://blog.11034.org/2013-10/tianmao_intern.html" title="天猫实习经历">天猫实习经历</a></li><li>2010-12-31 -- <a target="_blank" href="http://blog.11034.org/2010-12/summary_2010.html" title="总结，@2010">总结，@2010</a></li><li>2010-10-17 -- <a target="_blank" href="http://blog.11034.org/2010-10/beijing_baidu.html" title="北京，百度">北京，百度</a></li><li>2010-04-27 -- <a target="_blank" href="http://blog.11034.org/2010-04/interview_of_taobao.html" title="记淘宝的笔试和面试">记淘宝的笔试和面试</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2010-05/interview_of_baidu.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
