Interview(6)Priority Queue
Priority Queue
Key and Value => Entry
public interface Entry{
public Object getKey(); //get the key values
public Object setKey(Object k);
public object getValue();
public Object setValue((Object v);
}
public class EntryDefault implements Entry {
protected Object key;
protected Object value;
public EntryDefault(Object k, Object v){
key = k; value = v;
}
public Object getKey() { return key; }
public Object setKey(Object k) {
Object oldK = key;
key = k;
return oldK;
}
public Object getValue() { return value; }
public Object setValue(Object v) {
Object oldV = value; value= v; return oldV;
}
}
Comparator Interface and Implementation
public interface Comparator {
public int compare(Object a, Object b);
}
compare method will return positive, 0 or negative.
Priority Queue Interface
public interface PriorityQueue {
public int getSize();
public boolean isEmpty();
public Entry getMin() throws ExceptionPriorityQueueEmpty;
public Entry insert(Object key, Object obj) throw ExceptionKeyInvalid;
public Entry delMin() throws ExceptionPriorityQueueEmpty;
}
Implementation on top Un Sorted List
public class PriorityQueueUnsortedList implements PriorityQueue {
private List list;
private Comparator comparator;
public PriorityQueuUnsortedList(){
this(new ComparatorDefault(), null);
}
public PriorityQueueUnsortedList(Comparator comparor){ this(c, null); }
public PriorityQueueUnsortedList(Sequeue s){ this(new ComparatorDefault(), s); }
public PriorityQueueUnsortedList(Comparator comparator, Sequence sequence){
list = new ListDLNode();
comparator = comparator;
if(null != sequence){
while(!s.isEmpty()){
Entry e = (Entry)s.removeFirst();
insert(e.getKey, e.getValue());
}
}
}
public int getSize() { return list.getSize();}
public boolean isEmpty(){ return list.isEmpty(); }
public Entry getMin() throws ExceptionPriorityQueueEmpty {
if(list.isEmtpy()){
throw new ExceptionPriorityQueueEmpty(“Error, queue is empty”);
}
Position minPos = list.first();
Position curPos = list.getNext(minPos);
while(null != curPos){
if(0 < comparator.compare(minPos.getElem(), curPos.getElem())){
minPos = curPos; //find the min one
}
}
return (Entry) minPos.getElem();
}
public Entry insert(Object key, Object obj) throws ExceptionKeyInvalid {
Entry entry = new EntryDefault(key, obj);
list.insertLast(entry); //put the element at the tail
return (entry);
}
public Entry delMin() throws ExceptionPriorityQueueEmpty {
if(list.isEmepty()){
throw new ExceptionPriorityQueueEmpty(“Error”);
}
Position minPos = list.first();
Iterator it = list.pistions();
while(it.hasNext()){
Position curPos = (Position) (it.getNext());
if( < comprator.compare(
(Entry)(minPos.getElement()).getKey(),
(Entry)(curPos.getElement()).getKey()
)){
minPos = curPos;
}
}
return (Entry)list.remove(minPos);
}
}
It is easy to insert, but it is O(n) to getMin() or delMin()
Implementation on top of Sorted List
public class PriorityQueueSortedList implements PriorityQueue {
private List list;
private Comparator comparator;
public PriorityQueueSortedList(){ this(new ComparatorDefault(), null); }
public PriorityQueueSortedList(Comparator c){ this(c, null); }
public PriorityQueueSortedList(Sequence s){ this(new ComparatorDefault(), s); }
public PriorityQueueSortedList(Comparator comparator, Sequence sequence){
list = new ListDLNode();
comparator = comparator;
if( null != s){
while( !s.isEmpty()) {
Entry e = (Entry) s. removeFirst();
insert(e.getKey(), e.getValue());
}
}
}
public int getSize() { return list.getSize(); }
public boolean isEmpty() { return list.isEmpty(); }
public Entry getMin() throws ExceptionPriorityQueueEmpty {
if(list.isEmpty()){
throw new ExceptionPriorityQueueEmpty(“Error");
}
return (Entry) list.last();
}
public Entry insert(Object key, Object obj) throws ExceptionKeyInvalid {
Entry entry = new EntryDefault(key, obj);
if(list.isEmpty() || (0 > comparator.compare((Entry) (list.first().getElem())).getKey(), entry.getKey()) ){
list.insertFirst(entry); //list is empty or current is largest
}else{
Position curPos = list.last();
while( 0 > comparator.compare((Entry) (curPos.getElem())).getKey(), entry.getKey()){
curPos = list.getPrev(curPos); //move to previous items, find the one bigger than current
}
list.insertAfter(curPos, entry);
}
return (entry);
}
public Entry delMin() throws ExceptionPriorityQueueEmpty {
if(list.isEmpty()){
throw new ExceptionPriorityQueueEmpty(“Error");
}
return (Entry) list.remove(list.last());
}
}
Heap
Heap Structure - Page 173
Binary Tree - Heap - Big Top - Small Top
public class PriorityQueueHeap implements PriorityQueue {
private CompleteBinTree h;
private Comparator comp;
public PriorityQueueHeap(){ this(new ComparatorDefault(), null); }
public PriorityQueueHeap(Comparator c){ this(c, null); }
public PriorityQueueHeap(Sequence s){ this(new ComparatorDefault(), s); }
public PriorityQueueHeap(Comparator c, Sequence s){
comp = c;
h = new CompleteBinTree_Vector(s);
if( !h.isEmpty()){
for(int i = h.getSize()/2-1; i>=0; i—){
precolateDown(h.posOfNode(i));
}
}
}
public int getSize() { return h.getSize(); }
public boolean isEmpty() { return h.isEmpty(); }
public Entry getMin() throws ExceptionPriorityQueueEmpty {
if(isEmpty()) { throw new ExceptionPriorityQueueEmpty(“Error"); }
return (Entry) h.getRoot().getElem();
}
public Entry insert(Object key, Object obj) throws ExceptionKeyInvalid {
checkKey(key);
Entry entry = new EntryDefault(key, obj);
percolateUp(h.addlast(entry);
return entry;
}
public Entry delMin() throws ExceptionPriorityQueueEmpty {
if(isEmpty()) { throw new ExceptionPriorityQueueEmpty(“Error”); }
Entry min = (Entry) h.getRoot().getElem();
if ( 1 == getSize()) {
//if it is last item
h.delLast();
}else{
h.getRoot().setElem((ComleBinaryTreeNodeRank)h.delLast().getElme()); //find the last one and place in root
percolateDown(h.getRoot());
}
return min;
}
protected void checkKey(Object key) throws ExceptionKeyInvalid {
try {
comp.compare(key, key);
}catch(Exception e){ throw new ExceptionKeyInvalid(); }
}
protected Object key(BinTreePosition v){ return ((Entry) (v.getElem())).getKey(); }
protected void swapParentChild(BinTreePosition u, BinTreePosition v){
Object temp = u.getElem();
u.setElem(v.getElem);
v.setElem(temp);
}
protected void percolateUp(BinTreePosition v){
BinTreePosition root = h.getRoot(); //find the root node
while( v != h.getRoot()){
BinTreePosition p = v.getParent(); //get the parent node for current node
if( 0 >= comp.compare(key(p), key(v))) { break; }
swapParentChild(p, v); //swap parent and child to move the current node
v = p;
}
}
protected void precolateDown(BinTreePosition v){
while (v.hasLChild()){
BinTreePosition smallerChild = v.getLChild(); //left child is smaller
if( v.hasRChild() && 0 < comp.compare(key(v.getLChild()), key(v.getRChild()){
smallerChild = v.getRChild(); //compare right child
}
if( 0 <= comp.compare(key(smallerChild), key(v) ){ break; }
swapParentChild(v, smallerChild);
v = smallerChild;
}
}
}
References:
Interview(6)Priority Queue
猜你喜欢
转载自sillycat.iteye.com/blog/2384555
今日推荐
周排行