計算アルゴリズム【U ..
[2ch|▼Menu]
511:503
07/05/13 18:40:21
つまりのところ、厳密解を求めるなら、あまり良くないヒューリスティック
を用意した時、A*(と色々な改良版)が最速ってことですか。
というか、授業で習ったダイクストラとA*しか知らない物で^^;

近似についても、微妙な改良版くらいしかないって事ですね。

512:デフォルトの名無しさん
07/05/13 19:42:30
>>511
とにかく実行速度をなんとかしたいという実用的な要求なら、
問題にあったヒューリスティックとヒープを設計して A* が
たぶんもっとも現実的だと思う。

近似は、微妙な改良版といっても、たとえば幾何グラフとかなら
普通の Dijkstra と比較して一億倍以上早くなるケースもザラなので、
具体的な問題を見ないとなんともいえないところ。

513:503
07/05/15 01:35:21
ありがとうございます。じゃヒューリスティックに精を出してみることに
します。ちなみに問題は経路探索です。

514:デフォルトの名無しさん
07/05/15 22:13:04
>513
ちなみに、カーナビの経路探索だと、ネットワーク側の方を階層的にいくつか持って切り替えることによって高速化してる。
現在地、目的地近辺では全道路のネットワークで探索、それで見つからなければ国道以上のネットワークに移って探索、
さらに探索する場合は高速道路のみのネットワークに移って探索、みたいな感じ。
もちろん最適解は出ないけど、そもそもカーナビの場合、計算で出てくる最適解が、ドライバーにとって最適になるとも限らないしね。

515:503
07/05/15 23:00:45
あぁ、なるほど、中距離の探索とかで、たまにすごくアホな間違いをするの
はそれが理由なんだ。

516:デフォルトの名無しさん
07/05/16 01:49:50
いや
渋滞回避してるだけだろう


517:デフォルトの名無しさん
07/05/29 07:24:16
スレリンク(jisaku板)
上記スレで強制NaNの計算でインテル不利にするベンチが論争を呼んでますが
極端にAMD不利にする方法を探しています。
では。



518:デフォルトの名無しさん
07/07/10 16:03:47
多倍長演算の割り算のアルゴリズムで
たとえば521を21で割るとき

まず521が三桁で20が二桁だから答えも二桁だろう

2桁目を決めよう

答えは10かな?21*10=210で521より小さい

じゃ20かな?21*20=420<521

じゃ30かな?21*30=630>521(もし90でも超えなければ二桁目は9にする)

大きくなったからおそらく答えの2桁目は2だろう

次は1桁目・・・

こんなのを考えたのですが、もっと良い方法はないですか?

519:デフォルトの名無しさん
07/07/10 16:04:24
age

520:デフォルトの名無しさん
07/07/10 17:02:29
何このマルチレス

521:デフォルトの名無しさん
07/07/10 20:02:17
10,20,30...
だったら時間掛かるだろ

522:デフォルトの名無しさん
07/07/10 21:23:37
自分で考える前にまず一般にどういう方法が使われているかを知れ
せっかく苦労して自分で考えついたとしても
それが既にみんなが普通に使ってるものと同じやそれ以下だったら悲しいだろ?

523:デフォルトの名無しさん
07/08/15 23:41:39
URLリンク(ss.nkk.affrc.go.jp)
に記述されている、
図4の(a)から(b)の結果はどのようなアルゴリズムになりますか?


524:デフォルトの名無しさん
07/08/16 00:12:41
マルチうぜえ

525:デフォルトの名無しさん
07/08/18 19:37:21
ウィキペディアでB木の項を参照すると、
B+木やB*木というものが存在するとに書いてありますが、
どういったものですか?

>(厳密にはB木の改良型であるB+木やB*木を使うことが多い)


526:デフォルトの名無しさん
07/08/18 20:07:24
B+ は B であって、キーを葉にのみ格納するもの
B* は B で、子の比が 1/2 だったところを 2/3 にしたもの

wikipedia の情報は不正確だから参考にすんな
ちゃんとした教科書とか論文を参照すれば分かるだろ

527:デフォルトの名無しさん
07/08/18 22:38:43
>>526
ありがとうございました。
ウィキペディアから引用したら怒らせてしまった様で。
たまたま名前が載ってたから出しただけです。
B+木B*木は名前だけは以前から知ってましたが、
ググっても関係しそうなのは引っかからないですね。
本は
アルゴリズム事典
はじめてのアルゴリズム入門
アルゴリズムとデータ構造
など持ってますが、載ってないみたいです。

>教科書とか論文
できればこれのポインタ教えてください。

528:デフォルトの名無しさん
07/08/18 23:24:10
>>527
誰が怒っているの?

529:デフォルトの名無しさん
07/08/19 03:52:13
>教科書とか論文
できればこれのポインタ教えてください。


530:デフォルトの名無しさん
07/08/19 07:29:10
>>527
B-plus-tree とか B-star-tree で検索すればいくらでも出るんだけどね。

教科書については、そんな一般的なアルゴリズムの本には
あまり出てなくて、データベースよりの本を見ないとダメ。
R. Ramakrishnan, J. Gehrke, "Database Management Systems", 3rdEd. McGlaw-Hill, 2002

まあ次のサーベイ論文がよくまとまってるので、これを読んでおけば十分だろうけど。
D. Comer, "Ubiquitous B-Tree", ACM Computing Surveys, 1979
(URLリンク(www.cl.cam.ac.uk))

531:デフォルトの名無しさん
07/08/19 18:25:09
便乗だけど、B木と赤黒木どっちがいいか、
って判断はどこら辺ですればいいですか?
使い分ける時の基準みたいなのが知りたい。

532:デフォルトの名無しさん
07/08/19 19:19:15
>>531
どんな用途に使おうとしてるか分からないので、普通の設定で一般的な話をする。
赤黒木は、本質的にはブロックサイズの小さな B 木なので、
あなたの質問は B 木のブロックサイズをどう選ぶか、という質問と同じ。

普通の実装では、n 個の要素を格納するブロックサイズが b の B 木から
要素を検索には O(log (n/b)) 回の木上の探索(ランダムアクセス)と
O(b) 回のブロック内の探索(シーケンシャルアクセス)が必要となる。

ここで雑な計算をするとブロックサイズは、木上の探索の速度と
ブロック内の探索の速度の比くらいに選ぶのがよいことが分かる。

