Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】リストが最大ヒープを形成しているかどうかを判定する方法

リストがヒープツリー(完全二分木)を表していると仮定します。このとき、その要素が最大ヒープ(max heap)を形成しているかどうかを判定する必要があります。

最大ヒープとは、すべての親ノードがその左右の子ノードのどちらよりも大きい(または等しい)という性質を持つヒープのことです。

たとえば、入力が nums = [8, 6, 4, 2, 0, 3] の場合、出力は True になります。これは、すべての親要素がそれぞれの子要素より大きいためです。

【Python】リストが最大ヒープを形成しているかどうかを判定する方法

解決手順

この問題は、次の手順で解決できます。

  • n := nums のサイズとする
  • i を 0 から n - 1 までループする
    • m := i * 2
    • num := nums[i]
    • m + 1 < n の場合:num < nums[m + 1] なら False を返す
    • m + 2 < n の場合:num < nums[m + 2] なら False を返す
  • 最後に True を返す

ここで重要なのは、配列形式のヒープでは「インデックス i のノードに対して、左の子は 2i + 1、右の子は 2i + 2 の位置に存在する」という性質です。この性質を利用することで、実際に木構造を構築しなくても、配列を一度走査するだけで判定できます。計算量は O(n) と非常に効率的です。

実装例

以下の実装を見ると、より理解しやすくなります。

def solve(nums):
    n = len(nums)
    for i in range(n):
        m = i * 2
        num = nums[i]
        if m + 1 < n:
            if num < nums[m + 1]:
                return False
        if m + 2 < n:
            if num < nums[m + 2]:
                return False
    return True

nums = [8, 6, 4, 2, 0, 3]
print(solve(nums))

入力

[8, 6, 4, 2, 0, 3]

出力

True
  1. Pythonで点が凸包を形成しているかどうかを判定する方法

    多角形の外周にある頂点が時計回りの順序で与えられているとします。このとき、これらの点が凸包(コンベックスハル)を形成しているかどうかを判定する必要があります。 上の図からも分かるように、凸多角形では連続する3つの頂点からなる内角がすべて180°以下になります。つまり、すべての角度が180°以下であれば、その多角形は凸包であると判断できます。 例えば、入力が points = [(3,4), (4,7), (7,8), (11,6), (12,3), (10,1), (5,2)] のような場合、出力は True になります。 解法のアプローチ この問題を解くには、以下の手順に従います。 n

  2. 指定された文字列がキーワードであるかどうかを確認するPythonプログラム

    この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