parent
2b53821899
commit
3a2d60fc45
@ -0,0 +1,10 @@
|
|||||||
|
package leo.class04;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Leo
|
||||||
|
* @ClassName EveryStepShowBoss
|
||||||
|
* @DATE 2020/11/30 7:33 下午
|
||||||
|
* @Description
|
||||||
|
*/
|
||||||
|
public class EveryStepShowBoss {
|
||||||
|
}
|
||||||
@ -0,0 +1,159 @@
|
|||||||
|
package leo.class04;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Leo
|
||||||
|
* @ClassName HeapGreater
|
||||||
|
* @DATE 2020/11/30 5:21 下午
|
||||||
|
* @Description 加强堆
|
||||||
|
* 1 反向索引
|
||||||
|
* 2 比较器
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class HeapGreater<T> {
|
||||||
|
|
||||||
|
//堆容器
|
||||||
|
private ArrayList<T> heap ;
|
||||||
|
//反向索引
|
||||||
|
private HashMap<T, Integer> indexMap;
|
||||||
|
//堆大小
|
||||||
|
private int heapSize;
|
||||||
|
//堆比较器
|
||||||
|
private final Comparator<? super T> com;
|
||||||
|
|
||||||
|
public HeapGreater(Comparator com) {
|
||||||
|
this.com = com;
|
||||||
|
heap = new ArrayList<T>();
|
||||||
|
this.indexMap = new HashMap<>();
|
||||||
|
this.heapSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//push
|
||||||
|
public void push(T value) {
|
||||||
|
this.heap.add(value);
|
||||||
|
this.indexMap.put(value, heapSize);
|
||||||
|
this.heapInsert(heapSize++);
|
||||||
|
}
|
||||||
|
|
||||||
|
//peek
|
||||||
|
public T peek() {
|
||||||
|
return this.heap.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//pop
|
||||||
|
public T pop() {
|
||||||
|
if (heapSize == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
T value = this.heap.get(0);
|
||||||
|
this.swap(0, heapSize - 1);
|
||||||
|
this.indexMap.remove(value);
|
||||||
|
this.heap.remove(--heapSize);
|
||||||
|
this.heapify(0);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove
|
||||||
|
public void remove(T obj) {
|
||||||
|
T t = this.heap.get(this.heapSize - 1);
|
||||||
|
int objIndex = this.indexMap.get(obj);
|
||||||
|
this.indexMap.remove(obj);
|
||||||
|
this.heap.remove(--this.heapSize);
|
||||||
|
if (obj != t) {
|
||||||
|
this.heap.set(objIndex, t);
|
||||||
|
this.indexMap.put(t, objIndex);
|
||||||
|
this.resign(objIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//resign
|
||||||
|
private void resign(int i) {
|
||||||
|
this.heapify(i);
|
||||||
|
this.heapInsert(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
//getAllElements
|
||||||
|
public List<T> getAllElements() {
|
||||||
|
List<T> res = new ArrayList<>();
|
||||||
|
for (T t : this.heap) {
|
||||||
|
res.add(t);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//heapInsert 向上调整
|
||||||
|
private void heapInsert(int i) {
|
||||||
|
while (this.com.compare(this.heap.get(i), this.heap.get((i - 1) / 2)) < 0) {
|
||||||
|
swap(i, (i - 1) / 2);
|
||||||
|
i = (i - 1) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//heapify 向下调整
|
||||||
|
private void heapify(int i) {
|
||||||
|
int left = i << 1 | 1;
|
||||||
|
while (left < this.heapSize) {
|
||||||
|
int largest = left + 1 < this.heapSize && com.compare(heap.get(left + 1), heap.get(left)) < 0 ? left + 1 : left;
|
||||||
|
largest = com.compare(heap.get(largest), heap.get(i)) < 0 ? largest : i;
|
||||||
|
if (largest == i) {
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
this.swap(i, largest);
|
||||||
|
i = largest;
|
||||||
|
left = i << 1 | 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//swap
|
||||||
|
private void swap(int i, int j) {
|
||||||
|
T t = this.heap.get(i);
|
||||||
|
T t1 = this.heap.get(j);
|
||||||
|
this.heap.set(i, t1);
|
||||||
|
this.heap.set(j, t);
|
||||||
|
indexMap.put(t1, i);
|
||||||
|
indexMap.put(t, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
//size
|
||||||
|
public int getSize() {
|
||||||
|
return this.heapSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
//isEmpty
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return this.heapSize == 0;
|
||||||
|
}
|
||||||
|
//contains
|
||||||
|
public boolean contains(T obj) {
|
||||||
|
return this.indexMap.containsKey(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in new issue