Browse Source

Revert "Prioq can now remove any element if its position is known"

This reverts commit e25b00cee82e185d0fe1447c64d07285a5fe5079.
Guillaume Koenig 7 years ago
parent
commit
abcac1b6fd
1 changed files with 9 additions and 26 deletions
  1. 9 26
      main.go

+ 9 - 26
main.go

@@ -65,7 +65,6 @@ func (rs ByEndtime) Less(i, j int) bool {
65 65
 
66 66
 type Scheduler interface {
67 67
 	Add(*Car)
68
-	RemoveAtIndex(k int) *Car
69 68
 	Pop() *Car
70 69
 }
71 70
 
@@ -77,8 +76,7 @@ type Car struct {
77 76
 	X       int
78 77
 	Y       int
79 78
 
80
-	score   int
81
-	pqindex int // used for removal in prority queue
79
+	score int
82 80
 }
83 81
 
84 82
 func (c *Car) Update(r *Ride) {
@@ -297,35 +295,31 @@ type prioq struct {
297 295
 
298 296
 func (pq *prioq) Add(car *Car) {
299 297
 	pq.bintree = append(pq.bintree, car)
300
-	pq.bintree[len(pq.bintree)-1].pqindex = len(pq.bintree) - 1
301 298
 
302 299
 	// Rebalance tree to respect invariant
303 300
 	var i = len(pq.bintree) - 1
304 301
 	var p = (i - 1) / 2
305 302
 	for p >= 0 && pq.bintree[p].Arrival > pq.bintree[i].Arrival {
306 303
 		pq.bintree[p], pq.bintree[i] = pq.bintree[i], pq.bintree[p]
307
-		pq.bintree[p].pqindex = p
308
-		pq.bintree[i].pqindex = i
309 304
 		i = p
310 305
 		p = (i - 1) / 2
311 306
 	}
312 307
 }
313 308
 
314
-func (pq *prioq) RemoveAtIndex(k int) *Car {
309
+func (pq *prioq) Pop() *Car {
315 310
 	if len(pq.bintree) == 0 {
316 311
 		return nil
317 312
 	}
318 313
 
319
-	if k == len(pq.bintree)-1 {
320
-		elem := pq.bintree[k]
321
-		pq.bintree = pq.bintree[:k]
314
+	if len(pq.bintree) == 1 {
315
+		elem := pq.bintree[0]
316
+		pq.bintree = pq.bintree[:0]
322 317
 		return elem
323 318
 	}
324 319
 
325
-	elem := pq.bintree[k]
326
-	// Put last element at hole
327
-	pq.bintree[k] = pq.bintree[len(pq.bintree)-1]
328
-	pq.bintree[k].pqindex = k
320
+	elem := pq.bintree[0]
321
+	// Put last element at root
322
+	pq.bintree[0] = pq.bintree[len(pq.bintree)-1]
329 323
 	// Remove last element
330 324
 	pq.bintree = pq.bintree[:len(pq.bintree)-1]
331 325
 
@@ -336,8 +330,7 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
336 330
 
337 331
 	// Rebalance tree to respect invariant
338 332
 	len := len(pq.bintree)
339
-	i := k
340
-	left, right := 0, 0
333
+	i, left, right := 0, 0, 0
341 334
 	for {
342 335
 		left = 2*i + 1
343 336
 		right = 2*i + 2
@@ -347,8 +340,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
347 340
 					break // Inferior to both children
348 341
 				} else {
349 342
 					pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
350
-					pq.bintree[i].pqindex = i
351
-					pq.bintree[left].pqindex = left
352 343
 					i = left
353 344
 				}
354 345
 			} else {
@@ -356,8 +347,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
356 347
 					break // Inferior to both children
357 348
 				} else {
358 349
 					pq.bintree[i], pq.bintree[right] = pq.bintree[right], pq.bintree[i]
359
-					pq.bintree[i].pqindex = i
360
-					pq.bintree[right].pqindex = right
361 350
 					i = right
362 351
 				}
363 352
 			}
@@ -366,8 +355,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
366 355
 				break // Inferior to only child
367 356
 			}
368 357
 			pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
369
-			pq.bintree[i].pqindex = i
370
-			pq.bintree[left].pqindex = left
371 358
 			i = left
372 359
 		} else { // No child
373 360
 			break
@@ -378,10 +365,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
378 365
 	return elem
379 366
 }
380 367
 
381
-func (pq *prioq) Pop() *Car {
382
-	return pq.RemoveAtIndex(0)
383
-}
384
-
385 368
 func (pq *prioq) empty() bool {
386 369
 	return len(pq.bintree) == 0
387 370
 }