木が丸ごと全部メモリに乗るような場合は、木のアクセスもブロックの
アクセスも同じくらいなので、ブロックサイズも小さく選ぶのが良い。
一方、ハードディスクやネットワーク上のデータベースのような
木のアクセスが遅く、ブロックのアクセスが早い場合は、
ブロックサイズも大きく選ぶのが良い。

533:デフォルトの名無しさん
07/08/19 19:50:28
>>528 参考にすんな→この人怒ってる怖いよぉ

534:デフォルトの名無しさん
07/08/19 19:54:51
どこぞの園児じゃあるまいし。

535:デフォルトの名無しさん
07/08/19 21:04:07
なんでそんな偉そうなんですか

536:デフォルトの名無しさん
07/08/19 21:04:43
どこが偉そうなの

537:デフォルトの名無しさん
07/08/19 21:37:32
質問を質問で返すな
わかりませんと言え

538:デフォルトの名無しさん
07/08/19 21:40:56
なんでそんな偉そうなの

539:デフォルトの名無しさん
07/08/19 21:41:29
そういうのは質問の体をなしてから言え

540:デフォルトの名無しさん
07/08/19 22:26:02
順序付きコンテナは、どうもトライが最強っぽいんだけど、
メモリが・・
なんとかなりませんか?

541:デフォルトの名無しさん
07/08/19 22:59:51
つ パトリシア

542:デフォルトの名無しさん
07/08/28 05:58:02
2Dの多角形ポリゴン2個(n個)を合成して1個(?)の多角形にするアルゴリズム

ネット上にこれを実装したソースコードが公開されてない(見つからない・・・)のでどなたか教えてください。
__
_|_ |
| |_|_|
|__|

ポリゴン1 = (0,0)-(2,0)-(2,2)-(0,2)-(0,0)
ポリゴン2 = (1,1)-(3,1)-(3,3)-(1,3)-(1,1)
 ↓
__
_| |
| _|
|__|

ポリゴン1+2 = (0,0)-(2,0)-(2,1)-(3,1)-(3,3)-(1,3)-(1,2)-(0,2)-(0,0)

というような感じです。
中抜き( 合成後のポリゴンの内側に穴が開いている )まで考えると、結構むずかしそうで・・・

これでやりたいことは、国土地理院の市町村別のポリゴンデータを県ごとに合成して、県別のポリゴンデータにすることです。
Excel VBAで精細な都道府県地図を描きたいなーと思って、
都道府県の無料のポリゴンデータを探したけど市町村別しか見つからなかったので
じゃあ合成して作ろうか、と思ってたんですが・・・詰まりました。

Java の awt パッケージでポリゴンの合成をしているクラスのオリジナルのソースコードを見ればアルゴリズムがわかるかも
とも思ってみてみたけどソースコードは入っておらず・・・orz

宿題とか課題とかではなくて、あくまで趣味的なものなので急ぎません。
VBでもcでもc++でも良いので、どなたか、お知恵を拝借させてください。

543:542
07/08/28 06:00:14
>>542
図形ずれちゃった・・・
  __
_|_  |
| |_|_|
|__|

ポリゴン1 = (0,0)-(2,0)-(2,2)-(0,2)-(0,0)
ポリゴン2 = (1,1)-(3,1)-(3,3)-(1,3)-(1,1)
 ↓
  __
_|  |
|  _|
|_|

ポリゴン1+2 = (0,0)-(2,0)-(2,1)-(3,1)-(3,3)-(1,3)-(1,2)-(0,2)-(0,0)

こうです。

544:デフォルトの名無しさん
07/08/28 09:44:30
>542
悪いこと言わないから別の方法考えたほうがいいと思う。
塗り分けるだけなら市町村別のデータでも構わないわけだし。

で、
コンピュータ・ジオメトリ―計算幾何学:アルゴリズムと応用 ISBN 476490277X
の第 2 章にアルゴリズムは載ってる。でも、ここから実装まで持っていくのもそう単純じゃないと思う。

あと、オープンソースライブラリの CGAL にそういう機能はある。
URLリンク(www.cgal.org)
Reference Manual の VI Polygon and Polyhedron Operations 辺り。

545:542
07/08/28 21:33:57
>>544
コンピュータ・ジオメトリ―計算幾何学:アルゴリズムと応用 ISBN 476490277Xの第2章 早速読んできました。
例題に挙げられてるのも地図でよさそうだったけど、
プログラミング言語を限定してないアルゴリズムとしての本なんで、
やろうとしていることを実装するには、どういうプログラムを書けばよいのかまでは踏み込めなそうです。

せめて
i ← S1 と S2 の交点
みたいなのがあればなぁ。


CGALのマニュアルも読んでみました。joinあたりのコードか数式が出ていればVBAでも実装できそうなんですが・・・

>悪いこと言わないから別の方法考えたほうがいいと思う。
そうですねー。
ただ、ポリゴンをくっつけるのはもうちょっと粘ってみます。考えるのも楽しいので。

市町村同士は重ならないので、
・辺と辺が重なっている(隣り合っている)ところを見つけてくっつけていく
・中抜きはこの際無視
というように簡単なものを作る方針で考えてみます。
重なりまで考えて汎用的なアルゴリズムにしようと思ったけど、結構しんどそうですので・・・

どうもありがとうございましたー。

546:デフォルトの名無しさん
07/08/29 01:21:12
今日から専門学校のほうで授業アルゴリズムが始まったんですが
時間計算
分時間を入力して○時○分に変換して出力するフローのaとbに該当する処理を記述しなさい。
なお、計算結果は整数部のみとし、小数部は切捨てとなる。
余り(X%Y)で除数の余りを求めることができる。[例、余り(100%3)は1となる]
例:117分の時 1時間57分
(開 始) 何方かa bに入る答えがわかる方いましたら教えてください
  ↓
(データ)・・分時間を入力
  ↓
(処理)・・a 時を求める
  ↓
(データ)・・時を出力
  ↓
(処理)・・b 残りの分を求める
  ↓
(データ)・・分を出力
  ↓
(終了)






547:デフォルトの名無しさん
07/08/29 01:28:01
aとbに入るのは数字?式?言葉?

548:デフォルトの名無しさん
07/08/29 01:39:28
式です^^;

549:デフォルトの名無しさん
07/08/29 01:54:03
a・・・分時間/60
b・・・分時間%60

550:デフォルトの名無しさん
07/08/29 03:31:39
>>546
宿題はスレ違い
しかも回答もらって礼も無しかよ

