从 2 个未排序的数组中找到 MinHeap 构建中的 K 元素的 Big(O)

Big(O) of finding K element in a MinHeap build from 2 unsorted arrays

在这里给出问题。 https://www.careercup.com/question?id=9406769 询问: 给定两个未排序的 int 数组,在合并后的排序数组中找到第 k 个元素。 索引中从 1 开始的第 k 个元素。

以下解决方案的 BigO 性能如何(打印 1):

    object MergeTwoArraysFindK {

  import scala.collection.mutable.PriorityQueue

  def findK(arrayOne: Array[Int], arrayTwo: Array[Int], k: Int): Int = {
    implicit val ord = Ordering[Int].reverse
    val minHeap = new PriorityQueue[Int] ++= (arrayOne ++ arrayTwo).iterator
    for (i <- 1 to k)
      if (i == k)
        return minHeap.dequeue()
      else
        minHeap.dequeue()
    -1
  }

  def main(args: Array[String]): Unit = {
    val arrayOne = Array[Int](3, 4, 9, 0, 1, 2, 4)
    val arrayTwo = Array[Int](5, 4, 1, 0, 9, 8)
    println(findK(arrayOne, arrayTwo, 4))
  }
}

构建堆需要O(n)的时间,还需要额外的O(n)space.

找到第 k 个项目是 O(k log n) 每次调用 minheap.dequeue 都需要 O(log n),而您正在进行 k 次调用。

如果您有足够的内存将所有内容保存在内存中,则此方法有效。如果您没有足够的内存,假设您正在处理两个绝对巨大的文件,那么过程会略有不同。参见 Time complexity of Kth smallest using Heap