2 |
26 Feb 07 |
jari |
1 |
/* |
2 |
26 Feb 07 |
jari |
Copyright @ 1999-2005, The Institute for Genomic Research (TIGR). |
2 |
26 Feb 07 |
jari |
All rights reserved. |
2 |
26 Feb 07 |
jari |
4 |
*/ |
2 |
26 Feb 07 |
jari |
5 |
/* |
2 |
26 Feb 07 |
jari |
* $RCSfile: Heap.java,v $ |
2 |
26 Feb 07 |
jari |
* $Revision: 1.3 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2005/03/10 15:40:35 $ |
2 |
26 Feb 07 |
jari |
* $Author: braistedj $ |
2 |
26 Feb 07 |
jari |
* $State: Exp $ |
2 |
26 Feb 07 |
jari |
11 |
*/ |
2 |
26 Feb 07 |
jari |
12 |
package org.tigr.microarray.mev.motif; |
2 |
26 Feb 07 |
jari |
13 |
|
2 |
26 Feb 07 |
jari |
14 |
public class Heap { |
2 |
26 Feb 07 |
jari |
15 |
int N; /* max number of items in heap */ |
2 |
26 Feb 07 |
jari |
16 |
int n; /* number of items in heap */ |
2 |
26 Feb 07 |
jari |
17 |
int d; /* base of heap */ |
2 |
26 Feb 07 |
jari |
18 |
int[] h; /* {h[1],...,h[n]} is set of items */ |
2 |
26 Feb 07 |
jari |
19 |
int[] pos; /* pos[i] gives position of i in h */ |
2 |
26 Feb 07 |
jari |
20 |
int[] kvec; /* kvec[i] is key of item i */ |
2 |
26 Feb 07 |
jari |
21 |
|
2 |
26 Feb 07 |
jari |
22 |
Heap(int N,int D) { |
2 |
26 Feb 07 |
jari |
23 |
this.N = N; |
2 |
26 Feb 07 |
jari |
24 |
d = D; |
2 |
26 Feb 07 |
jari |
25 |
n = 0; |
2 |
26 Feb 07 |
jari |
26 |
h = new int[N]; |
2 |
26 Feb 07 |
jari |
27 |
pos = new int[N]; |
2 |
26 Feb 07 |
jari |
28 |
kvec=new int[N]; |
2 |
26 Feb 07 |
jari |
29 |
for (int i=0; i<N; i++) pos[i] = 0; |
2 |
26 Feb 07 |
jari |
30 |
} |
2 |
26 Feb 07 |
jari |
/* insert item i with specified key */ |
2 |
26 Feb 07 |
jari |
32 |
public void insrtHeap(int i,double k) { |
2 |
26 Feb 07 |
jari |
33 |
if (i<0) System.out.println("fatal! item to insert is < 0"); |
2 |
26 Feb 07 |
jari |
34 |
if (pos[i]!=-1) rmHeap(i); |
2 |
26 Feb 07 |
jari |
35 |
kvec[i] = (int)k; |
2 |
26 Feb 07 |
jari |
36 |
n++; |
2 |
26 Feb 07 |
jari |
37 |
siftupHeap(i,(int)n); |
2 |
26 Feb 07 |
jari |
38 |
} |
2 |
26 Feb 07 |
jari |
39 |
|
2 |
26 Feb 07 |
jari |
/* Remove item i from heap. */ |
2 |
26 Feb 07 |
jari |
41 |
int rmHeap(int i) { |
2 |
26 Feb 07 |
jari |
42 |
int j; |
2 |
26 Feb 07 |
jari |
43 |
if (pos[i]==-1) return -1; |
2 |
26 Feb 07 |
jari |
44 |
j = h[(int)n--]; |
2 |
26 Feb 07 |
jari |
45 |
if (i != j && kvec[(int)j] <= kvec[i]) siftupHeap((int)j,(int)pos[i]); |
2 |
26 Feb 07 |
jari |
46 |
else if (i != j && kvec[(int)j]>kvec[i]) siftdownHeap((int)j,(int)pos[(int)i]); |
2 |
26 Feb 07 |
jari |
47 |
pos[i] = -1; |
2 |
26 Feb 07 |
jari |
48 |
return i; |
2 |
26 Feb 07 |
jari |
49 |
} |
2 |
26 Feb 07 |
jari |
50 |
|
2 |
26 Feb 07 |
jari |
/* delete and return item with smallest key */ |
2 |
26 Feb 07 |
jari |
52 |
public int delminHeap() { |
2 |
26 Feb 07 |
jari |
53 |
int i; |
2 |
26 Feb 07 |
jari |
54 |
if (n == 0) return 0; |
2 |
26 Feb 07 |
jari |
55 |
i = h[0]; |
2 |
26 Feb 07 |
jari |
56 |
rmHeap((int)h[0]); |
2 |
26 Feb 07 |
jari |
57 |
return i; |
2 |
26 Feb 07 |
jari |
58 |
} |
2 |
26 Feb 07 |
jari |
59 |
|
2 |
26 Feb 07 |
jari |
/* Shift i up from position x to restore heap order.*/ |
2 |
26 Feb 07 |
jari |
61 |
void siftupHeap(int i ,int x) { |
2 |
26 Feb 07 |
jari |
62 |
int px = pHeap(x); |
2 |
26 Feb 07 |
jari |
63 |
while (x > 0 && kvec[(int)h[(int)px]]>kvec[i]) { |
2 |
26 Feb 07 |
jari |
64 |
h[(int)x] = h[(int)px]; |
2 |
26 Feb 07 |
jari |
65 |
pos[(int)h[(int)x]] = x; |
2 |
26 Feb 07 |
jari |
66 |
x = (int)px; |
2 |
26 Feb 07 |
jari |
67 |
px = pHeap(x); |
2 |
26 Feb 07 |
jari |
68 |
} |
2 |
26 Feb 07 |
jari |
69 |
h[x] = i; |
2 |
26 Feb 07 |
jari |
70 |
pos[i] = x; |
2 |
26 Feb 07 |
jari |
71 |
} |
2 |
26 Feb 07 |
jari |
72 |
|
2 |
26 Feb 07 |
jari |
73 |
public int pHeap(int x) { |
2 |
26 Feb 07 |
jari |
74 |
return((x+(d-2))/d); |
2 |
26 Feb 07 |
jari |
75 |
} |
2 |
26 Feb 07 |
jari |
76 |
|
2 |
26 Feb 07 |
jari |
/* Shift i down from position x to restore heap order.*/ |
2 |
26 Feb 07 |
jari |
78 |
public void siftdownHeap(int i,int x) { |
2 |
26 Feb 07 |
jari |
79 |
int cx = minchildHeap(x); |
2 |
26 Feb 07 |
jari |
80 |
while (cx != -1 && kvec[(int)h[(int)cx]] < kvec[i]) { |
2 |
26 Feb 07 |
jari |
81 |
h[x] = h[(int)cx]; |
2 |
26 Feb 07 |
jari |
82 |
pos[(int)h[x]] = x; |
2 |
26 Feb 07 |
jari |
83 |
x = (int)cx; |
2 |
26 Feb 07 |
jari |
84 |
cx = minchildHeap(x); |
2 |
26 Feb 07 |
jari |
85 |
} |
2 |
26 Feb 07 |
jari |
86 |
h[x] = i; |
2 |
26 Feb 07 |
jari |
87 |
pos[i] = x; |
2 |
26 Feb 07 |
jari |
88 |
} |
2 |
26 Feb 07 |
jari |
89 |
|
2 |
26 Feb 07 |
jari |
/* Return the position of the child of the item at position x |
2 |
26 Feb 07 |
jari |
having minimum key. */ |
2 |
26 Feb 07 |
jari |
92 |
int minchildHeap(int x) { |
2 |
26 Feb 07 |
jari |
93 |
int y, minc; |
2 |
26 Feb 07 |
jari |
94 |
if ((minc = leftHeap(x)) > n) return -1; |
2 |
26 Feb 07 |
jari |
95 |
for (y = minc + 1; y <= rightHeap(x) && y <= n; y++) { |
2 |
26 Feb 07 |
jari |
96 |
if (kvec[(int)h[(int)y]] < kvec[(int)h[(int)minc]]) minc = y; |
2 |
26 Feb 07 |
jari |
97 |
} |
2 |
26 Feb 07 |
jari |
98 |
return minc; |
2 |
26 Feb 07 |
jari |
99 |
} |
2 |
26 Feb 07 |
jari |
100 |
|
2 |
26 Feb 07 |
jari |
101 |
public int leftHeap(int x) { |
2 |
26 Feb 07 |
jari |
102 |
return(d*((x)-1)+2); |
2 |
26 Feb 07 |
jari |
103 |
} |
2 |
26 Feb 07 |
jari |
104 |
|
2 |
26 Feb 07 |
jari |
105 |
public int rightHeap(int x) { |
2 |
26 Feb 07 |
jari |
106 |
return(d*(x)+1); |
2 |
26 Feb 07 |
jari |
107 |
} |
2 |
26 Feb 07 |
jari |
108 |
} |