551:デフォルトの名無しさん
07/08/29 19:38:32
三角関数はマクローリン展開して計算しますよね。
単純に考えればsinθのθが何であれ計算時間は変わりませんが、
速度面でチューニングが施されているであろうライブラリではどうなんでしょう?

552:デフォルトの名無しさん
07/08/29 23:22:57
>三角関数はマクローリン展開して計算しますよね。
ここで間違ってる
関数近似の教科書読むべし

553:デフォルトの名無しさん
07/08/29 23:30:11
>>552
すみません、悠長に教科書読んでる暇がないので結論をお願いします

554:デフォルトの名無しさん
07/08/29 23:36:55
CPUのアーキテクチャ等やライブラリ作った奴の腕に依存して色々な可能性がある
ただ,どれもθを0〜π/2の範囲に正規化してるだろうから
その範囲なら少し速いはず
これ以上は本嫁

555:デフォルトの名無しさん
07/08/30 01:07:36
ぶっちゃけ、今時の単精度演算アクセラレータはテーブル参照プラスリニア補間で済ませている希ガス。

556:デフォルトの名無しさん
07/08/30 07:24:15
>>554
絶対的な速度が問題なのではなく、速度のむらを気にしているのです。
たとえばsin(0.1)を計算するのに1μsかかったとして、sin(0.2)では5μsかかったりするのか?ということです

>>555
ターゲットはマイコンなのでそういう容量食いな方法は取らないような気がします。

ターゲットはSH7145
ルネサスのコンパイラを使ってます。
ただ、ピンポイントでこのコンパイラに通じている方がいるとは考えにくいので
VCやgccだったらどうなのかという意見でもいいのでお願いします。

557:デフォルトの名無しさん
07/08/30 09:28:07
後出し多いな

558:デフォルトの名無しさん
07/08/30 10:04:11
5倍の差はないだろうけど,1〜2割位なら充分あり得る
実測するのが手っ取り早いかと

559:デフォルトの名無しさん
07/08/30 17:45:37
>>556
マイコンの方がむしろテーブル変換使用すると思うが

560:デフォルトの名無しさん
07/08/30 17:47:40
>>554
いっそπ/8に正規化するとか

561:デフォルトの名無しさん
07/09/09 14:05:26
>>553
>悠長に教科書読んでる暇がないので

そうか。残念だったな。

562:デフォルトの名無しさん
07/09/12 02:03:16
差異のアルゴリズムでレーベンシュタイン距離を求めていますが、
結局これ求めてどうなるんですか?
馬鹿でも分かるようにく教えてください。


563:デフォルトの名無しさん
07/09/12 08:42:09
>>562
そんな限られた分野でしか使わないようなものを
さも誰もが知ってるかのように聞かなくても。

自然言語処理とかで使う。
Google 先生とかがよくやってる
もしかして: ○○
を出したりとかに使える。

564:デフォルトの名無しさん
07/09/13 00:02:29
>563
レスどうも。

2つの文字列を比較して"n文字違います"とかは想像できるんだけど、
diffみたいに異なるものを表示するとかの処理にはどうやって組めばいいんだろうと思って、、、

565:デフォルトの名無しさん
07/09/13 00:05:36
>>564
Wikipedia項目リンク

566:デフォルトの名無しさん
07/09/15 23:51:51
今、ロバスト解について勉強しています。
ロバスト解発見手法にはシックスシグマ法のDesign For Six Sigma[Brue 03]やDesign For Multi-Objective Six Sigma[Shimoyama 06]、またはガウスノイズがあるということが分かりました。
しかし、上に述べた手法の利点・欠点がほとんど分かりません。
どなたか他の手法と比べた場合の利点・欠点を教えてはいただけないでしょうか?
下に今分かっていることを書きます。
----------------------------------------------------------------------
Design For Six Sigma[Brue 03]
ロバスト解を1つ発見する場合に有効。

Design For Multi-Objective Six Sigma[Shimoyama 06]
Design For Six Sigma[Brue 03]を拡張したもの。複数のロバスト解を同時に発見する場合に有効。

ガウスノイズ
アルゴリズムは簡単。
ガウスノイズは上に述べたシックスシグマ法を使ったときよりもすばやく収束できる。
吸収現象などのせいでロバスト解からずれた位置に収束するかもしれない。

567:デフォルトの名無しさん
07/09/19 03:20:29
質問させてください.
y=Ax (x,y:ベクトル, A:マトリックス,大きさ数百〜数万)
に対し,
x = inv(A) * y
を解く問題を考えています.
ここで,逆行列演算inv(A)がO(N^3)のコストが掛かり,ネックになっています.
いま,Aは疎な帯行列(しかも対称)という条件があるので,
大幅な計算削減ができるのではないか?と考えております.
例えば,計算コストをO(N^2)にするといったことは可能でしょうか?
キーワードだけでも良いので,知恵を貸していただけると幸いです.


568:デフォルトの名無しさん
07/09/19 03:49:22
つ[特異値分解]

569:デフォルトの名無しさん
07/09/19 07:22:57
>>567
LU使っているのか?
対称行列だと、LDL分解でOK
帯行列だとさらに、0要素を見ないことで、さらにスピードアップ

570:デフォルトの名無しさん
07/09/19 17:36:11
そんな話,数値計算の本見ればいくらでも載ってるだろ

571:567
07/09/20 01:53:07
>>568
キーワードありがとうございます!
調べてみます.

>>569
LU分解→直接法で逆行列としていました.
LDL分解というものがあるのですね.
解法は反復法に持って行くのですかね・・・調べてみようと思います.
反復法は精度の面が少し気になりますが,勉強含めて試してみます.
多謝!

>>570
数値計算の門外漢なもので・・・勉強してきます.

572:デフォルトの名無しさん
07/09/24 22:11:26
kd木で、近い領域を何度も連続して調べたい時、毎回根から辿らないようにショートカットするような技法ってありますか?

573:デフォルトの名無しさん
07/09/28 09:44:52
二つの整列済みリストのマージで
要素数が一方がk個,もう一方が2個の場合,
n回の比較でマージできる最大のkをanとすると
a[n] = [sqrt(2*a[n-1]*(a[n-1]+1))] # []: Gauss記号
で与えられるらしいのですが
これがどういうアルゴリズムでマージしたときの物なのか,
またこれが最良値なのか知りたいのですが, 誰か知りません?


574:デフォルトの名無しさん
07/09/29 14:28:02
>>573
a[n] = [sqrt(2*a[n-1]*(a[n-1]+1))] # []: Gauss記号
この式を見るとnが1増えると√2倍でa[n]は指数的な増加。

