• ベストアンサー

最も計算量の少ない最小値発見について

大量のデータの中から最小値を発見する最も計算量の少ないプロセスを教えてください。 ハードウェア化を想定しています。そのため,できるだけ回路規模を小さくする設計をしたいと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

ランダムに並んだ値の最小値を求めるのって、トーナメントでやっても、順番にやっても、しなければならない計算量自体は「データ数-1」なんですよ。 それ以上速くするなら、並列処理するしかないでしょう。 数値→1の個数に変換するやりかたも、16ビットの数値からの変換だと64kビットの記憶領域が必要です。変換自体はカウンタで実現できそうですが、完全な動作には64kクロック必要です。 データを同時にアクセス可能なら、おそらく、回路規模、速度ともに現実的なのは、トーナメント方式ではないでしょうか? もし、データが順番に入ってくるのなら、頭から単純に比較するのがベストです。 データの入力終了が計算終了となるので、一番早いです。

tyamoroneu
質問者

お礼

>データを同時にアクセス可能なら、おそらく、回路規模、速度ともに >現実的なのは、トーナメント方式ではないでしょうか? 確かに,1の個数へ変換するやり方で少し悩んでいました。 ワンステップで実現可能な方法を模索していましたが,なかなか見つかりませんでした。それに,他のモジュールでメモリを多く使っていて,今のターゲットデバイスではメモリはこれ以上増やせないので・・。 現状のシステムでは,データは同時に入力される設計となっています。 やはり,トーナメント方式を採用することがベストなのでしょうか、、 あと,2つの数の比較法ですかね。 現状は普通に (最小の数が複数ある場合,どれか一つを選択) if(a1 > a2) windata <=a2 (dataの格納)       winnumber <= b2 (dataを持つ変数の格納) else windata <= a1       winnumber <= b1 として,定義しています。 しかし,二進数のデータでは上からビット単位で比較を行えばデータの全てを検索しなくても動作が出来そうで, 10101001010 10010101010 この二つのデータでは,上の3ビット目で大小が決めることが出来ます。 ビット単位の比較法とif文による比較のどちらが適切でしょうか?

その他の回答 (5)

  • uwi
  • ベストアンサー率74% (55/74)
回答No.6

回答番号:No.3で示したのは最速の例です。現実的にはデータの分布などにあわせて変換を考えることになると思います。 例えば最上位だけ残して a1 = 4 = 0100 変換-> 0111 a2 = 1 = 0001 変換-> 0001 a3 = 2 = 0010 変換-> 0011 a4 = 7 = 0111 変換-> 0111 とします。このやり方だと大きい数値ばかり(最悪条件)だと問題なのですが、そういうパターンが起こりえないデータであれば利用できます。上位はNo.3で下位は上のやり方とか他にもいろいろ考えられると思います。 あと、データがまばら(0~10^10の中から100個とか)の場合は単純に比較する方が殆どの場合に速くなります。 結局のところNo.3に書いたようにデータによってなので、データ分布が想定できないならトーナメント方式で数値比較が安定すると思います。

tyamoroneu
質問者

お礼

>データがまばら(0~10^10) データ値が大きくなると,用意するビットが増える方法なので実装は難しそうです。 良いやり方ではありますが、確実に(最速で)最小値を求めるためには,まだまだ改良が考えられそうです。 また、データにによっては,こちらの方がいい場合もあるかもしれません。 総当り,二分木、クイック、マージetc 以外の新しいやり方だと思います。 回答ありがとうございます。

  • uwi
  • ベストアンサー率74% (55/74)
回答No.4

わかるとは思いますが、回答番号:No.3でORとANDを間違えてます。 最大も最小もいける例と言うことで… ちなみにこういう考え方は、最小値探索するのには数値の比較が不可欠だと思い込むと、一生たどりつけないので柔軟な思考が大切です。

tyamoroneu
質問者

補足

データ数が増加しても,計算量が変わらず小さい回路でシステムを設計する方法は何かありませんか? スピードを上げることより,スピードを落とさず計算量を減らす方法

  • uwi
  • ベストアンサー率74% (55/74)
回答No.3

