add priority queue
This commit is contained in:
parent
4f29c6bfbf
commit
953c8fd239
@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 norangebit
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package it.norangeb.algorithms.datastructures.queue.priority
|
||||||
|
|
||||||
|
import arrow.core.None
|
||||||
|
import arrow.core.Option
|
||||||
|
import arrow.core.toOption
|
||||||
|
|
||||||
|
class BinaryHeap<T> private constructor(
|
||||||
|
private var array: Array<T?>,
|
||||||
|
private val shouldExchange: (T, T) -> Boolean
|
||||||
|
) : PriorityQueue<T> {
|
||||||
|
private var size: Int = 0
|
||||||
|
|
||||||
|
override fun insert(elem: T) {
|
||||||
|
if (isFull())
|
||||||
|
resizeArray(array.size * WAY)
|
||||||
|
|
||||||
|
array[++size] = elem
|
||||||
|
pushUp(array, size)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun pop(): Option<T> {
|
||||||
|
if (size < 1) return None
|
||||||
|
val result = array[FIRST_ELEMENT]
|
||||||
|
|
||||||
|
exchange(array, FIRST_ELEMENT, size)
|
||||||
|
array[size--] = null
|
||||||
|
pullDown(array, FIRST_ELEMENT)
|
||||||
|
|
||||||
|
if (isOneQuarterFull())
|
||||||
|
resizeArray(array.size / WAY)
|
||||||
|
|
||||||
|
return result.toOption()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun print() {
|
||||||
|
print("|")
|
||||||
|
array.forEach {
|
||||||
|
print(" $it |")
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun peek(): Option<T> = if (size >= 1)
|
||||||
|
array[1].toOption()
|
||||||
|
else
|
||||||
|
None
|
||||||
|
|
||||||
|
override fun isEmpty(): Boolean = size == 0
|
||||||
|
|
||||||
|
override fun size(): Int = size
|
||||||
|
|
||||||
|
private fun pushUp(array: Array<T?>, k: Int) {
|
||||||
|
when {
|
||||||
|
k <= 1 -> return
|
||||||
|
shouldExchange(
|
||||||
|
array[k / WAY] ?: return,
|
||||||
|
array[k] ?: return
|
||||||
|
) -> {
|
||||||
|
exchange(array, k / WAY, k)
|
||||||
|
pushUp(array, k / WAY)
|
||||||
|
}
|
||||||
|
else -> return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun pullDown(array: Array<T?>, k: Int) {
|
||||||
|
var i = k
|
||||||
|
while (i * WAY <= size) {
|
||||||
|
val child = i * WAY
|
||||||
|
|
||||||
|
when {
|
||||||
|
array[child + 1] == null -> exchange(array, i, child)
|
||||||
|
shouldExchange(
|
||||||
|
array[child] ?: return,
|
||||||
|
array[child + 1] ?: return
|
||||||
|
) -> exchange(array, i, child + 1)
|
||||||
|
else -> exchange(array, i, child)
|
||||||
|
}
|
||||||
|
|
||||||
|
i *= WAY
|
||||||
|
}
|
||||||
|
|
||||||
|
pushUp(array, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun exchange(array: Array<T?>, i: Int, j: Int) {
|
||||||
|
array[i] = array[j].also {
|
||||||
|
array[j] = array[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isFull(): Boolean = size + 1 == array.size
|
||||||
|
|
||||||
|
private fun isOneQuarterFull(): Boolean {
|
||||||
|
return size > 1 &&
|
||||||
|
size + 1 == array.size / 4
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun resizeArray(capacity: Int) {
|
||||||
|
array = array.copyOf(capacity)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object : COPriorityQueue {
|
||||||
|
private const val DEFAULT_CAPACITY = 3
|
||||||
|
private const val WAY = 2
|
||||||
|
private const val FIRST_ELEMENT = 1
|
||||||
|
|
||||||
|
override fun <C : Comparable<C>> createMaxPriorityQueue(): PriorityQueue<C> {
|
||||||
|
val array: Array<C?> = arrayOfNulls<Comparable<Any>>(DEFAULT_CAPACITY) as Array<C?>
|
||||||
|
return BinaryHeap(array) { t1, t2 ->
|
||||||
|
t1 < t2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <C : Comparable<C>> createMinPriorityQueue(): PriorityQueue<C> {
|
||||||
|
val array: Array<C?> = arrayOfNulls<Comparable<Any>>(DEFAULT_CAPACITY) as Array<C?>
|
||||||
|
return BinaryHeap(array) { t1, t2 ->
|
||||||
|
t1 > t2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T> createMaxPriorityQueue(compare: (T, T) -> Int): PriorityQueue<T> {
|
||||||
|
val array: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
return BinaryHeap(array) { t1, t2 ->
|
||||||
|
compare(t1, t2) < 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T> createMinPriorityQueue(compare: (T, T) -> Int): PriorityQueue<T> {
|
||||||
|
val array: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
return BinaryHeap(array) { t1, t2 ->
|
||||||
|
compare(t1, t2) > 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T, C : Comparable<C>> createMaxPriorityQueue(compareBy: (T) -> C): PriorityQueue<T> {
|
||||||
|
val array: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
return BinaryHeap(array) { t1, t2 ->
|
||||||
|
compareBy(t1) < compareBy(t2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T, C : Comparable<C>> createMinPriorityQueue(compareBy: (T) -> C): PriorityQueue<T> {
|
||||||
|
val array: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
return BinaryHeap(array) { t1, t2 ->
|
||||||
|
compareBy(t1) > compareBy(t2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <C : Comparable<C>> createMaxPriorityQueueFromArray(array: Array<C>): PriorityQueue<C> {
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueue<C>()
|
||||||
|
array.forEach { heap.insert(it) }
|
||||||
|
return heap
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <C : Comparable<C>> createMinPriorityQueueFromArray(array: Array<C>): PriorityQueue<C> {
|
||||||
|
val heap = BinaryHeap.createMinPriorityQueue<C>()
|
||||||
|
array.forEach { heap.insert(it) }
|
||||||
|
return heap
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T> createMaxPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compare: (T, T) -> Int
|
||||||
|
): PriorityQueue<T> {
|
||||||
|
val initArray: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
val heap = BinaryHeap(initArray) { t1, t2 ->
|
||||||
|
compare(t1, t2) < 0
|
||||||
|
}
|
||||||
|
|
||||||
|
array.forEach { heap.insert(it) }
|
||||||
|
|
||||||
|
return heap
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T> createMinPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compare: (T, T) -> Int
|
||||||
|
): PriorityQueue<T> {
|
||||||
|
val initArray: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
val heap = BinaryHeap(initArray) { t1, t2 ->
|
||||||
|
compare(t1, t2) > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
array.forEach { heap.insert(it) }
|
||||||
|
|
||||||
|
return heap
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T, C : Comparable<C>> createMaxPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compareBy: (T) -> C
|
||||||
|
): PriorityQueue<T> {
|
||||||
|
val initArray: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
val heap = BinaryHeap(initArray) { t1, t2 ->
|
||||||
|
compareBy(t1) < compareBy(t2)
|
||||||
|
}
|
||||||
|
|
||||||
|
array.forEach { heap.insert(it) }
|
||||||
|
|
||||||
|
return heap
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T, C : Comparable<C>> createMinPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compareBy: (T) -> C
|
||||||
|
): PriorityQueue<T> {
|
||||||
|
val initArray: Array<T?> = arrayOfNulls<Any>(DEFAULT_CAPACITY) as Array<T?>
|
||||||
|
val heap = BinaryHeap(initArray) { t1, t2 ->
|
||||||
|
compareBy(t1) > compareBy(t2)
|
||||||
|
}
|
||||||
|
|
||||||
|
array.forEach { heap.insert(it) }
|
||||||
|
|
||||||
|
return heap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 norangebit
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package it.norangeb.algorithms.datastructures.queue.priority
|
||||||
|
|
||||||
|
import arrow.core.Option
|
||||||
|
|
||||||
|
interface PriorityQueue<T> {
|
||||||
|
fun insert(elem: T)
|
||||||
|
fun pop(): Option<T>
|
||||||
|
fun peek(): Option<T>
|
||||||
|
fun isEmpty(): Boolean
|
||||||
|
fun size(): Int
|
||||||
|
}
|
||||||
|
|
||||||
|
interface COPriorityQueue {
|
||||||
|
fun <C : Comparable<C>> createMaxPriorityQueue(): PriorityQueue<C>
|
||||||
|
fun <C : Comparable<C>> createMinPriorityQueue(): PriorityQueue<C>
|
||||||
|
fun <T> createMaxPriorityQueue(compare: (T, T) -> Int): PriorityQueue<T>
|
||||||
|
fun <T> createMinPriorityQueue(compare: (T, T) -> Int): PriorityQueue<T>
|
||||||
|
fun <T, C : Comparable<C>> createMaxPriorityQueue(
|
||||||
|
compareBy: (T) -> C
|
||||||
|
): PriorityQueue<T>
|
||||||
|
|
||||||
|
fun <T, C : Comparable<C>> createMinPriorityQueue(
|
||||||
|
compareBy: (T) -> C
|
||||||
|
): PriorityQueue<T>
|
||||||
|
|
||||||
|
fun <C : Comparable<C>> createMaxPriorityQueueFromArray(
|
||||||
|
array: Array<C>
|
||||||
|
): PriorityQueue<C>
|
||||||
|
|
||||||
|
fun <C : Comparable<C>> createMinPriorityQueueFromArray(
|
||||||
|
array: Array<C>
|
||||||
|
): PriorityQueue<C>
|
||||||
|
|
||||||
|
fun <T> createMaxPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compare: (T, T) -> Int
|
||||||
|
): PriorityQueue<T>
|
||||||
|
|
||||||
|
fun <T> createMinPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compare: (T, T) -> Int
|
||||||
|
): PriorityQueue<T>
|
||||||
|
|
||||||
|
fun <T, C : Comparable<C>> createMaxPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compareBy: (T) -> C
|
||||||
|
): PriorityQueue<T>
|
||||||
|
|
||||||
|
fun <T, C : Comparable<C>> createMinPriorityQueueFromArray(
|
||||||
|
array: Array<T>,
|
||||||
|
compareBy: (T) -> C
|
||||||
|
): PriorityQueue<T>
|
||||||
|
}
|
@ -0,0 +1,362 @@
|
|||||||
|
/*
|
||||||
|
* MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 norangebit
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package it.norangeb.algorithms.datastructures.queue.priority
|
||||||
|
|
||||||
|
import arrow.core.None
|
||||||
|
import org.amshove.kluent.`should be equal to`
|
||||||
|
import org.amshove.kluent.`should equal`
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.reflect.full.declaredMemberFunctions
|
||||||
|
import kotlin.reflect.jvm.isAccessible
|
||||||
|
|
||||||
|
class BinaryHeapTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testExchange() {
|
||||||
|
val exchange = BinaryHeap::class.declaredMemberFunctions
|
||||||
|
.find { it.name == "exchange" }
|
||||||
|
.also { it?.isAccessible = true }
|
||||||
|
|
||||||
|
val binaryHeap = BinaryHeap.createMaxPriorityQueue<Int> { _, _ -> -1 }
|
||||||
|
val array = arrayOf(1, 2)
|
||||||
|
|
||||||
|
exchange?.call(binaryHeap, array, 0, 1)
|
||||||
|
|
||||||
|
array `should equal` arrayOf(2, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testPushUp() {
|
||||||
|
val pushUp = BinaryHeap::class.declaredMemberFunctions
|
||||||
|
.find { it.name == "pushUp" }
|
||||||
|
.also { it?.isAccessible = true }
|
||||||
|
|
||||||
|
val binaryHeap = BinaryHeap.createMaxPriorityQueue<Int> { t1, t2 ->
|
||||||
|
t1.compareTo(t2)
|
||||||
|
}
|
||||||
|
val array = arrayOf(Int.MAX_VALUE, 23, 5, 12, 3, 7)
|
||||||
|
|
||||||
|
pushUp?.call(binaryHeap, array, 5)
|
||||||
|
|
||||||
|
array `should equal` arrayOf(Int.MAX_VALUE, 23, 7, 12, 3, 5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testComparableMax() {
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueue<Int>()
|
||||||
|
heap.insert(25)
|
||||||
|
heap.insert(5)
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(12)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
heap.size() `should be equal to` 2
|
||||||
|
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testComparableMin() {
|
||||||
|
val heap = BinaryHeap.createMinPriorityQueue<Int>()
|
||||||
|
heap.insert(25)
|
||||||
|
heap.insert(5)
|
||||||
|
heap.insert(12)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareMax() {
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueue<Int> { t1, t2 -> t1.compareTo(t2) }
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(12)
|
||||||
|
heap.insert(5)
|
||||||
|
heap.insert(25)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
|
||||||
|
heap.insert(13)
|
||||||
|
heap.insert(1)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareMin() {
|
||||||
|
val heap = BinaryHeap.createMinPriorityQueue<Int> { t1, t2 -> t1.compareTo(t2) }
|
||||||
|
heap.insert(25)
|
||||||
|
heap.insert(5)
|
||||||
|
heap.insert(12)
|
||||||
|
heap.insert(15)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareByMax() {
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueue<Int, Int> { it }
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(25)
|
||||||
|
heap.insert(12)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(5)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareByMin() {
|
||||||
|
val heap = BinaryHeap.createMinPriorityQueue<Int, Int> { it }
|
||||||
|
heap.insert(12)
|
||||||
|
heap.insert(25)
|
||||||
|
heap.insert(5)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
|
||||||
|
heap.insert(13)
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(1)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testComparableArrayMax() {
|
||||||
|
val array = arrayOf(5, 12)
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueueFromArray(array)
|
||||||
|
|
||||||
|
heap.insert(25)
|
||||||
|
heap.insert(15)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testComparableArrayMin() {
|
||||||
|
val array = arrayOf(12, 25)
|
||||||
|
val heap = BinaryHeap.createMinPriorityQueueFromArray(array)
|
||||||
|
|
||||||
|
heap.insert(5)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareMaxArray() {
|
||||||
|
val array = arrayOf(15, 5)
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueueFromArray(array) { t1, t2 ->
|
||||||
|
t1.compareTo(t2)
|
||||||
|
}
|
||||||
|
|
||||||
|
heap.insert(12)
|
||||||
|
heap.insert(25)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
|
||||||
|
heap.insert(13)
|
||||||
|
heap.insert(1)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareMinArray() {
|
||||||
|
val array = arrayOf(15, 12)
|
||||||
|
val heap = BinaryHeap.createMinPriorityQueueFromArray(array) { t1, t2 ->
|
||||||
|
t1.compareTo(t2)
|
||||||
|
}
|
||||||
|
|
||||||
|
heap.insert(25)
|
||||||
|
heap.insert(5)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareByMaxArray() {
|
||||||
|
val array = arrayOf(12)
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueueFromArray<Int, Int>(array) { it }
|
||||||
|
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(25)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
|
||||||
|
heap.insert(1)
|
||||||
|
heap.insert(5)
|
||||||
|
heap.insert(13)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCompareByMinArray() {
|
||||||
|
val array = arrayOf(5, 12)
|
||||||
|
val heap = BinaryHeap.createMinPriorityQueueFromArray<Int, Int>(array) { it }
|
||||||
|
|
||||||
|
heap.insert(25)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 5 }
|
||||||
|
heap.pop().map { it `should be equal to` 12 }
|
||||||
|
|
||||||
|
heap.insert(13)
|
||||||
|
heap.insert(15)
|
||||||
|
heap.insert(1)
|
||||||
|
|
||||||
|
heap.peek().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 1 }
|
||||||
|
heap.pop().map { it `should be equal to` 13 }
|
||||||
|
heap.pop().map { it `should be equal to` 15 }
|
||||||
|
heap.pop().map { it `should be equal to` 25 }
|
||||||
|
|
||||||
|
(heap.pop() is None) `should be equal to` true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testResize() {
|
||||||
|
val heap = BinaryHeap.createMaxPriorityQueue<Int>()
|
||||||
|
|
||||||
|
(0 until 1000).forEach { heap.insert(it) }
|
||||||
|
repeat(1010) { heap.pop() }
|
||||||
|
heap.size() `should be equal to` 0
|
||||||
|
heap.insert(10)
|
||||||
|
heap.insert(11)
|
||||||
|
|
||||||
|
heap.pop().map { it `should be equal to` 11 }
|
||||||
|
heap.pop().map { it `should be equal to` 10 }
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user