ソート済みk個と2個のマージは
2分探索を2回使えば2logk回。
詳しくは見てないが、2logkの係数の2が√2になりそうだし、
kが指数的に増加して比較回数が線形増加もa[n]の式とオーダーは合っている。

575:573
07/09/30 13:03:48
>>574
考えてくれてありがとう.
2分探索だけだと最良値にはならないみたい.
573の式だと最初の10個位までは最良値になってるのは
確認できた(虱潰しで)

さらに知らべて,もう一方のリストが3個の場合みっけた.
Optimal Merging of 3 Elements with n Elements
っていう論文のAbstructで
f3(1)=0, f3(2)=1, f3(3)=1, f3(4)=2, f3(5)=3, f3(6)=4, f3(7)=6, f3(8)=8
r >= 3
f3(3r) = [(43/7)*2**(r-2)]-2
f3(3r+1) = [(107/7)*2**(r-3)]-2
f3(3r+2) = [17*(2**(r-3)-6)/7]-1
との事.

576:デフォルトの名無しさん
07/10/30 01:16:41
各データの値がかなり近い時に
ハッシュのみだとデータの衝突回数
多い場合ってどうやってみんななら解決する?

あとね、kd木で何の本に詳しく載ってますか?


577:デフォルトの名無しさん
07/10/30 01:55:31
値近くてハッシュが衝突するって、どんなアルゴリズムだよ

578:デフォルトの名無しさん
07/10/31 02:27:51
8byteの16進データを
完全ハッシュ化するソースコード置いてある
とこないですか?

579:デフォルトの名無しさん
07/10/31 21:09:37
区分サンプリング法やラテン超方格法のアルゴリズムを教えてください。

580:デフォルトの名無しさん
07/11/28 05:05:51
二点で定義されてる直線上に、ある点があるかどうかを判定するにはどうすればいいですか、教えてください。

581:デフォルトの名無しさん
07/11/28 06:17:51
要は3点が一直線に並んでいるかを知りたい、と解釈し直してみた。
1点を基準に他2点へ直線を引くときの傾きが一緒だったらOK。
x軸と垂直だった場合なんかも考慮すると、
(x1-x0)*(y2-y0)==(x2-x0)*(y1-y0)

582:デフォルトの名無しさん
07/11/28 13:05:52
あ、なるほど、ありがとうございます

583:デフォルトの名無しさん
07/12/07 21:54:02
[N][N]の2次元配列を3つ

[N]の配列を2つ使ってる場合の使用領域のオーダーってO(n^2)におさまります?

584:デフォルトの名無しさん
07/12/07 22:02:42
うん

585:デフォルトの名無しさん
07/12/09 21:31:14
3N^2+2N = O(N^2) が分かってないのか?

586:デフォルトの名無しさん
07/12/14 13:42:55
グレブナ基底を求めるプログラム、誰か持っていませんか?
C言語でおねがいしたいです。

587:デフォルトの名無しさん
07/12/15 02:12:22
>>586
23457円になります。

588:デフォルトの名無しさん
07/12/29 03:46:49
均一なセル上に分割した空間で、円(または球)を配置して、円と交差する
セルを全て見つけたいのですが、どうしたら効率よく求まるでしょう?

589:デフォルトの名無しさん
07/12/29 06:33:27
セルってのはよくわからないのだが、格子なの?
格子が座標と平行になるように回転変換して 格子間隔が1になるように伸縮して
円の中心座標の小数点以下座標を見ればいいだけでは?

590:デフォルトの名無しさん
07/12/29 07:51:56
あ、格子です。あ、最初から座標軸並行を仮定してます。
さらに辺の長さを1で仮定してしまいましょか。
えーと意味がいまいちつかめないんですが、

>格子が座標と平行になるように回転変換、格子間隔が1になるように伸縮
これは元々が単位格子であるなら何もしないでOK?

>円の中心座標の小数点以下座標
これで、なぜ全ての格子が求まるかがわかりません。
整数部をみれば、中心を含む格子は求まると思いますが。

591:デフォルトの名無しさん
07/12/29 13:33:11
欲しいのは「円周」と交わるセルだろ?
そこがちゃんと書いてないから勘違いされたと思われ

592:デフォルトの名無しさん
07/12/29 17:06:31
あ、そうです。申し訳ない。

593:デフォルトの名無しさん
07/12/30 12:13:13
DDA(digital diffrential analyzer)というのがあるが使えないかな?
3次元は分からんが

594:デフォルトの名無しさん
07/12/30 12:39:28
3次元も、半径が違う円で切り出したものと考えればイケルんじゃないの?

595:デフォルトの名無しさん
07/12/31 01:56:42
ある年月日が与えられ、そのn日後の日付を求めたいのですが、
1,fairfieldの公式で西暦1年1月0日からの経過日数daysを求める
2,days+nを西暦年月日に変換する
という方法を考えました。
2は1の式を変形して解けるだろうと見当を付けていましたが、
小数点以下を切り捨てたりしているためうまく式を求められません。
素直に最初の日付にnを足し、年・月に順次繰り上げていくほうが賢明でしょうか?
日付は最近のものに限定して考えています。
ユリウス暦とグレゴリオ暦の判断が面倒になるので…

596:デフォルトの名無しさん
07/12/31 08:25:44
>>595
日付を1日進めるプログラムは書けるかい?

おk。ならば、1日進める部分をn回実行するんだ。

597:デフォルトの名無しさん
07/12/31 08:49:10
つーか、なんで既存ライブラリを使わないのだろう。
大抵の言語に日付け処理系の関数があると言うのに。

598:デフォルトの名無しさん
07/12/31 11:47:35
>>595
URLリンク(ufcpp.net)

599:デフォルトの名無しさん
07/12/31 12:25:41
>>595
ちょっと検索してみたらこんなのがあった
delphiだけど、c言語に変換するのはこどもあそびにひとしい

URLリンク(kwikwi.cocolog-nifty.com)

ところで前々から思ってたんだけど、fairfieldの公式って誰が考案したの?
日本のサイトしか引っかからないんだよね


600:デフォルトの名無しさん
07/12/31 12:29:16
>>596
なるほど。
ただ、(情報が小出しになってすみません)n日前の日付も求められるようにしたいので
上に書いたような方法だとdays+nを-に変えるだけで実現できるかなーと・・・
>>597
Cなのでそういった関数はもちろんあるのですが、若干不便なので
勉強も兼ねて自前で実装してみようというわけです。

