n 個の要素が与えられた場合、要素の中から 2 番目に大きい要素を見つけます。リニアスキャン方式を使用する場合に問題が発生する場合は、
まず最大値を見つけて n-1 回比較します
次に、n-1 個の要素から最大値を見つけ、n-2 回比較します。
2 番目に大きい要素を選択するための分割統治アルゴリズムの設計を考えてみましょう
1. n個の要素を真ん中から2つに分割します
2. 2 つのサブ問題を再帰し、2 つのサブ問題の最大値をそれぞれ見つけ、削除された小さい要素を大きい要素のリストに記録します。削除された要素のリストで、最大値から 2 番目に大きい要素を見つけます。
達成
辞書を使用して、より大きな要素によって削除された要素を保存します。各要素のキーは指定された n 個の要素で、値はこの要素によって削除されたすべての要素を含むリストになります。
1. まず、操作の第 1 段階を実装するために find_max() 関数を定義します。n 要素のリスト a_list と、検出する問題の左右の境界を受け取ります。n個の要素の最大値を出力し、削除した要素を辞書の対応するキーの値に挿入します。
def find_max(arr,left,right):
global dic
if left>=right:
return arr[left]
mid=(left+right)//2
left_max=find_max(arr,left,mid)
right_max=find_max(arr,mid+1,right)
if left_max>right_max:
dic[left_max].append(right_max)
return left_max
else:
dic[right_max].append(left_max)
return right_max
2. find_max 関数を定義します。最大値によって削除された要素のリストを受け取り、リスト内の最大値 (n 個の要素のうち 2 番目に大きい要素) を順に検索します。
def find_second(n_max):
n=len(n_max)
second_max=n_max[0]
for i in range(1,n):
if n_max[i]>second_max:
second_max=n_max[i]
return second_max
arr=[6,12,3,7,2,18,90,87,54,23]
n=len(arr)
dic={}
for i in range(n):
dic.update([(a_list[i],[])])#初始化字典列表
first_max=find_max(a_list,0,n-1)
second_max=find_second(dic[first_max])
print(dic[first_max])
print(second_max)