很高效的用于调度的最小堆
来源:互联网 发布:能打开db数据库的软件 编辑:程序博客网 时间:2024/06/06 21:42
摘自于Hadoop大量文件调度合并
public abstract class PriorityQueue<T> { private T[] heap; private int size; private int maxSize; protected abstract boolean lessThan(Object a, Object b); @SuppressWarnings("unchecked") protected final void initialize(int maxSize) { size = 0; int heapSize = maxSize + 1; heap = (T[]) new Object[heapSize]; this.maxSize = maxSize; } public final void put(T element) { size++; heap[size] = element; upHeap(); } /** * @param element * @return */ public boolean insert(T element) { if (size < maxSize) { put(element); return true; } else if (size > 0 && !lessThan(element, top())) { heap[1] = element; adjustTop(); return true; } else return false; } /** * @return */ public final T top() { if (size > 0) return heap[1]; else return null; } public final T pop() { if (size > 0) { T result = heap[1]; heap[1] = heap[size]; heap[size] = null; size--; downHeap(); return result; } else return null; } public final void adjustTop() { downHeap(); } public final int size() { return size; } public final void clear() { for (int i = 0; i <= size; i++) heap[i] = null; size = 0; } private final void upHeap() { int i = size; T node = heap[i]; int j = i >>> 1; while (j > 0 && lessThan(node, heap[j])) { heap[i] = heap[j]; i = j; j = j >>> 1; } heap[i] = node; } private final void downHeap() { int i = 1; T node = heap[i]; int j = i << 1; int k = j + 1; if (k <= size && lessThan(heap[k], heap[j])) { j = k; } while (j <= size && lessThan(heap[j], node)) { heap[i] = heap[j]; i = j; j = i << 1; k = j + 1; if (k <= size && lessThan(heap[k], heap[j])) { j = k; } } heap[i] = node; } /** * Test * * @param args */ public static void main(String[] args) { int max = 10000000; long s = System.currentTimeMillis(); Random r = new Random(); System.out.println("---------- 有序数据结构比较 ----------"); //最小堆 PriorityQueue<Integer> queue = new PriorityQueue<Integer>() { @Override protected synchronized boolean lessThan(Object a, Object b) { Integer a1 = (Integer) a; Integer a2 = (Integer) b; return a1 > a2; } }; queue.initialize(max); for (int i = 0; i < max; i++) { queue.insert(r.nextInt()); } while (queue.size() > 0) { queue.pop(); } System.out.println("最小堆性能:" + (System.currentTimeMillis() - s) + "ms"); s = System.currentTimeMillis(); List<Integer> list = new ArrayList<Integer>(max); for (int i = 0; i < max; i++) { list.add(r.nextInt()); } Collections.sort(list); System.out.println("归并性能:" + (System.currentTimeMillis() - s) + "ms"); s = System.currentTimeMillis(); ConcurrentSkipListSet<Integer> skiptable = new ConcurrentSkipListSet<Integer>(); for (int i = 0; i < max; i++) { skiptable.add(r.nextInt()); } System.out.println("跳跃表性能:" + (System.currentTimeMillis() - s) + "ms"); s = System.currentTimeMillis(); TreeSet<Integer> rbt = new TreeSet<Integer>() { @Override public synchronized boolean add(Integer integer) { return super.add(integer); } }; for (int i = 0; i < max; i++) { rbt.add(r.nextInt()); } System.out.println("红黑树性能:" + (System.currentTimeMillis() - s) + "ms"); }}
0 0
- 很高效的用于调度的最小堆
- 用于堆检测的宏
- 最小堆的实现
- 最小堆的实现
- 最小堆的实现
- 最小堆的建立
- 最小堆的插入
- 最小堆的删除
- 最小堆的建立
- 最小堆及基于最小堆的最小优先队列
- 最小堆&&最大堆的实现(c++)
- 最小堆&&最大堆的实现(c++)
- 最小堆与最大堆的实现
- 最小堆&&最大堆的实现(c++)
- 最大堆与最小堆的实现
- 最小堆最大堆的详细解读
- 最小堆最大堆的详细解读
- 最大堆最小堆的建立
- [CAQ2]使用getRunningServices判断服务是否运行不好用
- 学堂在线C++进阶 编程题 10-2
- Razor模板引擎
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 5分钟了解Mockito
- 很高效的用于调度的最小堆
- leetcode 47 : Permutations II
- Climbing Stairs
- 关于一个表单form包含多个提交动作submit的解决方法
- netbeans出现apache-maven-3.3.3\bin\mvn.bat"' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- TreeView模糊查询
- c++空类实例大小不是0原因
- 在WPF中使用AForge.net控制摄像头拍照
- Manifest格式错误