数据结构整理

ArrayList和LinkedList。

ArrayList 就是个动态数组, 它的大小是会一直变化的。当你放进去的东西达到当前容量50% 或者 75%?的时候,它会自动扩大一倍。然后在动态数组里面找东西什么的非常容易,直接给一个index,就可以找到那个东西。 

Linkedlist是 分散的内存块。一个东西可能存在内存0, 另一个可能存在内存100,然后直接用指针指着,才能准确知道下一个数据藏在哪个内存里。Linkedlist 要找东西没有那么容易,你没办法给一个index来找,必须从第一个跳到第二个跳到第三个,。。。才能找到。 但是,linkedlist删东西/加进新的东西非常简单,只要把前一个节点的指针指向新来的东西,新来的东西指向本来下一个节点就可以了



HashTable, HashMap, HashSet

HashTable和HashMap的区别,什么时候有collision?   

区别:One of the major differences between HashMap and Hashtable is that HashMap is non-synchronized whereas Hashtable is synchronized, which means Hashtable is thread-safe and can be shared between multiple threads but HashMap can not be shared between multiple threads without proper synchronization. 【这是一个很深的概念,之后慢慢搞。】

当hash function translate two items into the same index (也就是有同样的hashcode)的时候, 会有Collision。 有许多方法来handle collision, 比如说我们可以用Separate Chaining, 也就是放一个list 在那个index。 所有hashcode到这个index的,往这个list上面放。  还有,我们可以用linear 或者 quartic probing, double-hashing.

separate-chaining

然后Hashing里还有一个很重要的概念,叫做Load Factor.

首先, HashTable会有两个属性变量,一个是size, 一个是Table Size。 这两个很容易混起来 毕竟都叫做size。

size呢表示Hash Table当前装的东西的数量。 Table Size 为 Hash Table能够装的hashcode的极限容量。不过size是可以大于Table Size的! 因为比如Table Size 101, 可以放101种Hash code. 而我现在要装200个东西进去。 如果Hash function设计的好,应该会让平均每个Hash code bucket能装大概2个东西。


Load Factor 就是 size/TableSize 表示这个Hash Table平均每个Bucket 装多少个东西。 就像刚刚那个例子: 200/101 ≈ 2.  我们可以设置一个mMaxLambda 限制说每个bucket最多只能装几个。

那么Load Factor有什么用?其实,这个都是为了尽量避免collision而设计的。 比如,我们如果不想要任何的collision, 我们设置mMaxLambda = 1. 那么Load Factor 只能够每个bucket装一个东西。 这样不就没有Collision了吗。 

但是你table size 100, 我要放200个,肯定得一个bucket装2个呀,然后你mMaxLambda还不让每个bucket装两个。 那剩下100个怎么办???? 这个时候,HashTable就要resize 自己的大小了。把大小放大一倍。

当然,并不一定要限制每一个bucket 平均装几个。根据具体问题具体实现。一般装个2,3个平均不是太大的问题。在Hash Table里找东西的时候, 先hash到一个bucket的位置,然后顺着bucket里的linkedlist找东西。



Linear-probing: 


Quartic Probing:


HashTable和Binary Search Tree,什么时候用哪个?当你想要根据一个数字范围找东西的时候,用BST比较好,因为BST 结构上来说所有东西都是有一个大小顺序排列的。我们可以用in-order来按顺序拿东西从BST. 但是Hashtable 是没有order的。

Hashtable是怎么做的呢?HashMap maintains an array of bucket, each bucket has a Entry object which stores key-value pair information. And each entry object also has a Next pointer that goes to the same key different value Entry in linkedlist.   Whenever the element count of the hashmap reaches the load factor fraction of capacity, the map is resized and capacity is doubled

To find index of bucket, you hash the object first then mod how many buckets to get the index.


HashTable的小实现:

Constructor 里面初始化table. 一个List的myTable, 每个位置里装一个linkedlist.

比较Tricky的地方就是Table的定义了。如果是ArrayList, 他的type是什么?

