Skip to content

Commit 287c8ab

Browse files
author
deleiguo
committed
updat algorithm
1 parent f0225ae commit 287c8ab

File tree

8 files changed

+351
-12
lines changed

8 files changed

+351
-12
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package cn.delei.algorithm.lru;
2+
3+
import java.util.HashMap;
4+
import java.util.LinkedList;
5+
import java.util.Map;
6+
7+
/**
8+
* LRU实现:LinkedList+HashMap
9+
*
10+
* @param <K> 键
11+
* @param <V> 键值
12+
* @author deleiguo
13+
*/
14+
public class LRUCache<K, V> {
15+
int capacity;
16+
Map<K, V> map;
17+
LinkedList<K> list;
18+
19+
public LRUCache(int capacity) {
20+
this.capacity = capacity;
21+
this.map = new HashMap<>();
22+
this.list = new LinkedList<>();
23+
}
24+
25+
/**
26+
* 添加元素
27+
* 1.元素存在,放到队尾
28+
* 2.不存在,判断链表是否满。
29+
* 如果满,则删除队首元素,放入队尾元素,删除更新哈希表
30+
* 如果不满,放入队尾元素,更新哈希表
31+
*/
32+
public void put(K key, V value) {
33+
V v = map.get(key);
34+
if (v != null) {
35+
list.remove(key);
36+
list.addLast(key);
37+
map.put(key, value);
38+
return;
39+
}
40+
41+
//队列未满,添加到尾部
42+
if (list.size() < capacity) {
43+
list.addLast(key);
44+
map.put(key, value);
45+
} else {
46+
//队列已满,移除队首
47+
K firstKey = list.removeFirst();
48+
map.remove(firstKey);
49+
list.addLast(key);
50+
map.put(key, value);
51+
}
52+
}
53+
54+
/**
55+
* 访问元素
56+
* 元素存在,放到队尾
57+
*/
58+
public V get(K key) {
59+
V v = map.get(key);
60+
if (v != null) {
61+
list.remove(key);
62+
list.addLast(key);
63+
return v;
64+
}
65+
return null;
66+
}
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package cn.delei.algorithm.lru;
2+
3+
import java.util.LinkedHashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* LRU实现:LinkedHashMap
8+
*
9+
* @param <K> 键
10+
* @param <V> 键值
11+
* @author deleiguo
12+
*/
13+
public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {
14+
private static final long serialVersionUID = -3788497546136920185L;
15+
16+
/**
17+
* 容量
18+
*/
19+
private final int capacity;
20+
21+
LRULinkedHashMap(int capacity) {
22+
// 初始大小,0.75是装载因子,true是表示按照访问时间排序,最近访问的放在头部,最老访问的放在尾部
23+
super(capacity, 0.75f, true);
24+
// 指定最大容量
25+
this.capacity = capacity;
26+
}
27+
28+
/**
29+
* 核心实现
30+
*/
31+
@Override
32+
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
33+
// 如果map里面的元素个数大于了缓存最大容量,则删除链表的顶端元素,即最老的数据
34+
return size() > capacity;
35+
}
36+
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package cn.delei.algorithm.lru;
2+
3+
import java.util.concurrent.locks.Lock;
4+
import java.util.concurrent.locks.ReentrantLock;
5+
6+
/**
7+
* 带有 Lock 操作
8+
*
9+
* @param <K> 键
10+
* @param <V> 键值
11+
* @author deleiguo
12+
*/
13+
public class LRULinkedHashMapWithLock<K, V> extends LRULinkedHashMap<K, V> {
14+
private static final long serialVersionUID = -480172344142509767L;
15+
16+
private final Lock lock = new ReentrantLock();
17+
18+
LRULinkedHashMapWithLock(int capacity) {
19+
super(capacity);
20+
}
21+
22+
@Override
23+
public boolean containsValue(Object value) {
24+
lock.lock();
25+
try {
26+
return super.containsValue(value);
27+
} finally {
28+
lock.unlock();
29+
}
30+
}
31+
32+
@Override
33+
public V get(Object key) {
34+
lock.lock();
35+
try {
36+
return super.get(key);
37+
} finally {
38+
lock.unlock();
39+
}
40+
}
41+
42+
@Override
43+
public V put(K key, V value) {
44+
lock.lock();
45+
try {
46+
return super.put(key, value);
47+
} finally {
48+
lock.unlock();
49+
}
50+
}
51+
52+
@Override
53+
public int size() {
54+
lock.lock();
55+
try {
56+
return super.size();
57+
} finally {
58+
lock.unlock();
59+
}
60+
}
61+
62+
@Override
63+
public void clear() {
64+
lock.lock();
65+
try {
66+
super.clear();
67+
} finally {
68+
lock.unlock();
69+
}
70+
}
71+
72+
@Override
73+
public boolean containsKey(Object key) {
74+
lock.lock();
75+
try {
76+
return super.containsKey(key);
77+
} finally {
78+
lock.unlock();
79+
}
80+
}
81+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cn.delei.algorithm.lru;
2+
3+
/**
4+
* LRU 测试
5+
*/
6+
public class LRUTest {
7+
8+
public static void main(String[] args) {
9+
linkedHashMapTest();
10+
}
11+
12+
private static void linkedHashMapTest() {
13+
LRULinkedHashMap<Integer, String> lru = new LRULinkedHashMap<>(5);
14+
for (int i = 0; i < 10; i++) {
15+
lru.put(i, i + "i");
16+
}
17+
System.out.println(lru.toString());
18+
}
19+
}

source/java/interview/delei-interview-algorithm/src/main/java/cn/delei/algorithm/sort/BubbleSort.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package cn.delei.algorithm.sort;
22

3+
import cn.delei.algorithm.SwapNumber;
4+
35
import java.util.Arrays;
46

57
/**
@@ -18,9 +20,7 @@ public int[] sort(int[] data) {
1820
flag = true;
1921
for (int j = 0; j < arr.length - i; j++) {
2022
if (arr[j] > arr[j + 1]) {
21-
int tmp = arr[j];
22-
arr[j] = arr[j + 1];
23-
arr[j + 1] = tmp;
23+
SwapNumber.swapByTemp(arr, j, j + 1);
2424
flag = false;
2525
}
2626
}

source/java/interview/delei-interview-algorithm/src/main/java/cn/delei/algorithm/sort/InsertSort.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,30 @@
1010
public class InsertSort implements IArraySort {
1111
@Override
1212
public int[] sort(int[] data) {
13+
if (data.length < 2) {
14+
return data;
15+
}
1316
// 对 arr 进行拷贝,不改变参数内容
1417
int[] arr = Arrays.copyOf(data, data.length);
1518
// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
1619
int temp, j;
20+
// i从1开始
1721
for (int i = 1; i < arr.length; i++) {
1822
// 记录要插入的数据
1923
temp = arr[i];
2024
// 从已经排序的序列最右边的开始比较,找到比其小的数
21-
j = i;
22-
while (j > 0 && temp < arr[j - 1]) {
23-
arr[j] = arr[j - 1];
24-
j--;
25-
}
26-
// 存在比其小的数,插入
27-
if (j != i) {
28-
arr[j] = temp;
25+
j = i - 1;
26+
// 查找插入的位置
27+
for (; j >= 0; --j) {
28+
if (arr[j] > temp) {
29+
// 数据移动
30+
arr[j + 1] = arr[j];
31+
} else {
32+
break;
33+
}
2934
}
35+
// 插入数据
36+
arr[j + 1] = temp;
3037
}
3138
return arr;
3239
}

source/java/interview/delei-interview-algorithm/src/main/java/cn/delei/algorithm/sort/SelectionSort.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class SelectionSort implements IArraySort {
1414
public int[] sort(int[] data) {
1515
int[] arr = Arrays.copyOf(data, data.length);
1616
// 总共要经过 N-1 轮比较
17-
int min, temp;
17+
int min;
1818
for (int i = 0; i < arr.length - 1; i++) {
1919
min = i;
2020
// 每轮需要比较的次数 N-i

0 commit comments

Comments
 (0)