601:デフォルトの名無しさん
07/12/31 12:51:11
>>598
おおお÷4を右シフト演算できるのは考えが及んでませんでした
>>599
(mjd - 15078.2) / 365.25  …? もはや何がなんだか。

URLリンク(cl.is.kyushu-u.ac.jp)
こんなの見つけたので読んできます。

602:デフォルトの名無しさん
07/12/31 13:18:34
>>600
URLリンク(www.tensyo.com)
ここの
int YMD_AddD(int *Y,char *M,char *D,long d) って関数を見ると
負数を渡した場合は 400年循環を使って正に直せばいいみたい。


603:デフォルトの名無しさん
08/01/01 10:28:35
つまり、-3日なら 400年前から(146097-3)日後と計算するわけか

604:デフォルトの名無しさん
08/01/02 02:09:27
除算のシフト演算化はコンパイラの最適化段階で
自動でやってくれるものだと思ってたんだが、そうでもない?

605:デフォルトの名無しさん
08/01/02 08:29:27
コンパイラの性能がソレなりならって事でしょう。
固定値の除算ならさらに、掛け算で代用してくれるのも多いね。


606:デフォルトの名無しさん
08/01/02 10:22:11
>>604
2のべきの定数ならね。

607:デフォルトの名無しさん
08/01/02 12:18:44
という事で
1、カレンダを1日進める関数関数を作る
2、+N日は1の関数をN回呼ぶ
3、-N日は、年数を400日戻してから、146097-N回 1の関数を呼ぶ


608:595
08/01/02 20:05:17
これでいいのかな?
struct Date{
 int year,month,day;
};
/* 1日進める */
void tomorrow(Date& x)
{
 int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 if((x.year%4==0 && x.year%100!=0) || x.year%400==0){
  days[2]++;
 }
 x.day++;
 if(x.day>days[x.month]){
  x.day=1;
  x.month++;
 }
 if(x.month>12){
  x.month=1;
  x.year++;
 }
}

609:595
08/01/02 20:06:50
/* n日後の日付 */
Date after(Date x,int n)
{
 for(int i=0;i<n;i++){
  tomorrow(x);
 }
 return x;
}
/* n日前の日付 */
Date before(Date x,int n)
{
 n=146097-n;
 for(int i=0;i<n;i++){
  tomorrow(x);
 }
 x.year-=400;
 return x;
}


610:595
08/01/02 20:39:23
「1にちずつ遡りながら日付を表示」とかやるとbefore()の処理量が馬鹿にならないので、
>>601に載ってるのを参考に書き換えてみました
/* 西暦1年1月0日からの経過日数から、日付を求める */
Date make_date(int n)
{
 int y=(n+305)/146097*400
    +(n+305)%146097/36524*100
    +(n+305)%146097%36524/1461*4
    +(n+305)%146097%36524%1461/365;
 int diff=n-(365*(y-1)+y/4-y/100+y/400+31+28); // 3月0日からの経過日数
 if(diff==0){    //2月29日
  diff=366;
  y--;
 }
 int m;
 for(m=3;;m++){
  //3月0日からm月0日までの経過日数, 30*(m-3)+3*(m+1)/5-2 の変形
  if(153*(m+1)/5-122<diff && diff<=153*(m+2)/5-122){ 
   break;
  }
 }
 int d=diff-(153*(m+1)/5-122);
 if(m>12){
  m-=12;
  y++;
 }
 Date x={y,m,d};
 return x;
}

611:デフォルトの名無しさん
08/01/08 03:16:56
漸近的上界とか下界っての何なの締め切り明後日\(^o^)/オワタ

612:デフォルトの名無しさん
08/01/08 03:17:24
誤爆です。
ごめんなさい

613:デフォルトの名無しさん
08/01/08 13:01:23
>>611
そのまんまの意味じゃなーの。
f(x)=sin xで1,-1は明らかに漸近的ではないが
g(x)=1/x(x≥0)で0は漸近的。

614:デフォルトの名無しさん
08/02/09 20:18:07
質問させてください。

「ハッカーのたのしみ」p137 で多倍長のかけ算のサンプルがあったのですが、
わからない部分があります。

void mulmns( unsigned short w[], unsigned short u[], unsigned short v[], int m, int n ) {
unsigned int k, t, b;
int i, j;
for( i = 0; i < m; i++ ) {
w[ i ] = 0;
}
for( j = 0; j < n; j++ ) {
k = 0;
for( i = 0; i < m; i++ ) {
t = u[i] * v[j] + w[ i + j ] + k;
w[ i + j ] = t;
k = t >> 16;
}
w[ j + m ] = k;
}
}

u と v がかける数、かけられる数、w に結果が入ることはわかるのですが、k は何に使われているんでしょうか?




615:デフォルトの名無しさん
08/02/09 20:31:46
繰り上がり

616:614
08/02/09 20:41:09
>>615 すばやい回答ありがとうございます。
くりあがりですね。

このプログラムの結果って、w に short で表せる数を法としたそれぞれの桁が入ると思うんですけど、
この理解で合っていますか?10 進数で表示したいときには変換するルーチンも別に必要でしょうか?

617:デフォルトの名無しさん
08/02/09 20:44:43
>>616
そのとおり。

10進数で画面に表示する回数が、普通の計算を行う回数よりも
圧倒的に少ないと考えると、そういう数の表現になる。

618:デフォルトの名無しさん
08/02/11 16:13:21
w[ i + j ] = t;
k = t >> 16;
この部分を
 k = t/10;
 t -=k*10;
w[ i + j ] = t;
とすれば、10進法になるんじゃない?
8bitなら100進数
16bitなら10000進数なんてのがオススメだよ

619:デフォルトの名無しさん
08/02/11 23:37:33
HLISP だっけ,32 bit int 使って radix 10^8 で多倍長整数実装してた

620:デフォルトの名無しさん
08/02/18 17:15:48
行列計算するときに、掃き出し法、ガウスザイデル法、SOR法、等ありますが、
調べると掃き出し法は他の計算方法に比べると誤差が大きいと書いてありました。
なぜ誤差が大きくなるのでしょうか?

621:デフォルトの名無しさん
08/02/18 23:15:28
誤差についてはほとんど知識がないので調べてみました。
たまたま今やっていることに関係あるので。

さて、分かったことは小数演算は必ず誤差を含むと言ってもいいこと。
なので、10^n倍で整数に変換したり、ライブラリを使ったり対策を
しなければいけないこと。まぁ大体こんな感じです。