ArrayList<?> Table = new ArrayList<?>(); 是一个linkedList. okay。

ArrayList<LinkedList<?>> Table = new ArrayList(LinkedList<?>)

那linkedList又特么是什么类型的?? 这边就要涉及到Genric 的东西了。


这个LinkedList 跟普通的linkedlist不太一样,是一个自定义版本的linkedlist。


Hash是一个超级复杂的topic:

有两种hashCode不用自己做。 Integer and String hashCode().  但是还是看一下他是怎么实现的:

Generic Hash Code:

个人觉得自己做的HashTable有put, containsKey, remove, hash 这几个小功能就可以了。 

由于我已经完全忘记泛型类的具体语法,所以copy paste一个例子作为参考以后:

所以class HashTable<E, V>{..}定义好后, HashTable<Integer, String> table = new HashTable<Integer, String>(); 就可以造一个指定类型的Table了。

我比较不确定的是constructor里放些啥东西,不过感觉弄个自动弄个初始大小就可以了,也不需要弄什么参数进来。

我自己草草的做了一个HashTable, code没怎么优化,有个别function甚至直接没有调用。不过大概的逻辑在,也可以运行。 

几个比较重要的点:hash的时候要mod 一下tableSize,否则hashcode可能会超出table的range。

Table的List初始化的时候是LinkedList<LinkedList<V>> 比如装String。每一个bucket是a list of string。我一开始写一半忘了,只写了LinkedList<V> 找错找半天。 还有就是因为hashcode本身就是int,刚好符合array的index。

还有一个就是ArrayList.size() 取的是实际的数量。 我一开始以为取的是capacity。。 









Heap, Stack, PriorityQueue, Queue.

Stack的结构是 先进后出。[很多用处]


Stack的实现:


Queue: 先进先出。【比如可以用在BFS implementation】

Queue 可能的考法是用Stack来实现一个Queue:

实现的过程要先知道,queue是先进先出的,stack是先进后出,最好脑海里有一个图片的样子到底是个什么意思。

其实很简单, 想一个容器,里面叠一堆书。 Stack的话就是后放进去的先从上面拿出来。

那么我们要让先放进去的出来其实就是把这个容器反扣在另一个容器里。 这样先进stack的书本在反扣中反而会成为后进第二个stack的。





Heap 有min Heap以及max Heap: 

min-heap:

max-heap:


我曾经觉得Heap没什么大不了的,easy concept对吧。 结果面amazon的时候 烙印直接叫我现场写一个Heap...当时直接懵逼。 所以,我算是记住这个东西了,下次再面 什么数据结构都可以忘,但是Heap肯定不能忘。

我当时回答的答案无比的可笑,我说“max Heap就是root永远比children 大的结构”  实际上,不止比children大,比所有subtree都大! 应该准确的说所有node都保持着比sub tree大的属性。Also, 记住!!!It's binary Tree的Structure!

“In a max heap, the keys of parent nodes are always greater than or equal to those of the children and the highest key is in the root node. In a min heap, the keys of parent nodes are less than or equal to those of the children and the lowest key is in the root node.”

Heap的实现其实挺复杂的,比Hash Table复杂很多,涉及到很多Node pointer之间的调整。因为每次insert/delete 一个元素的时候,整个树的结果也许都会发生变化。需要Bubble up/down。

具体来说:

Bubble down:

假设我要插入一个东西到min-heap. 一开始我放在leaf. 但是这个东西如果比parent还小,他得放在更高一点的位置。所以要一个一个check,然后移动上去。所以Heap的插入总是伴随着run time O(logn) = Height的高度

实现Heap有两种方式。 一种是用array的方式。

一种是用Node, Pointer的方式。 但是两种方式都是一个挺庞大的工程。。


PriorityQueue is implemented using Heap。【我觉得PriorityQueue跟Heap就是一个东西。。。只是priority具体是什么 采用到底是max Heap or min Heap 】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容