teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

加筆

2020/04/25 22:04

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  しかし、計算量を減らす工夫はできます。
4
4
  まず、入力された数字を~~小さい順~~**大きい順**に並べ替えます。
5
5
  そして、最初に集合S = {0}を考えます。
6
- 一番~~小さい~~**大きい**数字が7で、それが2つあるとき、Sに対して、Sの各要素に7を1回足した集合Tと、7を2回足した集合Uを考えます。そして、Sの要素にTとUの要素を追加します。この時点でSは{0,7,14}となります。あとは入力された各異なる数に対して同様に考えます。
6
+ 一番~~小さい~~**大きい**数字が7で、それが2つあるとき、Sに対して、Sの各要素に7を1回足した集合Tと、7を2回足した集合Uを考えます。そして、Sの要素にTとUの要素を追加します。**このとき、TにSの要素とUの要素を追加して、Sと置き換えます。**この時点でSは{0,7,14}となります。あとは入力された各異なる数に対して同様に考えます。
7
7
 
8
8
 
9
- 4/26追記:数学の理論としては先の通りなのですが、集合の実装として、2分木を用いている場合、小さい順に追加していくと、木の生成が不均一となり、深さが2^nに比例する、という致命的な欠陥に気がつきましたので、該当箇所を修正しました。
9
+ 4/26追記:数学の理論としては先の通りなのですが、集合の実装として、2分木を用いている場合、小さい順に追加していくと、木の生成が不均一となる、という致命的な欠陥に気がつきましたので、該当箇所を修正しました。

1

アルゴリズムの修正

2020/04/25 22:04

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -1,6 +1,9 @@
1
1
  結論から言うと、計算量のオーダーを下げるアルゴリズムは存在しません。例えばn個の数字が1,2,4,8,...であれば、その和は0から2^n-1までのすべての数で、単純計算でn*2(n-1)回程度の可算が必要です。
2
2
 
3
3
  しかし、計算量を減らす工夫はできます。
4
- まず、入力された数字を小さい順に並べ替えます。
4
+ まず、入力された数字を~~小さい順~~**大きい順**に並べ替えます。
5
5
  そして、最初に集合S = {0}を考えます。
6
- 一番小さい数字が7で、それが2つあるとき、Sに対して、Sの各要素に7を1回足した集合Tと、7を2回足した集合Uを考えます。そして、Sの要素にTとUの要素を追加します。この時点でSは{0,7,14}となります。あとは入力された各異なる数に対して同様に考えます。
6
+ 一番~~小さい~~**大きい**数字が7で、それが2つあるとき、Sに対して、Sの各要素に7を1回足した集合Tと、7を2回足した集合Uを考えます。そして、Sの要素にTとUの要素を追加します。この時点でSは{0,7,14}となります。あとは入力された各異なる数に対して同様に考えます。
7
+
8
+
9
+ 4/26追記:数学の理論としては先の通りなのですが、集合の実装として、2分木を用いている場合、小さい順に追加していくと、木の生成が不均一となり、深さが2^nに比例する、という致命的な欠陥に気がつきましたので、該当箇所を修正しました。