ではなぜ掃き出し法が誤差が大きいかというと、予測ですが
単純に計算量が他に比べて多いからではないでしょうか。
誤差を含む演算はやればやるほど誤差が大きくなるというわけです。

ちゃんとした理由ではないかもしれませんが、それよりも
どうすれば誤差を小さくできるか考えた法がいいと思います。
まぁ原因が分からなくては始まりませんが。

622:デフォルトの名無しさん
08/02/18 23:42:00
>>621
そんなに詳しくないから適当に書くけど、
基本的にはその通り。
収束性が悪いほど誤差は積もりやすい。

あと、除算があると誤差大きくなる。
なので、掃き出し法みたいな手計算的手法のものよりも、
ガウスザイデル法みたいな反復計算の方が誤差少ない。

623:デフォルトの名無しさん
08/02/19 02:13:06
>>620
一概にそうとは言えない。というか、単純に比べることは不適当。


そもそも掃き出しは(解けるならば)必ず A x = b を解くが、
ガウスザイデル、SOR は特殊な A に対してしか一次方程式を解かない。
したがって、無条件で比較することはできない。

次に、生じる誤差が違う。掃き出し法は直接解法なので、考える誤差は丸め誤差のみ。
一方のガウスザイデル、SORは反復解法なので考える誤差は丸め誤差と打切り誤差。
反復法の打切り誤差をどの程度に設定するかということを述べないと、比較はできない。

624:デフォルトの名無しさん
08/02/19 13:21:15
>>623
掃き出しで解けるものでもガウスザイデル、SORで解けないものもあるということでしょうか?
新たな課題ですね( ̄□ ̄;)!!
実は、エクセルマクロで書いた掃き出し法で計算した回帰分析と、
エクセルの分析ツールの回帰分析した結果、
後者の方が精度がよかったので分析ツールの回帰分析は別のアルゴリズムなのかなと考え調べていました。
後者はガウスザイデルなのかもしれません。

625:デフォルトの名無しさん
08/02/19 16:20:26
>>624
マクロでやってるなら、ピボットの選択してる?

626:デフォルトの名無しさん
08/02/19 18:31:45
>>624
掃き出しで解けてガウスザイデルで解けない問題なんて
いくらでもあるよ.たとえば
 x + 2 y = 1
 2 x + y = 1
をこの順番で連立方程式と考え,ガウスザイデルを
初期値 x = 0, y = 0 で適用すると,発散する.
ガウスザイデルが収束する必要十分条件は,未解決のはず.

627:デフォルトの名無しさん
08/02/21 22:41:32
>>625
> マクロでやってるなら、ピボットの選択してる?
いえ、まず中心をすべて1にしてから掃き出しています。
これではダメでしょうか?

628:デフォルトの名無しさん
08/02/22 19:59:46
>>627
ダメ

629:デフォルトの名無しさん
08/04/03 03:18:18
あげ

630:デフォルトの名無しさん
08/04/17 12:46:54
ユークリッドのアルゴリズム(テキストp.10参照.java版はHP参照)を用いて
1,000,000,000,000,000,000(10の18乗)と25の最大公約数を求めるとしたとき、
引き算は何回行われるか答えよ。また、1秒間に10億回の計算を行えるCPU(クロック
1GHzに相当)を用いてこの計算を行ったとき、計算にはどのくらいの時間がかかるか。
「X年Xヶ月」など実感が分かる単位に直して答えよ。

この解き方がわかる人がいましたら是非教えて下さい。
解けなくて困っています。

631:デフォルトの名無しさん
08/04/17 13:30:05
>>630
宿題は自分で解決しようと努力しないと意味がないぞ
どこまでは理解できていて、どこが分からないんだ?

632:デフォルトの名無しさん
08/04/17 14:05:58
というか、奇妙な問題だな
10^N は N>=2 なら25で割り切れる。
つまり最大公約数はユークリッド互除法でも最初のステップで求まってしまう

もしかして 64bit整数演算が出来ない32bitCPUで除算も筆算法でコードを書いたら
って場合か? それでも実感がわかる単位にはならないわな

633:デフォルトの名無しさん
08/04/17 14:46:19
>>630が問題を間違えている
・出題者のちょっとした遊び心
どっちかじゃね?

難しそうに見えて実は簡単な問題を出して
最初から課題をやる気がない奴を調べるためだったりしてw

634:デフォルトの名無しさん
08/04/21 13:16:15
int型のデータをN個格納できる配列aを考える.つまり,配列要素は a[0],
a[1], ..., a[N-1] でアクセスする.a[0]〜a[k]まではデータが既に格
納されており,a[k+1]〜a[N-1]までは「空き」の状態であるとする(0 <= k < N).
このとき,次に挙げる各操作に必要な手間(時間)を,「最も手間のかから
ない場合」と「最も手間のかかる場合」のそれぞれの場合について答えよ.
理由も書くこと.(例を参考にせよ)

例:指定された位置にデータを挿入する操作

答:最も手間のかからない場合:定数時間
最も手間のかかる場合:kに比例する時間
理由:指定された位置が末尾の場合には,データをずらす必要がな
いため定数時間で可能.指定された位置が先頭の場合には,既に格
納されているk+1個のデータを順にずらす必要があるため,kに比例
した時間が必要.

1-1 指定した位置のデータを削除する操作
1-2 指定したデータが格納されているか探索する操作
1-3 格納されているデータの中で最小の値を探索する操作

これを現在解こうと思っていますが、よく分かりません。
分かる人は是非教えて下さい、お願いします。

635:デフォルトの名無しさん
08/04/21 13:32:09
1-1
最良:定数
最悪:k比例
1-2
最良:定数
最悪:k比例
1-3
最良:k比例
最悪:k比例

636:デフォルトの名無しさん
08/04/21 15:08:07
配列を用いてリストを実現することを考える.今,配列には以下のように
データが格納されているとする.(配列keyと配列nextはint型のデータを格
納するとする)

key[0] = 0 ,next[0] = 3
key[1] = 0 ,next[1] = 1
key[2] = 'S' ,next[2] = 6
key[3] = 'L' ,next[3] = 4
key[4] = 'A' ,next[4] = 5
key[5] = 'I' ,next[5] = 2
key[6] = 'T' ,next[6] = 1

位置0はhead, 位置1はzを表す.
このとき,次の問に答えよ.

