栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PriorityQueue /堆更新

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PriorityQueue /堆更新

您可能需要自己实现这样的堆。您需要对项目在堆中的位置有一些处理,并需要有一些方法可以在优先级发生变化时向上或向下推项目。

几年前,我在学校工作中写了这么一堆书。向上或向下推动项目是O(log
N)操作。我将以下代码作为公共领域发布,因此您可以随意使用它。(您可能需要改进此类,以便代替抽象的isGreaterOrEqual方法,排序顺序将依赖于Java的Comparator和Comparable接口,并使该类使用泛型。)

import java.util.*;public abstract class Heap {    private List heap;    public Heap() {        heap = new ArrayList();    }    public void push(Object obj) {        heap.add(obj);        pushUp(heap.size()-1);    }    public Object pop() {        if (heap.size() > 0) { swap(0, heap.size()-1); Object result = heap.remove(heap.size()-1); pushDown(0); return result;        } else { return null;        }    }    public Object getFirst() {        return heap.get(0);    }    public Object get(int index) {        return heap.get(index);    }    public int size() {        return heap.size();    }    protected abstract boolean isGreaterOrEqual(int first, int last);    protected int parent(int i) {        return (i - 1) / 2;    }    protected int left(int i) {        return 2 * i + 1;    }    protected int right(int i) {        return 2 * i + 2;    }    protected void swap(int i, int j) {        Object tmp = heap.get(i);        heap.set(i, heap.get(j));        heap.set(j, tmp);    }    public void pushDown(int i) {        int left = left(i);        int right = right(i);        int largest = i;        if (left < heap.size() && !isGreaterOrEqual(largest, left)) { largest = left;        }        if (right < heap.size() && !isGreaterOrEqual(largest, right)) { largest = right;        }        if (largest != i) { swap(largest, i); pushDown(largest);        }    }    public void pushUp(int i) {        while (i > 0 && !isGreaterOrEqual(parent(i), i)) { swap(parent(i), i); i = parent(i);        }    }    public String toString() {        StringBuffer s = new StringBuffer("Heap:n");        int rowStart = 0;        int rowSize = 1;        for (int i = 0; i < heap.size(); i++) { if (i == rowStart+rowSize) {     s.append('n');     rowStart = i;     rowSize *= 2; } s.append(get(i)); s.append(" ");        }        return s.toString();    }    public static void main(String[] args){        Heap h = new Heap() { protected boolean isGreaterOrEqual(int first, int last) {     return ((Integer)get(first)).intValue() >= ((Integer)get(last)).intValue(); }        };        for (int i = 0; i < 100; i++) { h.push(new Integer((int)(100 * Math.random())));        }        System.out.println(h+"n");        while (h.size() > 0) { System.out.println(h.pop());        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483396.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号