> 現在、二分木を用いて最小値検索 二分木というかたぶんトーナメント方式で、 一回戦はa1とa2,a3とa4,…、少なかった方が勝ち上がって二回戦、同様に三回戦、… というやり方だと思います。ただこれだと1回戦の終了をまたないと2回戦が始められないという問題があります。 で、よくある実装としては、 a1 = 4 変換-> 00001111 a2 = 5 変換-> 00011111 a3 = 2 変換-> 00000011 a4 = 7 変換-> 01111111 … としてORをとって 00000011 逆変換-> 2 という手順で最小値を求めます。こうすることで分散しても待ちが発生しない実装になります。ただ、データの種類がわかっている場合しかできません。 ハードの方はあまり詳しくなのでどっちの実装がいいのかは知りません。

tyamoroneu
質問者

お礼

お答えありがとうございます。 この方法なら、かなりのスピードが期待できると思います。 最小の値をもつ変数の検索にはXORを使えば大丈夫そうですね。 どちらかというと、最小値そのものよりも最小値をもつ変数の方が重要なんです。(最初の説明で書くべきでした) ハードウェア実装への難点は、データの値が1万以上(データ数は1000以上)となると,変換のために用意する変数のビットが大きくなるのと,大量のAND回路とXOR回路を使用するため,回路規模が少し心配です。 回路規模が大きくなりすぎた場合,上位桁と下位桁の多段階に分け、最小値を発見する方法も考えてみます。 上位桁の最小の値の中で下位桁で最小の値を持つ値を探索(スピードが落ちてしまいそうですが) かなり参考になりました。ありがとうございます

tyamoroneu
質問者

補足

今回使用するデータの種類  全てデータは同じビット幅で、符号なし(正の)整数です。

  • doran357
  • ベストアンサー率24% (23/93)
回答No.2

データがソートされているならまだしもランダムな並びのデータだと 総当たりで比較する必要がありますよね。 そもそも質問者は二分木検索しているようだけど これってソートされていて初めて実用になる物ですけどソートしてあるデータなの? それと最小値ならソートされているなら最初と最後を比較すればどっちが最小値(並びが降順か昇順か)わかるから二分木検索すらする必要は無くなるけどどういう事?

tyamoroneu
質問者

補足

回答番号:No4の方の方のおっしゃるとおり、トーナメント方式を採用しています。通常の二分木のような上からの捜査でなく、下から順に比較してく構成です。 データはランダムなデータです。 比較する全てのデータのビット幅は同じで、固定です。

回答No.1

データーを1個ずつAに代入します。 if A < B then B=A これをループしデーター全てをチェックします。 Bの初期値に大まかな値を入れておきます。 これも自動でしたい場合は データーをA1、A2とします。 if A2 < A1 then B=A2 としてループして全数検索してください。

tyamoroneu
質問者

お礼

お答えありがとうございます。 しかし、その方法では比較回数(コンパレータ)がデータと同じ数分必要になりそうです。

tyamoroneu
質問者

補足

説明不足ですいません。 現在、二分木を用いて最小値検索を行っていますが、それ以上に早く、さらにデータ数に比例した回路の増加が少なく、できるだけ小さな回路で構成可能な探索法を探しています。

