• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

二分探索-グラフ

date: 2022-12-12 excerpt: グラフの二分探索について

tag: アルゴリズム二分探索グラフ


グラフの二分探索について

概要

  • X軸・Y軸を独立に考えることで、グラフ上の二分探索を行うこともできる
  • 二分探索は連続的な大小が成立するときを発送しがちであるが、false, trueの境い目を探すこともできる
    • lo, hiのパラメータは最大(or 最小)の判別関数を満たすindexを得ることができる

具体例

  • 概要
    • 2Dグラフ上に黒い模様があるときに、それを囲む最小の四角形の面積を求める
    • dfsで模様のindexを計算してもよいが、二分探索でも可能
    • 黒い模様は一つしかない前提
def minArea(image: List[List[str]], x: int, y: int) -> int:
    # 最小のcheck_funを満たすindexを返す
    # lo == hiでbreakとなる
    def binary_search(lo, hi, check_fun):
        while lo < hi:
            mid = (lo + hi) // 2
            if check_fun(mid):
                hi = mid
            else:
                lo = mid + 1
        return lo
    top    = binary_search(0, x,             lambda x: '1' in image[x])
    bottom = binary_search(x, len(image),    lambda x: '1' not in image[x])
    left   = binary_search(0, y,             lambda y: any(row[y] == '1' for row in image))
    right  = binary_search(y, len(image[0]), lambda y: all(row[y] == '0' for row in image))
    print(top, bottom)
    print(left, right)
    return (bottom - top) * (right - left
  
minArea(image = [["0","0","1","0"],["0","1","1","0"],["0","1","0","0"]], x = 0, y = 2) # 6
"""
0 3
1 3
"""

参考

  • 302. Smallest Rectangle Enclosing Black Pixels/LeetCode


アルゴリズム二分探索グラフ Share Tweet