标签:
1.构造原理:权值小的节点应该处于树的下面,他们必是作为孩子,因此选择权值小的节点作为子节点自底向上构造树。根据二叉树的特点,两个节点合并后对于剩下来说他们相当于一个节点而已,所以计算权值和把其当作一个新的节点放到未构造的节点集中。不断构造合并,最后便会使kmp最小
import java.util.ArrayList;
import java.util.List;
/**
* Created by 刘逗逼 on 2016/3/11.
*/
public class MaxHeap<T extends Comparable<T>> {
private List<T> head;
public MaxHeap(){
this.head=new ArrayList<T>();
}
protected void filterup(int start){ //向上调整,用于插入
int child=start;
int parent=(child-1)/2; //因为数组下标从0开始
T tmp=head.get(child);
while(true){
int cmp=head.get(parent).compareTo(tmp);
if(cmp>0){
break;
}else { //换位
head.set(child,head.get(parent));
child=parent;
parent=(parent-1)/2;
}
}
head.set(child,tmp);
}
protected void filterdown(int start,int end){ //end是判断是否出界的
int parent=start;
int left=2*parent+1;
T tmp=head.get(parent);
while(left<=end){
int cmp=head.get(left).compareTo(head.get(left+1));
if(cmp<0)left=+1;
head.set(parent,head.get(left));
cmp=head.get(parent).compareTo(head.get(left));
if(cmp>0){
break;
}else {
head.set(parent,head.get(left));
parent=left;
left=left*2+1;
}
}
head.set(parent,tmp);
}
/*
* 删除最大堆中的data
*
* 返回值:
* 0,成功
* -1,失败
*/
protected int remove(T data){
if(head.isEmpty()){
return -1;
}
int index=head.indexOf(data);
if(index==-1)return -1;
int size=head.size();
head.set(index,head.get(size-1));
head.remove(size-1);
if(head.size()>1){
filterdown(index,head.size()-1);
}
return 0;
}
protected void insert(T data){
head.add(data);
filterup(head.size()-1);
}
@Override
public String toString(){
StringBuilder stringBuilder=new StringBuilder();
for(int i=0;i<head.size();i++){
stringBuilder.append(head.get(i)+" ");
}
return stringBuilder.toString();
}
public static void main(String[] args){
int i;
int a[]={10,40,30,60,90,70,20,50,80};
MaxHeap<Integer> tree=new MaxHeap();
System.out.println("== 依次添加: ");
for( i=0;i<a.length;i++){
System.out.print(a[i]+" ");
tree.head.add(a[i]);
}
System.out.println("");
System.out.println("==添加最大堆 "+tree.toString());
i=85;
tree.insert(i);
System.out.println("==添加元素: "+i);
System.out.println("==最大堆 "+tree.toString());
i=90;
tree.remove(i);
System.out.println("==删除元素: "+i);
System.out.println("==最大堆 "+tree.toString());
}
}
标签:
原文地址:http://www.cnblogs.com/liuzhugu/p/5267272.html