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

Kadaneのアルゴリズムを使用して最大サブアレイ問題を解決するPythonプログラム


Kadaneのアルゴリズムを使用して最大のサブ配列を見つける必要がある場合、サブ配列の最大値を見つけるのに役立つメソッドが定義されます。イテレータは、最大サブ配列を追跡するために使用されます。

以下は同じのデモンストレーションです-

def find_max_sub_array(my_list, beg, end):
   max_end_at_i = max_seen_till_now = my_list[beg]
   max_left_at_i = max_left_till_now = beg
   max_right_till_now = beg + 1
   for i in range(beg + 1, end):
      if max_end_at_i > 0:
         max_end_at_i += my_list[i]
      else:
         max_end_at_i = my_list[i]
         max_left_at_i = i
      if max_end_at_i > max_seen_till_now:
         max_seen_till_now = max_end_at_i
         max_left_till_now = max_left_at_i
         max_right_till_now = i + 1
   return max_left_till_now, max_right_till_now, max_seen_till_now

my_list = input('Enter the list of numbers... ')
my_list = my_list.split()
my_list = [int(x) for x in my_list]
beg, end, max_val = find_max_sub_array(my_list, 0, len(my_list))
print('The maximum subarray begins at index {}, ends at index {}'
   ' and its sum is {}.'.format(beg, end - 1, max_val))

出力

Enter the list of numbers... 2 5 7 12 6 8
The maximum subarray begins at index 0, ends at index 5 and its sum is 40.

説明

  • 「find_max_sub_array」という名前のメソッドが定義されており、3つのパラメーターを取ります。

  • 指定された範囲内の最大のサブ配列が見つかりました。

  • 最大サブ配列の左右のインデックスがその合計とともに返されるタプルを返します。

  • ループは、インデックスiで終わる最大のサブ配列をチェックするために使用されます。

  • これは、すべてのサブアレイの最大値です。

  • このメソッドは、ループが左右のインデックスを繰り返すため、これまでに見られたサブ配列の最大合計も追跡します。

  • メソッドの外部では、番号のリストはユーザーによる入力として取得されます。

  • これはパラメータとしてメソッドに渡されます。

  • コンソールに出力として表示されます。


  1. Pythonでプリムのアルゴリズムを使用してMSTを見つけるプログラム

    グラフが与えられ、そのグラフから「最小スパニングツリー」(MST)を見つけるように求められたとします。グラフのMSTは、すべての頂点が存在して接続され、サブセットにサイクルが存在しない加重グラフのサブセットです。 MSTの合計エッジ重みがグラフから可能な限り最小であるため、MSTは最小と呼ばれます。したがって、ここではプリムのMSTアルゴリズムを使用して、特定のグラフからMSTの合計エッジウェイトを見つけます。 したがって、入力が次のような場合 、頂点の数(n)は4で、開始頂点(s)=3の場合、出力は14になります。 このグラフのMSTは次のようになります- このMSTの合

  2. Pythonを使用して最大の確率でパスを見つけるプログラム

    n個のノード(ノードには0から番号が付けられます)を持つ無向加重グラフがあるとします。このグラフは、エッジリストを使用して入力として与えられ、各エッジeについて、そのエッジ確率[e]を通過する成功の確率があります。開始ノードと終了ノードもあります。最初から最後まで成功の確率が最大のパスを見つけて、成功の確率を返す必要があります。パスが見つからない場合は、0を返します。 したがって、入力が次のような場合 ノード0から2へのパスが2つあるため、出力は0.24になります。1つは確率0.2、もう1つはノード1を経由するパスの確率は0.4 * 0.6 =0.24で、これが最大です。 これを解