(1)リストに格納されている文字を,リストの先頭から順に書け.
(2) もしも next[0] の値が4だった場合,リストに格納されている文字を
リストの先頭から順に書くとどうなるか述べよ.
(3) リストから'A'を格納している節点(key[4]とnext[4]に対応)を削除し
た場合,配列keyと配列nextの中身はどのように変化するか述べよ
(key[4]とnext[4]の値はそれぞれ0に設定せよ)

637:デフォルトの名無しさん
08/04/21 16:28:55
ここは宿題すれじゃねーんだよ・・・

638:デフォルトの名無しさん
08/04/21 17:03:43
行列計算のガウスザイデル法が収束しないことがあるので気になっていたけど
検索するとGMRes(一般化残差最少法、GMRes法 )というのがあるらしい。
(残差を最小にするから、たとえ解が無くても最適な値が求まる?収束に向かうのは確実?)

ただ、ガウスザイデル法は数行のプログラムなのに対して
見つけたプログラムがかなりでかいサイズになっているのがまた気になる。

ガウスザイデル法で残差を小さくするような改良って無いのかな?誰か知ってる?

639:デフォルトの名無しさん
08/04/21 17:40:08
これが、SOR法である。
ここで、問題なのが加速緩和係数の値の選び方である。明らかに、それが1の場合、ガウス・ザイデル法となりメリットは無い。また、1以下だと、ガウス・ザイデル法よりも収束が遅い。ただし、ガウス・ザイデル法で収束しないような問題には使える。
従って、1以上の値にしたいわけであるが、余り大きくすると、発散するのは目に見えている。これについては、2を越えると発散することが分かっている。最適値となると、だいたい1.9くらいが選ばれることが多い。
URLリンク(www.akita-nct.ac.jp)

640:デフォルトの名無しさん
08/04/21 18:02:14
ω=1.9から始めて発散なら値を引き下げていけばいいって事だな
ω=1がもともとのやつ 

641:デフォルトの名無しさん
08/04/22 00:29:31
ガウスザイデル法には,原理的に収束しないインスタンスが存在するので
収束しないことが気になるような場合には,そもそも使ったらダメ.
これはSORでも状況は変わらない.

GMResやらBiCGやらIDRやら反復解法は色々あるんだから
解きたい問題にあわせて適切に解法を選ばないとダメよ.

642:デフォルトの名無しさん
08/04/22 00:57:39
原理的に収束しないとは? 解が存在する行列でもできないってこと?

643:デフォルトの名無しさん
08/04/22 05:48:37
>>641
なるほど、どうもです。
プログラマ的な発想で少し工夫すればいけるんじゃない?と思ってましたが
やはり数学は厳密ですからね。たまたま、やってみたものがうまくいっても
その正しさを証明しなければならないので、出来上がったものを使いたいなと思います。

644:デフォルトの名無しさん
08/04/22 09:27:07
>>642
そのとおり.
ガウスザイデル法は,対角優位とか半正定とかを満たしている場合を除いて
解が存在しても,収束するとは限らない.

いつ収束するかの厳密なところ(必要十分条件)は,現在でも未解決問題.

645:デフォルトの名無しさん
08/04/23 16:48:12
>>644
639のこれは?

。また、1以下だと、ガウス・ザイデル法よりも収束が遅い。ただし、ガウス・ザイデル法で収束しないような問題には使える。

646:デフォルトの名無しさん
08/04/23 17:10:06
>>644
SOR法の0 < ω < 2である係数を2以上にすると必ず収束しない事がわかっている
ωの値によって収束が左右される 0に近づければガウスザイデル法で無理な場合も収束するのでは?

647:デフォルトの名無しさん
08/04/23 20:15:14
ω=1はガウスザイデル法である

648:デフォルトの名無しさん
08/04/25 01:51:21
グレースケール変換。こいつより高速アルゴキボンヌ。
条件:徐々にグレースケール変換できればvolumeの持たせ方は自由

// 【メソッド名】convGrayScale
// 【引数説明】
// srcRGB:変換元画像(0xRRGGBBのピクセル配列)
// pixel_num:ピクセル数
// volume 0(無変換)〜255(完全変換)の範囲でグレースケールに変換
// dstRGB:変換先(0xRRGGBBのピクセル配列)

649:デフォルトの名無しさん
08/04/25 01:52:02
public void convGrayScale(int[] srcRGB, int pixel_num, int volume, int[] dstRGB){
  int red, green, blue, Y;
  for(int i=0; i<pixel_num; i++){
    red = srcRGB[i] >> 16;
    green = (srcRGB[i] & 0xFF00) >> 8;
    blue = srcRGB[i] & 0xFF;
    Y = (red * 298912 + green * 586611 + blue * 114478) / 1000000; // グレースケールの計算
    if(Y > red){ // R成分の調整
      red += volume;
      if(Y < red) red = Y;
    }else if(Y < red){
      red -= volume;
      if(Y > red) red = Y;
    }
    if(Y > green){ // G成分の調整
      green += volume;
      if(Y < green) green = Y;
    }else if(Y < green){
      green -= volume;
      if(Y > green) green = Y;
    }
    if(Y > blue){ // B成分の調整
      blue += volume;
      if(Y < blue) blue = Y;
    }else if(Y < blue){
      blue -= volume;
      if(Y > blue) blue = Y;
    }
    dstRGB[i] = (red << 16) + (green << 8) + blue; // 変換結果
  }
}

650:デフォルトの名無しさん
08/04/25 01:54:17
あ、一応JavaだけどCとかでもおk

651:デフォルトの名無しさん
08/04/25 02:10:24
volumeって要は、グレイ化度合いみたいなものなのね。
処で、volumeを255まで振る前にグレイになってしまうし、振っていく途中で違う色相の色が出てしまいそうだけどいいのかね。

652:648
08/04/25 03:08:47
volumeって要は、グレイ化度合い⇒そのとおり!
volumeを255まで振る前にグレイになってしまう
⇒それは思ったけど、取り得る範囲がわからんかった。。。
 r=0,g=0,b=255、r=255,g=255,b=0の場合で29.191890〜225.808365の範囲で196.616475がMAXかなぁ
振っていく途中で違う色相の色が出てしまいそうだけどいいのかね。
⇒ちょっとわからんkwsk
 ちなみに自分の使い方としては元画像srcRGBはずっと変えずにvolumeを増やす感じ
 だから一度変換したdstRGBをsrcRGBに使うことはない

653:648
08/04/25 03:15:22
ちなみに、volumeを0〜100%として