関連するQ&A

  • エクセル最大値最小値の計算

    あるデータの集まりから最大値最小値を引きたいのですが、一つ一つ計算式を入力するのは大変なので、自動に最大最小を見つけ出して計算させるにはどうしたらよいのでしょう =sum(a2+b2-最大-最小)という風な感じにしたいのですが・・・

  • 最小化したプログラムのメモリ使用量について

    最小化したプログラムのメモリ使用量について タスクマネージャーのプロセスタブを開き、各プロセスが使用しているメモリ量を確認します。 たとえば、IE(当方、社内規定によりIE6利用中)が100MBメモリを使用しているとします。 これを最小化ボタンでタスクバーに納めると、メモリー使用量が激減します(場合によっては2MB程度まで)。 これは、どういう意味なのでしょうか? PFの使用量が変化しないということは、仮想メモリーにデータを退避させ、物理メモリ上の空き領域を増やしているとみていいのでしょうか? 過去の質問の中で、UI部分のメモリーが必要なくなったために少なくなるという回答を見ましたが それは違うのではないかと思っています(キャッシュなどを考えると2M程度で収まるとは到底思えない)。 そもそもIE6はメモリーリークを起こすので、その分が開放された、という話を聞いたことがあります。 これは正しいのでしょうか? 取り立てて困っているわけではありませんが、好奇心というか知りたがりというか・・・。 ご教授のほど、よろしくお願いします。

  • エクセルでの最小二乗法の計算

    化学実験で得られたデータをエクセルを使って計算したいと思っているのですが、 使い方がよく分かりません。 最小二乗法の計算方法。 また、エクセルの使い方が詳しく載っているサイトなどがあれば教えて欲しいです。

  • データ量の計算について

    データ量の計算についての質問です。 一画面30万画素の画面で、256色を同時に表示できるパソコン一画面のデータ量は何Mバイトになるか。 バイトの求め方がいまいちわかりません。 256色は1バイトになるのはわかるのですが、その先の計算方式についてよくわかりません。 答えられる方、詳しく説明できる方いたらお願いします。

  • 標準偏差の計算方法

    最大値と最小値だけが分かっている状態で標準偏差って計算できるでしょうか? たとえば最大値が130で最小値が90と想定したとき、平均は(130+90)/2=110と想定計算できますが、標準偏差はどう計算すればよいでしょうか? 教えてください。

  • 最小二乗法 エクセルと手計算の違いを教えてください。

    最小二乗法をおなじデータで手計算とエクセルそれぞれでやったところ、違う式が求まりました。 どちらかの計算ミスではないとしたら違ってしまったことについてどんな理由が考えられますか?

  • 金型の歪み量の計算

    本当に基本的なことで申し訳ないですが、アドバイスお願い致します。 鋳造による金型の歪み量を計算したいのですが、どのように計算したらよいのでしょうか。 必要なデータ等、計算の考え方等どんなことでも助かります。 よろしくお願い致します。

  • CPUの計算量、計算速度について

    いくつかのゲームやパソコンのCPUは64bitなどのようですが、 64bitというのは、約1844京です。 このデータを約2GHzのスピードで処理する。 すると、2GHzは20億ぐらいなので、 1844京÷20億=92億秒 92億秒、約10万日かかってしまいます。 これはもしかして割るのではなく、かけるのでしょうか? 1844京のデータを1秒間に20億回取り扱える。 1844京×20億が、1秒間に取り扱える限界のデータ量ということでしょうか? ただ、スパコンの京が1秒に計算できる量が「1京」と聞いています。 私の認識はどこが誤っているのでしょうか?

  • Excelで最大値最小値の検出

    皆さん こんばんは。  データのExcel配列は下記のようになっています。空白セル(数は不定)を境目に異なるグループに分け、各グループの最大値あるいは最小値を(グループごとに計算すればできますが、データの量が多いので手間かかります)一遍で検出したいですが、何かいい方法はないでしょうか。皆さん教えてください。宜しくお願い致します。 A列     B列        C列      D列     (時間)  (データ)     (最大値)   〈最小値) 0:00   7.316784186 0:05   7.178492184 0:10   7.031467139 0:15 0:20 0:25 0:30   4.878174647 0:35   3.402687629 0:40   2.051343872 0:45   0.420805671 0:50 0:55   2.175188612 1:00   2.849337126 1:05   3.256652642 1:10 1:15   4.427495186 1:20 1:25 1:30 1:35   6.008051928 1:40   6.773041277  ・    ・  ・    ・  ・    ・  ・    ・

  • 法則を発見したいです。

    お知恵をお貸し下さい。 「1~9までのマスがある。マスにはA・Bが入る。 1つのマスにはA・Bのどちらかのみは入れる。 A・Bをいれると○か×の結果が表示される。 同じ組み合わせでも必ず同じ結果が表示されるわけではない。 結果はある法則に基づき表示される。」 この法則を発見する為に、どのようなデータを取って どのような検討をすればよいでしょうか? データ量はそれほど取れないので(300サンプルほど) 少ないデータ量で発見できれば良いと思っております。