Przeglądaj źródła

merge in one file

Gildas Chabot 7 lat temu
rodzic
commit
062f37e326
2 zmienionych plików z 84 dodań i 83 usunięć
  1. 84 0
      main.go
  2. 0 83
      prioq.go

+ 84 - 0
main.go

@@ -173,3 +173,87 @@ func readFloat() float64 {
173 173
 	fmt.Fscanf(input, "%f", &x)
174 174
 	return x
175 175
 }
176
+
177
+// Prioq
178
+
179
+// Invariant: both children are bigger
180
+
181
+type prioq struct {
182
+	bintree []*Car
183
+}
184
+
185
+func (pq *prioq) Add(car *Car) {
186
+	pq.bintree = append(pq.bintree, car)
187
+
188
+	// Rebalance tree to respect invariant
189
+	var i = len(pq.bintree) - 1
190
+	var p = (i - 1) / 2
191
+	for p >= 0 && pq.bintree[p].Arrival > pq.bintree[i].Arrival {
192
+		pq.bintree[p], pq.bintree[i] = pq.bintree[i], pq.bintree[p]
193
+		i = p
194
+		p = (i - 1) / 2
195
+	}
196
+}
197
+
198
+func (pq *prioq) Pop() *Car {
199
+	if len(pq.bintree) == 0 {
200
+		return nil
201
+	}
202
+
203
+	if len(pq.bintree) == 1 {
204
+		elem := pq.bintree[0]
205
+		pq.bintree = pq.bintree[:0]
206
+		return elem
207
+	}
208
+
209
+	elem := pq.bintree[0]
210
+	// Put last element at root
211
+	pq.bintree[0] = pq.bintree[len(pq.bintree)-1]
212
+	// Remove last element
213
+	pq.bintree = pq.bintree[:len(pq.bintree)-1]
214
+
215
+	//        1                  9
216
+	//    10     9	         10     12
217
+	//  11 12   13 14  ->  11 12   13 14
218
+	// 12
219
+
220
+	// Rebalance tree to respect invariant
221
+	len := len(pq.bintree)
222
+	i, left, right := 0, 0, 0
223
+	for {
224
+		left = 2*i + 1
225
+		right = 2*i + 2
226
+		if left < len && right < len { // Two children
227
+			if pq.bintree[left].Arrival <= pq.bintree[right].Arrival {
228
+				if pq.bintree[i].Arrival <= pq.bintree[left].Arrival {
229
+					break // Inferior to both children
230
+				} else {
231
+					pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
232
+					i = left
233
+				}
234
+			} else {
235
+				if pq.bintree[i].Arrival <= pq.bintree[right].Arrival {
236
+					break // Inferior to both children
237
+				} else {
238
+					pq.bintree[i], pq.bintree[right] = pq.bintree[right], pq.bintree[i]
239
+					i = right
240
+				}
241
+			}
242
+		} else if left < len { // One child (left)
243
+			if pq.bintree[i].Arrival <= pq.bintree[left].Arrival {
244
+				break // Inferior to only child
245
+			}
246
+			pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
247
+			i = left
248
+		} else { // No child
249
+			break
250
+		}
251
+
252
+	}
253
+
254
+	return elem
255
+}
256
+
257
+func (pq *prioq) empty() bool {
258
+	return len(pq.bintree) == 0
259
+}

+ 0 - 83
prioq.go

@@ -1,83 +0,0 @@
1
-package main
2
-
3
-// Invariant: both children are bigger
4
-
5
-type prioq struct {
6
-	bintree []*Car
7
-}
8
-
9
-func (pq *prioq) Add(car *Car) {
10
-	pq.bintree = append(pq.bintree, car)
11
-
12
-	// Rebalance tree to respect invariant
13
-	var i = len(pq.bintree) - 1
14
-	var p = (i - 1) / 2
15
-	for p >= 0 && pq.bintree[p].Arrival > pq.bintree[i].Arrival {
16
-		pq.bintree[p], pq.bintree[i] = pq.bintree[i], pq.bintree[p]
17
-		i = p
18
-		p = (i - 1) / 2
19
-	}
20
-}
21
-
22
-func (pq *prioq) Pop() *Car {
23
-	if len(pq.bintree) == 0 {
24
-		return nil
25
-	}
26
-
27
-	if len(pq.bintree) == 1 {
28
-		elem := pq.bintree[0]
29
-		pq.bintree = pq.bintree[:0]
30
-		return elem
31
-	}
32
-
33
-	elem := pq.bintree[0]
34
-	// Put last element at root
35
-	pq.bintree[0] = pq.bintree[len(pq.bintree)-1]
36
-	// Remove last element
37
-	pq.bintree = pq.bintree[:len(pq.bintree)-1]
38
-
39
-	//        1                  9
40
-	//    10     9	         10     12
41
-	//  11 12   13 14  ->  11 12   13 14
42
-	// 12
43
-
44
-	// Rebalance tree to respect invariant
45
-	len := len(pq.bintree)
46
-	i, left, right := 0, 0, 0
47
-	for {
48
-		left = 2*i + 1
49
-		right = 2*i + 2
50
-		if left < len && right < len { // Two children
51
-			if pq.bintree[left].Arrival <= pq.bintree[right].Arrival {
52
-				if pq.bintree[i].Arrival <= pq.bintree[left].Arrival {
53
-					break // Inferior to both children
54
-				} else {
55
-					pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
56
-					i = left
57
-				}
58
-			} else {
59
-				if pq.bintree[i].Arrival <= pq.bintree[right].Arrival {
60
-					break // Inferior to both children
61
-				} else {
62
-					pq.bintree[i], pq.bintree[right] = pq.bintree[right], pq.bintree[i]
63
-					i = right
64
-				}
65
-			}
66
-		} else if left < len { // One child (left)
67
-			if pq.bintree[i].Arrival <= pq.bintree[left].Arrival {
68
-				break // Inferior to only child
69
-			}
70
-			pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
71
-			i = left
72
-		} else { // No child
73
-			break
74
-		}
75
-
76
-	}
77
-
78
-	return elem
79
-}
80
-
81
-func (pq *prioq) empty() bool {
82
-	return len(pq.bintree) == 0
83
-}