dstRGB[i] = (((Y * volume + red * (100 - volume)) / 100)<<16) +
      (((Y * volume + green * (100 - volume)) / 100)<<8) +
      ((Y * volume + blue * (100 - volume)) / 100);

としたてみたけど、遅くなったorz

654:デフォルトの名無しさん
08/04/25 06:45:23
Y = (red * 298912 + green * 586611 + blue * 114478) / 1000000; // グレースケールの計算
これの意味を教えて

655:デフォルトの名無しさん
08/04/25 06:54:50
>>654
YUV とか 色空間あたりでググって見たら、、、
wikipedia の 「色空間」だとか
URLリンク(ofo.jp) の 2.NTSC 〜
にある式を 小数点 の無い形にしたと考えたらいいんじゃない?


656:デフォルトの名無しさん
08/04/25 07:26:42
こういう時は
Y = (red * 19589+ green * 38444+ blue * 7503) / 0x10000;
か、
Y = (red * 77 + green * 150+ blue * 29)/ 256 ;

と2のベキにしたらどうかな /256 は >>8 に出来る
8bitにすれば rgbも8bitだから 16bitの入れ物で計算出来る

dstRGB[i] = (((Y * volume + red * (100 - volume)) / 100)<<16) +
      (((Y * volume + green * (100 - volume)) / 100)<<8) +
      ((Y * volume + blue * (100 - volume)) / 100);
もvolumeを2のベキにして
Y*k + X*(1-k) = X+(Y-X)*k なので

dstRGB[i] = ((( red + (( (Y - red )*volume)>>8) )<<16) +
        ((( green+ (( (Y - green)*volume)>>8) )<<8) +
         (( blue + (( (Y - blue )*volume)>>8) );
としたら掛け算は減らせるよ


657:648
08/04/25 07:54:03
>>656
なるほど!!さんくす
 Y = (red * 77 + green * 150 + blue * 29) >> 8;
 dstRGB[i] = (((red + (((Y - red) * volume) >> 8)) << 16) +
       ((green + (((Y - green) * volume) >> 8)) << 8) +
       (blue + (((Y - blue) * volume) >> 8)));
今、これで自分の環境で試したら1000ms切った!(前は1100msくらい)
でも500くらいは欲しいorz

658:デフォルトの名無しさん
08/04/25 08:51:23
>>657
distRGB の方は、
(red + (〜)>>8)<<16 を red<<16 + (〜)<<8 などど展開して
red<<16+green<<8+blue とまとめて、
*volume) << の部分を出して因数分解できれば良さげだよね。
>>8 の方も レジスタの H を取るような方法で早くなるかな。
だだ、新しいCPUだと シフト演算もテーブル化してあって
シフト回数がステート数に影響しないからなぁ。
あっ。もうすぐ9時なのでここまででカキコ。


659:デフォルトの名無しさん
08/04/25 10:12:30
java だから 割り算をシフトにするとかの最適化があんまり効かないのかもな

どの行が一番時間かかってるか コメントアウトしては時間計って
一番時間かかってる行から順に工夫してゆくしかないと思うけど
cかDelphiでDLL作った方が早いんじゃないの?

660:デフォルトの名無しさん
08/04/25 10:20:09
あとは
Y8 = Y<<8
v = 256-volume;

dstRGB[i] =(((( ( Y8 - ( (Y - red )*v) ) & 0xFF00 )<<8 +
      ((( ( Y8 - ( (Y - green)*v) ) & 0xFF00 ) +
       (( ( Y8 - ( (Y - blue )*v) )>>8 ;

くらいかなv = 256-volume は最初からそう使えば問題ない
でも半分は無理だろな

661:デフォルトの名無しさん
08/04/26 10:06:56
>>645
任意のパラメタωに対して、真の解に収束しない例が作れる.

662:648
08/04/26 13:27:23
>>658-660
いろいろありがと。
今んとこ、volume調整計算を事前にしておくことで800ms切ることができた
volumeは10段階くらいあればよくて、グレースケールの精度もそこまで求めてない
この条件でまだいげねがな?

char[][][] g_gray_tbl = new char[256][256][10]; // グレースケール変換計算テーブル

// 事前計算処理
// src:変換前値 dst:変換後値 vol:度合い(0〜9の10段階)
for(int src=0; src<256; src++){
  for(int dst=0; dst<256; dst++){
    for(int vol=0; vol<10; vol++){
      g_gray_tbl[src][dst][vol] = (char)(src + (((dst - src) * vol) / 9));
    }
  }
}

dstRGB[i] = ((g_gray_tbl[red][Y][volume] << 16) +
      (g_gray_tbl[green][Y][volume] << 8) +
      g_gray_tbl[blue][Y][volume]);

663:デフォルトの名無しさん
08/06/12 13:23:40
誰かクイックソートが挿入法よりなぜ早いのか教えてくれ

クイックソートのほうがめんどくさそうなのに最速とか理解できん・・・


664:デフォルトの名無しさん
08/06/12 14:07:54
>>663
クイックソートがソートの中で最速ってわけではないが……
同じデータ数なら、挿入法よりもクイックソートの方が
ソートが完了するまでの比較回数やデータ位置の入れ替えの回数が
平均的に少ないアルゴリズムになっているから。
ソートは基本的にループや再帰呼び出しによる操作だけれど、
ループに入る前や出た後の準備や後始末、
それにループ内での操作が少しくらい複雑になっても、
ループや再帰の回数がそれを補って余るだけ減少する方法なら全体として速くなる。

665:デフォルトの名無しさん
08/06/12 15:26:15
>>663
大まかな話、例えば10,000個のデータをソートする場合、データの比較や交換を行う平均的な操作回数は、
挿入法なら1回当たり2〜10,000個のデータの操作を行うループを10,000回行うから50,000,000回程度の操作が必要。
クイックソートは10,000個のデータをピボットに対する大小で2グループに分けるということを行うのに10,000回の操作が必要。
さらに2つに分けたグループごとに同じことを行うので両方のグループ合わせてやはり10,000回の操作が必要。
この分割をどんどん進めて最終的にグループ内のデータ数が1個になるまで行うと分割回数はlog10,000/log2=13回程度。
つまり全部で約130,000回の操作が必要になる。
50,000,000回と130,000回の操作では比べるべくもないということ。
しかもクイックソートは挿入法に比べて全体的に複雑なことをやっているように見えても、
データの比較や移動という基本的な操作にかかる時間が変わるわけではないから、
操作回数の極端な減少はソート時間の減少に繋がるということになる。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4777日前に更新/251 KB
担当:undef