make methods public
This commit is contained in:
parent
1b3ca7b515
commit
eb82d79371
2 changed files with 110 additions and 110 deletions
|
@ -1,15 +1,15 @@
|
|||
package priority_queue
|
||||
|
||||
type IndexPriorityQueue[T any] interface {
|
||||
top() T // get item with biggest priority
|
||||
topIndex() int // get index of an item with biggest priority
|
||||
remove() T // removes item with the biggest priority
|
||||
removeAtIndex(index int) T // removes item at specified index
|
||||
insert(index int, item T) // adds item at specified index
|
||||
change(index int, item T) // changes item at specified index and preserves ordering
|
||||
contains(index int) bool // checks if item exists at specified index
|
||||
isEmpty() bool
|
||||
size() int
|
||||
Top() T // get item with biggest priority
|
||||
TopIndex() int // get index of an item with biggest priority
|
||||
Remove() T // removes item with the biggest priority
|
||||
RemoveAtIndex(index int) T // removes item at specified index
|
||||
Insert(index int, item T) // adds item at specified index
|
||||
Change(index int, item T) // changes item at specified index and preserves ordering
|
||||
Contains(index int) bool // checks if item exists at specified index
|
||||
IsEmpty() bool
|
||||
Size() int
|
||||
}
|
||||
|
||||
type indexPriorityQueue[T any] struct {
|
||||
|
@ -47,15 +47,15 @@ func NewIPQ[T any](less func(T, T) bool, indexSize int) IndexPriorityQueue[T] {
|
|||
return &indexPriorityQueue[T]{n, items, pq, qp, less}
|
||||
}
|
||||
|
||||
func (q *indexPriorityQueue[T]) top() T {
|
||||
func (q *indexPriorityQueue[T]) Top() T {
|
||||
return q.items[q.pq[0]]
|
||||
}
|
||||
|
||||
func (q *indexPriorityQueue[T]) topIndex() int {
|
||||
func (q *indexPriorityQueue[T]) TopIndex() int {
|
||||
return q.pq[0]
|
||||
}
|
||||
|
||||
func (q *indexPriorityQueue[T]) insert(index int, item T) {
|
||||
func (q *indexPriorityQueue[T]) Insert(index int, item T) {
|
||||
q.pq[q.n] = index
|
||||
q.qp[index] = q.n
|
||||
q.items[index] = item
|
||||
|
@ -63,11 +63,11 @@ func (q *indexPriorityQueue[T]) insert(index int, item T) {
|
|||
q.n++
|
||||
}
|
||||
|
||||
func (q *indexPriorityQueue[T]) remove() T {
|
||||
return q.removeAtIndex(q.topIndex())
|
||||
func (q *indexPriorityQueue[T]) Remove() T {
|
||||
return q.RemoveAtIndex(q.TopIndex())
|
||||
}
|
||||
|
||||
func (q *indexPriorityQueue[T]) removeAtIndex(index int) T {
|
||||
func (q *indexPriorityQueue[T]) RemoveAtIndex(index int) T {
|
||||
pivot := q.qp[index]
|
||||
q.n--
|
||||
q.swap(pivot, q.n)
|
||||
|
@ -80,21 +80,21 @@ func (q *indexPriorityQueue[T]) removeAtIndex(index int) T {
|
|||
return q.items[index]
|
||||
}
|
||||
|
||||
func (q *indexPriorityQueue[T]) change(index int, item T) {
|
||||
func (q *indexPriorityQueue[T]) Change(index int, item T) {
|
||||
q.items[index] = item
|
||||
q.swim(q.qp[index])
|
||||
q.sink(q.qp[index])
|
||||
}
|
||||
|
||||
func (pq *indexPriorityQueue[_]) size() int {
|
||||
func (pq *indexPriorityQueue[_]) Size() int {
|
||||
return pq.n
|
||||
}
|
||||
|
||||
func (pq *indexPriorityQueue[_]) isEmpty() bool {
|
||||
func (pq *indexPriorityQueue[_]) IsEmpty() bool {
|
||||
return pq.n == 0
|
||||
}
|
||||
|
||||
func (q *indexPriorityQueue[_]) contains(index int) bool {
|
||||
func (q *indexPriorityQueue[_]) Contains(index int) bool {
|
||||
return q.qp[index] != -1
|
||||
}
|
||||
|
||||
|
|
|
@ -12,151 +12,151 @@ func TestNewIPQ(t *testing.T) {
|
|||
q := NewIPQ(intDescending, 1)
|
||||
assert.NotNil(t, q)
|
||||
|
||||
assert.Equal(t, 0, q.size())
|
||||
assert.Equal(t, true, q.isEmpty())
|
||||
assert.Equal(t, -1, q.topIndex())
|
||||
assert.Equal(t, 0, q.Size())
|
||||
assert.Equal(t, true, q.IsEmpty())
|
||||
assert.Equal(t, -1, q.TopIndex())
|
||||
// TODO: maybe should return nil?
|
||||
// assert.Equal(t, 0, q.top())
|
||||
// assert.Equal(t, 0, q.Top())
|
||||
}
|
||||
|
||||
func TestIPQInsert(t *testing.T) {
|
||||
pq := NewIPQ(intDescending, 10)
|
||||
|
||||
pq.insert(1, 3)
|
||||
assert.Equal(t, 3, pq.top())
|
||||
pq.Insert(1, 3)
|
||||
assert.Equal(t, 3, pq.Top())
|
||||
|
||||
pq.insert(2, 4)
|
||||
assert.Equal(t, 4, pq.top())
|
||||
pq.Insert(2, 4)
|
||||
assert.Equal(t, 4, pq.Top())
|
||||
|
||||
pq.insert(3, 1)
|
||||
assert.Equal(t, 4, pq.top())
|
||||
pq.Insert(3, 1)
|
||||
assert.Equal(t, 4, pq.Top())
|
||||
|
||||
pq.insert(4, 4)
|
||||
assert.Equal(t, 4, pq.top())
|
||||
pq.Insert(4, 4)
|
||||
assert.Equal(t, 4, pq.Top())
|
||||
}
|
||||
|
||||
func TestMoreIPQInsert(t *testing.T) {
|
||||
pq := NewIPQ(intDescending, 10)
|
||||
|
||||
pq.insert(1, 10)
|
||||
pq.Insert(1, 10)
|
||||
|
||||
assert.Equal(t, 1, pq.topIndex())
|
||||
assert.Equal(t, 10, pq.top())
|
||||
assert.Equal(t, 1, pq.size())
|
||||
assert.Equal(t, true, pq.contains(1))
|
||||
assert.Equal(t, false, pq.isEmpty())
|
||||
assert.Equal(t, 1, pq.TopIndex())
|
||||
assert.Equal(t, 10, pq.Top())
|
||||
assert.Equal(t, 1, pq.Size())
|
||||
assert.Equal(t, true, pq.Contains(1))
|
||||
assert.Equal(t, false, pq.IsEmpty())
|
||||
|
||||
pq.insert(2, 20)
|
||||
pq.Insert(2, 20)
|
||||
|
||||
assert.Equal(t, 2, pq.topIndex())
|
||||
assert.Equal(t, 20, pq.top())
|
||||
assert.Equal(t, 2, pq.size())
|
||||
assert.Equal(t, true, pq.contains(2))
|
||||
assert.Equal(t, false, pq.isEmpty())
|
||||
assert.Equal(t, 2, pq.TopIndex())
|
||||
assert.Equal(t, 20, pq.Top())
|
||||
assert.Equal(t, 2, pq.Size())
|
||||
assert.Equal(t, true, pq.Contains(2))
|
||||
assert.Equal(t, false, pq.IsEmpty())
|
||||
}
|
||||
|
||||
func TestIPQRemove(t *testing.T) {
|
||||
pq := NewIPQ(intDescending, 10)
|
||||
|
||||
pq.insert(1, 10)
|
||||
pq.Insert(1, 10)
|
||||
|
||||
assert.Equal(t, 1, pq.topIndex())
|
||||
assert.Equal(t, 10, pq.top())
|
||||
assert.Equal(t, 1, pq.size())
|
||||
assert.Equal(t, true, pq.contains(1))
|
||||
assert.Equal(t, false, pq.isEmpty())
|
||||
assert.Equal(t, 1, pq.TopIndex())
|
||||
assert.Equal(t, 10, pq.Top())
|
||||
assert.Equal(t, 1, pq.Size())
|
||||
assert.Equal(t, true, pq.Contains(1))
|
||||
assert.Equal(t, false, pq.IsEmpty())
|
||||
|
||||
pq.insert(2, 20)
|
||||
pq.Insert(2, 20)
|
||||
|
||||
assert.Equal(t, 2, pq.topIndex())
|
||||
assert.Equal(t, 20, pq.top())
|
||||
assert.Equal(t, 2, pq.size())
|
||||
assert.Equal(t, true, pq.contains(2))
|
||||
assert.Equal(t, false, pq.isEmpty())
|
||||
assert.Equal(t, 2, pq.TopIndex())
|
||||
assert.Equal(t, 20, pq.Top())
|
||||
assert.Equal(t, 2, pq.Size())
|
||||
assert.Equal(t, true, pq.Contains(2))
|
||||
assert.Equal(t, false, pq.IsEmpty())
|
||||
|
||||
removed := pq.remove()
|
||||
removed := pq.Remove()
|
||||
|
||||
assert.Equal(t, 20, removed)
|
||||
assert.Equal(t, 10, pq.top())
|
||||
assert.Equal(t, 1, pq.size())
|
||||
assert.Equal(t, false, pq.contains(2))
|
||||
assert.Equal(t, true, pq.contains(1))
|
||||
assert.Equal(t, false, pq.isEmpty())
|
||||
assert.Equal(t, 10, pq.Top())
|
||||
assert.Equal(t, 1, pq.Size())
|
||||
assert.Equal(t, false, pq.Contains(2))
|
||||
assert.Equal(t, true, pq.Contains(1))
|
||||
assert.Equal(t, false, pq.IsEmpty())
|
||||
|
||||
removed = pq.remove()
|
||||
removed = pq.Remove()
|
||||
|
||||
assert.Equal(t, 10, removed)
|
||||
// TODO: should return nil?
|
||||
// assert.Equal(t, "", pq.top())
|
||||
assert.Equal(t, 0, pq.size())
|
||||
assert.Equal(t, false, pq.contains(1))
|
||||
assert.Equal(t, true, pq.isEmpty())
|
||||
// assert.Equal(t, "", pq.Top())
|
||||
assert.Equal(t, 0, pq.Size())
|
||||
assert.Equal(t, false, pq.Contains(1))
|
||||
assert.Equal(t, true, pq.IsEmpty())
|
||||
}
|
||||
|
||||
func TestIPQRemoveAtIndex(t *testing.T) {
|
||||
pq := NewIPQ(intDescending, 10)
|
||||
|
||||
// top -> 40 - 30 - 20 - 10
|
||||
pq.insert(8, 10)
|
||||
pq.insert(5, 20)
|
||||
pq.insert(3, 30)
|
||||
pq.insert(4, 40)
|
||||
// Top -> 40 - 30 - 20 - 10
|
||||
pq.Insert(8, 10)
|
||||
pq.Insert(5, 20)
|
||||
pq.Insert(3, 30)
|
||||
pq.Insert(4, 40)
|
||||
|
||||
assert.Equal(t, 40, pq.top())
|
||||
assert.Equal(t, 4, pq.topIndex())
|
||||
assert.Equal(t, 40, pq.Top())
|
||||
assert.Equal(t, 4, pq.TopIndex())
|
||||
|
||||
// top -> 40 - 30 - 10
|
||||
removed := pq.removeAtIndex(5)
|
||||
// Top -> 40 - 30 - 10
|
||||
removed := pq.RemoveAtIndex(5)
|
||||
|
||||
assert.Equal(t, 20, removed)
|
||||
assert.Equal(t, 40, pq.top())
|
||||
assert.Equal(t, 4, pq.topIndex())
|
||||
assert.Equal(t, 40, pq.Top())
|
||||
assert.Equal(t, 4, pq.TopIndex())
|
||||
|
||||
// top -> 30 - 10
|
||||
removed = pq.removeAtIndex(4)
|
||||
// Top -> 30 - 10
|
||||
removed = pq.RemoveAtIndex(4)
|
||||
|
||||
assert.Equal(t, 40, removed)
|
||||
assert.Equal(t, 30, pq.top())
|
||||
assert.Equal(t, 3, pq.topIndex())
|
||||
assert.Equal(t, 30, pq.Top())
|
||||
assert.Equal(t, 3, pq.TopIndex())
|
||||
|
||||
// top -> 30 - 20 - 10
|
||||
pq.insert(5, 20)
|
||||
// Top -> 30 - 20 - 10
|
||||
pq.Insert(5, 20)
|
||||
|
||||
assert.Equal(t, 30, pq.top())
|
||||
assert.Equal(t, 3, pq.topIndex())
|
||||
assert.Equal(t, 30, pq.Top())
|
||||
assert.Equal(t, 3, pq.TopIndex())
|
||||
|
||||
// top -> 10
|
||||
removed = pq.removeAtIndex(3)
|
||||
// Top -> 10
|
||||
removed = pq.RemoveAtIndex(3)
|
||||
assert.Equal(t, 30, removed)
|
||||
removed = pq.removeAtIndex(5)
|
||||
removed = pq.RemoveAtIndex(5)
|
||||
assert.Equal(t, 20, removed)
|
||||
|
||||
assert.Equal(t, 10, pq.top())
|
||||
assert.Equal(t, 8, pq.topIndex())
|
||||
assert.Equal(t, 1, pq.size())
|
||||
assert.Equal(t, false, pq.contains(5))
|
||||
assert.Equal(t, false, pq.contains(4))
|
||||
assert.Equal(t, false, pq.contains(3))
|
||||
assert.Equal(t, true, pq.contains(8))
|
||||
assert.Equal(t, false, pq.isEmpty())
|
||||
assert.Equal(t, 10, pq.Top())
|
||||
assert.Equal(t, 8, pq.TopIndex())
|
||||
assert.Equal(t, 1, pq.Size())
|
||||
assert.Equal(t, false, pq.Contains(5))
|
||||
assert.Equal(t, false, pq.Contains(4))
|
||||
assert.Equal(t, false, pq.Contains(3))
|
||||
assert.Equal(t, true, pq.Contains(8))
|
||||
assert.Equal(t, false, pq.IsEmpty())
|
||||
}
|
||||
|
||||
func TestIndexChange(t *testing.T) {
|
||||
pq := NewIPQ(intDescending, 10)
|
||||
|
||||
pq.insert(1, 9)
|
||||
pq.insert(2, 8)
|
||||
pq.insert(3, 12)
|
||||
pq.Insert(1, 9)
|
||||
pq.Insert(2, 8)
|
||||
pq.Insert(3, 12)
|
||||
|
||||
assert.Equal(t, 12, pq.top())
|
||||
assert.Equal(t, 12, pq.Top())
|
||||
|
||||
pq.change(3, 7)
|
||||
pq.Change(3, 7)
|
||||
|
||||
assert.Equal(t, 9, pq.top())
|
||||
assert.Equal(t, 9, pq.Top())
|
||||
|
||||
pq.change(2, 10)
|
||||
pq.Change(2, 10)
|
||||
|
||||
assert.Equal(t, 10, pq.top())
|
||||
assert.Equal(t, 10, pq.Top())
|
||||
}
|
||||
|
||||
func TestMultiwayMerge(t *testing.T) {
|
||||
|
@ -174,16 +174,16 @@ func TestMultiwayMerge(t *testing.T) {
|
|||
|
||||
for i, stream := range allStreams {
|
||||
rune, _, _ := stream.ReadRune()
|
||||
pq.insert(i, string(rune))
|
||||
pq.Insert(i, string(rune))
|
||||
}
|
||||
|
||||
for !pq.isEmpty() {
|
||||
actual += string(pq.top())
|
||||
streamIndex := pq.topIndex()
|
||||
pq.remove()
|
||||
for !pq.IsEmpty() {
|
||||
actual += string(pq.Top())
|
||||
streamIndex := pq.TopIndex()
|
||||
pq.Remove()
|
||||
rune, _, err := allStreams[streamIndex].ReadRune()
|
||||
if err != io.EOF {
|
||||
pq.insert(streamIndex, string(rune))
|
||||
pq.Insert(streamIndex, string(rune))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue