例えば、10個のリンゴがあるとします。リンゴの大きさに同じ物は無いと仮定します。(大きさはユニーク)
その10個のリンゴの大きさに順位を付けたいのですが、絶対的な値を取得する「計り」の様な装置は無く、天秤にのせて重さの比較をする事により、順位を求めたいです。(天秤にはリンゴをひとつずつしか乗せられないとします。)
比較の作業をなるべく少なくしたいです。どのように比較したらよいでしょうか?
また、示した例ではリンゴは10個でしたが、リンゴの数がn個になった時の比較の回数の求め方も知りたいです。
以下、完結できてませんが自分のこれまでの考えです。
ABCDEFGHIJ
A□■■■■■■■■■
B□□■■■■■■■■
C□□□■■■■■■■
D□□□□■■■■■■
E□□□□□■■■■■
F□□□□□□■■■■
G□□□□□□□■■■
H□□□□□□□□■■
I□□□□□□□□□■
リンゴをA~Jとした場合、■の部分の比較をすれば良いかと考え、
比較回数は、N*N/2 - Nかなと思ったのですのですが、もっと少ない比較で答えを求める事が可能かと思いました。
なぜかと言うと、例えば、A:B比較後にB:C比較の結果がA<B、B<CならA-C比較は不用になると考えたからです。
A:B、B:C比較の結果がA>B、B<Cになれば、A:Cの比較は必要になるので確立的要素も必要になるのかとも思います。
どのようなご指導でもかまいません、○○について調べろなどのキーワードをくださるだけでもありがたいです。
以上、よろしくご指導の程、お願い申し上げます。
No.5ベストアンサー
- 回答日時:
どうして「ソートについて調べても、あまり役に立たたないというのが実感なんです。
」と思うのか不思議です。n個のものがあれば,その並び方の数はn!個あります。m回比較して順位が確定するとすれば2^m>=n!です。つまりm>=ceiling(log(n!))ですね。(対数の底は2だとしています。ceilingはそれ以上の整数で最も小さい数です。)
n=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16に対して
ceiling(log(n!))=0,1,3,5,7,10,13,,16,19,22,26,29,33,37,41,45
ですからceiling(log(n!))回で順位が確定する方法があれば,それが最低の回数だと分かるのです。
Ford-Johnson アルゴリズムを使えば比較の回数は
F(n)=0,1,3,5,7,10,13,16,19,22,26,30,34,38,42,46
F(n)=Σ[k=1からnまで](ceiling(log(k*3/4)))
ですからnが11までなら最低回数であることが保証されます。(実はn=12,13,14,15でも最低回数ということが証明されているらしい。)
「実際のこれをパソコンを使ってシステム化」しようとすると,あまりネット上に情報がないので難しいかもしれない。
でも,例えばマージソートを使えば
M(n)=0,1,3,5,8,11,14,17,21,25,29,33,37,41,45,49
で順位付けが完了します。そんなに悪くないでしょ。
一般的なnに対して最も比較回数が少ない方法はわかっていません。したがってプログラム化するにはある程度妥協する必要があります。あなたが対象としているnはどの程度の数なんでしょうか?
この回答への補足
>あなたが対象としているnはどの程度の数なんでしょうか?
ん~ 実は言いたくないのですが、(言うと何が目的がばれそうで。。w)かなり大きな値です。
比較に所用する時間は一ヶ月以上とかですねw
No.7
- 回答日時:
繰り返しになるところもありますが。
「順位」という相対的な値を求めるのが、ソートです。
300gのリンゴが「何番目」になるかは、他のリンゴ次第です。
比較ソートで比較するのは、2値の「相対的な関係」です。
ソートのプログラムによくでてくるコードに、次のようなものがあります。
if A[ j ] < A[ i ] then
コンピュータでやっているので、内部では数値計算しているかもしれません。
しかし、やっているのは、 A[j]とA[i]のどちらが大きいか、天秤で調べるようなものです。
「<」という演算子に惑わされているのなら、こういうことです。
if 「A[ j ] と A[ i ] を天秤に乗せて、A[j]が上になった」 then
画像の比較なら、こういうことです
if 「A[ j ] と A[ i ] を表示したら、A[j]が『良い』と判断された」 then
ifの中にこれだけの処理を書ける言語はあまりありませんが、
「Aj と Ai を表示して、Ajが『良い』と判断されたらTrue」という関数 ImageCompareを定義すれば
if ImageCompare(A[ j ], A[ i ] ) then
という、ごくありふれたコードになります。
ソートのアルゴリズムは、一般化すれば次の通りです
1. 目的の合致した Ai, Aj を選ぶ
2. Ai, Aj の大小関係を比較する
3. 2.の結果によって(入れ替え等の)処理を行う。あるいは、何もしない
4. 1~3を必要な回数繰り返す
アルゴリズムの違いは、1,3,4の違いです。
1の違いは、 どんな組み合わせで調べるのか、同じ Ai,Aj の組合せを何回評価する可能性があるのか、に関係します。
4の「必要な回数」は、1に依存します。
アルゴリズムの選択を間違えれば、 同じ組合せを何回も評価しなければならない上、比較の総回数も増えます。
アルゴリズムをよく調べてください。効率のいいソートでは、同じ組合せを比較しないように工夫されています。
挿入ソートでは、比較は常に「これまでに順位が決定した物」と「これから順位を決めようとしている物」の組合せです。
マージソートは、トーナメント戦を、負けたチームを吸収しながら勝ち進む感じになります。比較対象は常に「敵チーム」であり、一度対戦した相手は「自チーム」になるので、二度と対戦することはありません。
ソートのアルゴリズム自体は、コンピュータとは関係ありません。
比較回数、組み合わせ、順序等が関係する、数学の一分野です。
No.6
- 回答日時:
御節介とは思いますが,やっぱりソートが何なのかわかっていないようなので老婆心ながらもう一度回答させてもらいます.
たぶんあなたの頭のなかではソートアルゴリズムとは次のようになっているのではないかと想像します.
[目的] リストの要素を一列になるように並び替えたい
[束縛] コンピュータの計算時間を短くしたい
[仮定] 計算時間は比較回数に比例する
[結論] 比較回数がなるべく少なくなる方法を探そう
この比較回数がなるべく少なくなる方法というのが先人たちが工夫してきたソートアルゴリズムたちです.
さて以前の質問(参考URL) を見ると本当にしたいことはリンゴの例とは少し違うように思われます.が,もし一定の設定を満たすならば話は同じです:
[目的] 大量にある画像を優劣をつけ,一列に並び替えたい
[束縛] 比較をする人間への負担を少なくしたい
[仮定] 負担は比較回数に比例する
[結論] 比較回数がなるべく少なくなる方法を探そう
なのでこれはソートの問題です.
で,その一定の条件ですがそれは「順序」が全順序であることです.自然言語の「順序」と数学者の使う「順序」という言葉は同じですが,細部が異なります.実際に使うときには本当に全順序になっていると見做してよいのかを検討すべきです.自然言語の「順序」に対応する概念としては半順序(数学者の言う順序は普通コレ),全順序,擬順序などがあります.定義はご自分で調べてください.もし別の順序だったのならソレ用のアルゴリズムを考えるべきです(し,そもそもこれらのどれにもならないかもしれません.人間の負担は一旦,無視して小さな予備実験を行い,どんなデータと向き合っているのかをまずハッキリさせては?)
参考URL:http://oshiete.goo.ne.jp/qa/8391364.html
ask-it-auroraさん、ご回答ありがとうございます。
測定対象に、相対的な値をつける事が目的です。相対的な値がついてしまえば、ソートについて悩む事は全くないのです。
なので、ソートのロジックに何を採用するかなどは、どうでも好い問題と思えてしまうのですが、比較によって相対的な値を求めるという事の本質がソートであると言う事なのでしょうか。。。
No.4
- 回答日時:
「順位を付ける」ことと「順番に並べる」ことは等価です。
「1位を 求める」ことは「先頭にくるものを探す」ことです。
ソートのプログラムにも、実際に並び変えるのではなく、順位にあたる番号を付与する、というものもあります。
今回の問題は「ソート」について調べるのが正解です。
kmeeさん、ご回答ありがとうございます。
これはソートの問題であると、他の回答者様の多くもそうご回答頂いたのですが、実際のこれをパソコンを使ってシステム化しようと考えると、なにか違和感を感じるのです。ソートについて調べてみると、コンピューターでソートを行ううえでのアルゴリズムである前提が多く、比較は確かに処理時間を左右するコストであり、比較回数が少ないというのは一つの指標となっているのですが、私が求めているのは、仮に処理全体で所用する時間が遅くても、比較の回数そのものが少ない事が優先されるのです。絶対的な値の取得が、もし済んでいて、それがデータ化されてコンピュータに取り込まれている状態であれば、ソートのアルゴリズムが何であれ処理時間は非常に短い時間であり、それは二つのリンゴを天秤にかけて比較する時間とくらべたら、無に等しい時間です。
なので、ソートを行う過程で、出題に示したようなA:Bの比較を実施した後は、B:Aの比較はしたくないのは無論、A:B、B:Cの比較後、A:Cの比較が不用であれば、そのような比較を人間に求めないようなサポートをコンピュータにやらせたいというのが真の目的です。
と、いいますか、簡素に申し上げれば、ソートについて調べても、あまり役に立たたないというのが実感なんです。
No.2
- 回答日時:
> これはソートの問題だとお考えですか?
はい.ソートというとGIFアニメでよくあるピョコピョコ並び替えるのをイメージしがちですが,並び替えというイメージに引きずられないようにもっと抽象的に考えればいいと思います.つまりソートとは「有限集合上に与えられている未知の全順序を決定するアルゴリズム」なので,リンゴ10個の重さの順位づけもソートの問題です.
現実の試合などはするたびに結果が変わり得ますし,相性があって全順序にならなかったりするのでその限りではありませんが.
No.1
- 回答日時:
検索すべきキーワードは「比較ソート」です.たとえば「マージソート」なんかがお手軽だと思います(僕は手でテストの解答用紙を番号順に並
べるときにこんな感じでやりました.)比較回数は大体N*ln(N)くらいです.これについても「計算時間 アルゴリズム」などと検索すればいろいろでるでしょう.この回答への補足
ask-it-auroraさん、ご回答ありがとうございます。
私も当初はソートの問題かと思ってたのですが、これはソートの問題ではないような気がしてきまして、このような質問を数学のカテゴリでしてみました。 まったくもって入れ替えの事を考える必要はなく、比較することにより、最終的な相対的な値を求める事が目的なのです。同じ値どうしによる比較を重複して行いたくないのが目的です。他の例で例えるならば、計りによるリンゴの計測でなく、計測は「試合」のような物と考えてほしいのです。同じ相手との試合をする事無く、一位からビリまで順位をつけるにはどうしたらよいかという問題です。 こう補足してもこれはソートの問題だとお考えですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Excel(エクセル) Excelで、ゴルフ場、ボウリング場、フィットネスクラブの利用者数比較をしたいです。 しかしフィット 4 2022/11/20 22:17
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- 高校 方程式の証明 5 2022/05/12 09:29
- 英語 "beside"と比較級の共起の可否について 5 2022/11/15 09:51
- その他(プログラミング・Web制作) AIによる詩作成 3 2023/06/28 11:12
- 教育・学術・研究 上場企業において、採用した若手社員が実際に活躍できているのか、またはできていないのか比較分析したいで 1 2022/10/02 15:10
- Word(ワード) 数値に差のあるデータを分かりやすく比較する方法について。医療現場におけるヒヤリハットの発生件数を事例 3 2022/07/18 14:24
- その他(悩み相談・人生相談) 妹が何においても私と比較してきます。 妹は私よりも優秀で私は比較しない様にしてるのですがそれでも比較 5 2022/10/27 01:43
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mathematicaに関する質問 Sumに...
-
量子コンピュータとか、量子コ...
-
チューリングマシンとオートマ...
-
数値計算の参考書についての質...
-
大学受験でタンジェントについて
-
離散数学
-
0.5時間などの時間計算の方法
-
1000分の3は何%ですか
-
logeの計算
-
1÷0の答えを教えて下さい
-
1000分の10の計算の仕方を教え...
-
1000円の3割の計算教えて下さい
-
10の0.3乗って??
-
20000円の3分の2の計算のしかた...
-
結果が負の帯分数になる計算
-
ExcelでLog10を自然数に直すには
-
kDaからbpへの変換について
-
繰り上がりを書く場所は?
-
土嚢1体で何m3入りますか?
-
付き合った日を1日から数える...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
量子コンピュータとか、量子コ...
-
計算方法について:人数の違うチ...
-
チューリングマシンとオートマ...
-
mathematicaに関する質問 Sumに...
-
パソコンをつなげて高性能化?
-
物理乱数と真性乱数の違いは何...
-
すばやく素因数分解する方法は?
-
チューリングマシン ...
-
数列の最後尾を先頭に繋げて作...
-
二位じゃダメなんですかのコン...
-
人工衛星などのコンピューター
-
6-7高校数学
-
確率 統計 検定
-
サーバーのアクセス数と負荷に...
-
評価関数の作成について
-
0.5時間などの時間計算の方法
-
1000分の3は何%ですか
-
付き合った日を1日から数える...
-
結果が負の帯分数になる計算
-
複写機を購入した購入と同時に6...
おすすめ情報