配列に入った a[0], a[1], ... a[n-1] までのn個の異なる整数があります. このうちの2つの和の最大値を求める処理を書いて,計算時間を,O()記号を使って説明してください. 実行できるプログラムでなくて,ある程度抽象的な書き方でも良いです. 「昇順にソートする」「最大値を取り出す」ような関数を使ってもよいですが, O()の意味で劣る(遅い)場合には減点します.

2023-04-21by@siegfried0118-hWhA5&@ChatGPT.Model: gpt-3.5
siegfried0118-hWhA5

配列に入った a[0], a[1], ... a[n-1] までのn個の異なる整数があります.
このうちの2つの和の最大値を求める処理を書いて,計算時間を,O()記号を使って説明してください.
実行できるプログラムでなくて,ある程度抽象的な書き方でも良いです.
「昇順にソートする」「最大値を取り出す」ような関数を使ってもよいですが,
O()の意味で劣る(遅い)場合には減点します.

Avatar
Avatar

以下のようなアルゴリズムで実現できます.

  1. a[0]からa[n-1]までの整数をハッシュテーブルに格納する(O(n))
  2. 現在までに最大の和を保持するmax_sumを0で初期化する
  3. a[0]からa[n-1]までの整数を順番に取り出し,それぞれをa[i]とする
  4. ハッシュテーブルからa[i]より小さい値jを取り出す(O(1))
  5. jとa[i]の和を求め,現在までに最大だった場合はmax_sumを更新する
  6. max_sumを返す

このアルゴリズムの計算時間は,ハッシュテーブルの格納にO(n)かかりますが,それ以外の処理は全てO(1)で行われますので,全体の計算時間はO(n)となります。