ヒープの基礎

概要

  • ヒープは特別な二分木
  • 完全二分木である
  • 親ノードの値は子よりも小さい(最小ヒープのとき)
  • 配列で実装できる。親iの子は2i+1, 2i+2
  • 挿入と削除がO(logn)、最小値の参照がO(1)
  • priority queueのようにも参照される。違いは必ず最大優先度のノードが削除されること

10.1 ソートされたリストの統合

  • 入力:<3,5,7> <0,6> <0,6,28>
  • 出力:<0,0,3,5,6,6,7,28>

brute-force

  • すべて連結してからソート
  • time O(nlogn)

best solution

  • k: number of input sequences
  • space O(k)
  • time O(nlogk)
    • insert O(logk) x for all element n
  def merge_sorted_arrays(sorted_arrays):
    min_heap = []
    sorted_arrays_iters = [iter(x) for x in sorted_arrays]
    
    for i, it in enumerate(sorted_arrays_iters)
      first_element = next(it, None)
      if first_element is not None:
        heapq.heappush(min_heap, (first_element, i))
    
    result = []
    while min_heap:
      smallest_entry, smallest_array_i = heapq.heappop(min_heap)
      smallest_array_iter = sorted_arrays_iters[smallest_array_i]
      result.append(smallest_entry)
      next_element = next(smallest_array_iter, None)
      if next_element is not None:
        heapq.heappush(min_heap, (next_elelement, smalletst_array_i))
    return result
    
このエントリーをはてなブックマークに追加
Takatomo Honda avatar
About Takatomo Honda
システム開発 / プロトタイプ開発 / 開発組織の構築 / アプリケーションの内製化 /等、お気軽にご相談ください。