瀏覽代碼

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

This reverts commit e25b00cee82e185d0fe1447c64d07285a5fe5079.
Guillaume Koenig 7 年之前
父節點
當前提交
15e2c9b3d9
共有 1 個文件被更改,包括 9 次插入26 次删除
  1. 9 26
      main.go

+ 9 - 26
main.go

@@ -65,7 +65,6 @@ func (rs ByEndtime) Less(i, j int) bool {
65
 
65
 
66
 type Scheduler interface {
66
 type Scheduler interface {
67
 	Add(*Car)
67
 	Add(*Car)
68
-	RemoveAtIndex(k int) *Car
69
 	Pop() *Car
68
 	Pop() *Car
70
 }
69
 }
71
 
70
 
@@ -77,8 +76,7 @@ type Car struct {
77
 	X       int
76
 	X       int
78
 	Y       int
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
 func (c *Car) Update(r *Ride) {
82
 func (c *Car) Update(r *Ride) {
@@ -297,35 +295,31 @@ type prioq struct {
297
 
295
 
298
 func (pq *prioq) Add(car *Car) {
296
 func (pq *prioq) Add(car *Car) {
299
 	pq.bintree = append(pq.bintree, car)
297
 	pq.bintree = append(pq.bintree, car)
300
-	pq.bintree[len(pq.bintree)-1].pqindex = len(pq.bintree) - 1
301
 
298
 
302
 	// Rebalance tree to respect invariant
299
 	// Rebalance tree to respect invariant
303
 	var i = len(pq.bintree) - 1
300
 	var i = len(pq.bintree) - 1
304
 	var p = (i - 1) / 2
301
 	var p = (i - 1) / 2
305
 	for p >= 0 && pq.bintree[p].Arrival > pq.bintree[i].Arrival {
302
 	for p >= 0 && pq.bintree[p].Arrival > pq.bintree[i].Arrival {
306
 		pq.bintree[p], pq.bintree[i] = pq.bintree[i], pq.bintree[p]
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
 		i = p
304
 		i = p
310
 		p = (i - 1) / 2
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
 	if len(pq.bintree) == 0 {
310
 	if len(pq.bintree) == 0 {
316
 		return nil
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
 		return elem
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
 	// Remove last element
323
 	// Remove last element
330
 	pq.bintree = pq.bintree[:len(pq.bintree)-1]
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
 	// Rebalance tree to respect invariant
331
 	// Rebalance tree to respect invariant
338
 	len := len(pq.bintree)
332
 	len := len(pq.bintree)
339
-	i := k
340
-	left, right := 0, 0
333
+	i, left, right := 0, 0, 0
341
 	for {
334
 	for {
342
 		left = 2*i + 1
335
 		left = 2*i + 1
343
 		right = 2*i + 2
336
 		right = 2*i + 2
@@ -347,8 +340,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
347
 					break // Inferior to both children
340
 					break // Inferior to both children
348
 				} else {
341
 				} else {
349
 					pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
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
 					i = left
343
 					i = left
353
 				}
344
 				}
354
 			} else {
345
 			} else {
@@ -356,8 +347,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
356
 					break // Inferior to both children
347
 					break // Inferior to both children
357
 				} else {
348
 				} else {
358
 					pq.bintree[i], pq.bintree[right] = pq.bintree[right], pq.bintree[i]
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
 					i = right
350
 					i = right
362
 				}
351
 				}
363
 			}
352
 			}
@@ -366,8 +355,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
366
 				break // Inferior to only child
355
 				break // Inferior to only child
367
 			}
356
 			}
368
 			pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
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
 			i = left
358
 			i = left
372
 		} else { // No child
359
 		} else { // No child
373
 			break
360
 			break
@@ -378,10 +365,6 @@ func (pq *prioq) RemoveAtIndex(k int) *Car {
378
 	return elem
365
 	return elem
379
 }
366
 }
380
 
367
 
381
-func (pq *prioq) Pop() *Car {
382
-	return pq.RemoveAtIndex(0)
383
-}
384
-
385
 func (pq *prioq) empty() bool {
368
 func (pq *prioq) empty() bool {
386
 	return len(pq.bintree) == 0
369
 	return len(pq.bintree) == 0
387
 }
370
 }