算法之美&数据结构与算法复习

 1.归并两个有序链表(归并排序)

2.最小路径和--BP解法

3.计算int sqrt(x)--二分解法

4.趣味面试题

 5.跳步游戏(Jump_Game)--后向回溯算法

6.Excel列号转十进制--碾转相除法

7.零点根问题--牛顿迭代算法(同问题3)

8.众数--众数投票算法(Boyer-Moore Algorithm)
9.康威生命游戏--解法(位运算)

10.蓄水池抽样--蓄水池(Reservoir_sampling)抽样算法简记

11.数根问题 

12.杨辉三角 -- 组合数

13.SingleNumber -- 位运算保留不同的元素

14.矩阵查找(Search_a_2D_Matrix_II)--二分查找

15.荷兰国旗(Sort_Colors)--快速排序

16.找出出现一次的数(SingleNumber_II/SingleNumber_lll)--位运算

17.无遮盖的区段(Non_overlapping_Intervals)--贪心算法

18.根据身高构建队列(Queue_Reconstruction_by_Height)--贪心算法

19.英文提取词干(Replace_Words)--Trie树

20.构造一个Trie树(Trie)--Trie树

21.最小高度树(Minimum_Height_Trees)--图

按算法和数据结构归类:

排序与查找:1.归并两个有序链表(归并排序)  14.矩阵查找(Search_a_2D_Matrix_II)--二分查找      15.荷兰国旗(Sort_Colors)--快速排序

位运算:6.Excel列号转十进制--碾转相除法   9.康威生命游戏--解法(位运算)  13.SingleNumber -- 位运算保留不同的元素  16.找出出现一次的数(SingleNumber_II/SingleNumber_lll)--位运算

贪心算法:4.趣味面试题    17.无遮盖的区段(Non_overlapping_Intervals)--贪心算法    18.根据身高构建队列(Queue_Reconstruction_by_Height)--贪心算法

并查集:

字典树:19.英文提取词干(Replace_Words)--Trie树    20.构造一个Trie树(Trie)--Trie树

图:21.最小高度树(Minimum_Height_Trees)--图

JAVA中HashMap实现:

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

 1 /**
 2 * The table, resized as necessary. Length MUST Always be a power of two.
 3  */
 4 transient Entry[] table;
 5  
 6 static class Entry<K,V> implements Map.Entry<K,V> {
 7     final K key;
 8     V value;
 9     Entry<K,V> next;
10     final int hash;
11     ……
12 }

 

HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,
也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

HashMap的put方法:

 1 static int hash(int h) {
 2     h ^= (h >>> 20) ^ (h >>> 12);
 3     return h ^ (h >>> 7) ^ (h >>> 4);  
 4 }
 5 
 6 static int indexFor(int h, int length) {  
 7     return h & (length-1);
 8 }
 9 
10 public V put(K key, V value) {
11     // HashMap允许存放null键和null值。
12     // 当key为null时,调用putForNullKey方法,将value放置在数组第一个位置。  
13     if (key == null)
14         return putForNullKey(value);
15     // 根据key的keyCode重新计算hash值。
16     int hash = hash(key.hashCode());
17     // 搜索指定hash值在对应table中的索引。
18     int i = indexFor(hash, table.length);
19     // 如果 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元素的下一个元素。
20     for (Entry<K,V> e = table[i]; e != null; e = e.next) {
21         Object k;
22         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
23             V oldValue = e.value;
24             e.value = value;
25             e.recordAccess(this);
26             return oldValue;
27         }
28     }
29     // 如果i索引处的Entry为null,表明此处还没有Entry。
30     modCount++;
31     // 将key、value添加到i索引处。
32     addEntry(hash, key, value, i);
33     return null;
34 }
View Code

HashMap的get方法:

 1 public V get(Object key) {
 2     if (key == null)
 3         return getForNullKey();
 4     int hash = hash(key.hashCode());
 5     for (Entry<K,V> e = table[indexFor(hash, table.length)];
 6         e != null;
 7         e = e.next) {
 8         Object k;
 9         if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  
10             return e.value;
11     }
12     return null;
13 }
View Code

 

posted @ 2017-10-06 16:54  混沌战神阿瑞斯  阅读(432)  评论(2编辑  收藏  举报