1 :
デフォルトの名無しさん :
02/02/27 13:17 アルゴリズムの質問、議論ならなんでもよし。 類似スレが多くてどこに書きこめば分からないときは とりあえずこちらにどうぞ。
ありそうで無かったスレ。
とりあえず 「直線や円の2ドット以上の太さを持つ描画アルゴリズム」 をどうしてるか聞きたい。
5 :
デフォルトの名無しさん :02/02/27 13:37
6 :
仕様書無しさん :02/02/27 13:51
>「直線や円の2ドット以上の太さを持つ描画アルゴリズム」 ウチの会社の筆記試験だYo!
>「直線や円の2ドット以上の太さを持つ描画アルゴリズム」 デバイスの解像度、速度優先か見た目優先か、アンチエリアシングするか、とかによって違うから、 これだけじゃ答えようがない、が正解。
>>7 じゃ、デバイスはPCのモニタ、速度優先、アンチエリアなしで。
だったら、1論理pixelづつずらしながら、n回描画する、でええやん。
10 :
デフォルトの名無しさん :02/02/27 14:46
アルゴリズムの本って初心者向きと謳ってるけど 数学できないヤツは全然理解できないですよね ということで数学やり直し中。黄チャートまでやったら読めるようになるかな・・・・
11 :
デフォルトの名無しさん :02/02/27 14:50
まず斜めの線の太さを定義してください。
x1,y1からx2,y2への太さを持つ直線の作画には 直線作画を少しづつずらしながら太さのぶん連続で行う方法と 円作画を少しづつずらしながら長さのぶん連続で行う方法があります。 がんばってください。
まともなグラフィックツールだったら1ピクセルずつずらしながら 描くなんてことはしてないよ。
とりあえず今実装してるのが円ずらしなんですけど、 あくびが出るほど遅いんですよ。 リアルタイムでやる必要があるのであくびが出ちゃうと まずいな、と。 >直線作画を少しづつずらしながら太さのぶん連続で行う方法と これはいいかも。0.5ピクセルずつずらせば大丈夫かなあ。 ありがとうっす。
>>14 円ずらしって最悪でも最速アルゴリズムの8倍程度の処理時間におさまるはずだ
実装がまずいんじゃないの?
17 :
デフォルトの名無しさん :02/02/27 15:22
直線なら長方形と考えたらいいんじゃないの? 太さ2だとして45度の線なら途中は3ピクセル分水平にドットを並べる 円の場合も同じで、直径の違う2円として、水平に輪切りして処理するとか
>>14 まさか、毎回円を1から描いてるんじゃないよね?
直径nの円のビットマップ作って、転送してるよね?
('-`)。o○(今時、水平ラインの描画がうんと速いと思ってるひと、いないよね)
>>19 水平ラインは速いよ ビットマップを作る場合は特に
>>19 アクセラレータが使えないドでかい画像処理なら今もそうだよ
>>19 独自に描画エンジンを作る場合は 水平ラインが基本でしょう 特にプリンタなんかは
>>16 >>18 すんません、言うの忘れてたんですけどレタッチ的なものを作ってるので
アルファブレンドも考慮に入れないといけないんす。
なので、ビットマップの転送ってのは出来ないんです。自力で計算しないと。
>最速アルゴリズム
聞きたいです。
>>17 あ、これもいいですね。直線ずらしは別バッファに一度書きこんでおかないと
重ね書きしちゃう可能性があったんですけどいいっすね。
ちょっとアルファ値の計算が時間かかりそうだけど問題ないかな。
24 :
デフォルトの名無しさん :02/02/27 16:02
>>14 > >直線作画を少しづつずらしながら太さのぶん連続で行う方法と
> これはいいかも。0.5ピクセルずつずらせば大丈夫かなあ。
横方向もDDLで書いてみるとどうなのかな?
pixelに空きが出来ちゃうのかな?
25 :
デフォルトの名無しさん :02/02/27 16:03
あ、横じゃなくて太さの方向ね。直線方向の垂直方向。
('-`)。o○(1pixel=1bitでブロック転送を使うような、話の流れと違う特殊な状況を持ってくるなよ…)
つか、アルファブレンドするなら、(アルファブレンドが、単にα値なのか、 マスク画像かによるけど)それの時間がかかってるっぽいね。 だったら、出来るだけ同じpixelの処理を何度もやらない方法が速いでしょう。 もしかしたら、図形をポリゴンにして、スキャンラインにしたほうが速いかも。 プロファイルとってみたら?
>>23 αブレンディングしても同じです
ブレンドのコスとがデカイなら、別に形だけマスクとして作っといて
マスクのあるとこだけ計算すればいいんだから
>>26 =
>>19 円ずらしをしてたので、遅い原因は同じ座標を何度も計算しなおしてる
ところにあったんす。ですので直線描画のアルゴリズムを見直せば(同じ
座標を計算しないようなアルゴリズムならば)アルファブレンドに関係なく
速くなるかな、と思ったんすけど。すんません。
とりあえず教えてくれたもの全部試してみるっす。
30 :
John ◆0z.4Is5E :02/02/27 17:37
332=333なんだろうな(フ?
31 :
John ◆0z.4Is5E :02/02/27 17:40
ごめん
32 :
デフォルトの名無しさん :02/02/27 20:55
シミュレーションゲーム(四角いマス)のキャラごとの移動可能範囲の 最速計算アルゴリズムはどうやってるんですか?
A*
B*
35 :
John ◆0z.4Is5E :02/02/27 23:40
MD5を使って、ファイルのダイジェスト値をつかって ファイルが変更されたかどうかをチェックする場合、 1/2^(16*8*2)の確立で失敗するんでしょうか? MD5の計算方法ってどんな感じですか?
rfc嫁よ…
何番ですか?
39 :
John ◆0z.4Is5E :02/02/28 09:43
わからないからって、調べろっていうのも短絡的だね・・・ じゃあ、ここはいったいどう利用するの?
わからないから調べろってわけじゃなく 一々説明するのが大変だから既存の文書を読めって話でしょ。
41 :
デフォルトの名無しさん :02/02/28 11:54
>>39 少なくとも、「誰が調べてもすぐ答えが一つに定まるような
質問に答えるコーナー」として利用するのはつまらんではないか。
大勢に訊いて議論に持ち込む余地があるよーな質問、なら面白いが。
>>39 初心者歓迎質問スレに行けば教えてくれると思う。
rfc見ても確か効能とソースだけだった記憶があるけど ところで 1/2^256 というのは、宇宙が生まれてから滅びるまでに一度あれば奇跡と考えてよいような 数字だよ
> 1/2^256 この256はどこから出てきた?
>>46 多分
>>45 は
>>35 へのレスだと思われ。
MD5は16バイト=16*8ビット=128ビットなのを
>>35 のレスに
引きずられて16進32桁=32*8ビット(本当は*4)=256ビットと
勘違いしたんじゃない?
48 :
デフォルトの名無しさん :02/03/01 16:10
再帰を普通のループに置き換える一般論を 解説してるとこ無いでしょうか。
>>48 ページの心当たりはありませんが、かなり昔のLispコンパイラの最適化に
関する記事で見た覚えがあります
>>48 再起 除去 あたりのキーワードで検索すれ。
51 :
デフォルトの名無しさん :02/03/02 15:43
tail recursion 末尾再帰
MD5で衝突したらfile本体を比べろよ...
53 :
デフォルトの名無しさん :02/03/05 10:47
円描画の一番簡単なアルゴリズムと一番速いアルゴリズムが知りたい。
void MonaCircle(double x, double y, double radius) { for (int i = 0; i < 360; i ++) { double r = i * PI2 / 360; PSet(x + cos(i) * radius, y + sin(i) * radius); } }
>>56 ツッコミ所満載で、どこにツッコんだら良いのやら・・・
ていうかギャグのつもりだろう。
y=sqrt(r^2-x^2) ってのは? rは半径ね。 円の1/8だけ演算して、あとは鏡像をコピー。
>59 sqrtが重い
>>60 ターゲットによるでしょ。
SSE2でも平方根は有るんだし。
1/√x は 1/xに毛が生えた程度の演算量 だから√xはその2倍でしかない y=√(r^2-x^2) を微分して y*dy = -x*dy を求めて45°までの略算形式にするのがDDA 他の方法としては、汎用のベジェ描画を作ってベジェ係数に変換してしまうのが一般的で楽かも といえば、じゃベジェ描画はどうするのか疑問が出るんだろうけど
とりあえず
>>32 へのレス
議題:n方向に移動可能なマップ上でのユニットの移動可能範囲の特定(微妙に汎用化)
条件:ユニットの移動力は移動により増加しないものとする(重要)
マップと同じだけの大きさの0で初期化された解答格納用テーブルmap2(真ならば移動可能を示す)、
ユニットの機動力move、がすでに宣言されていて利用できるものとする
解法:n方向に再帰する。再帰関数内では以下の処理を行う
コツ:map2には前回検索時の機動力が入る。これで比較処理での無駄が少しだけ省けるはずだ
void moveable(前回から見た移動方向, ユニットの座標,その他必要なものは考えれ)
{
int i;
ユニット座標の移動処理; /* ここでのユニットってのは実物じゃない。検索用のもの */
move = move - この地点への移動コスト; /* これも実物のじゃないぞ */
/* すでに今回より機動力が多い状態での再帰検索がなされているなら再帰検索を打ち切る */
/* テーブルは0で初期化されているため、これで機動力が0以下の場合にも対応できる点に注意 */
if (map2>=move) {
return;
} else {
map2=move; /* 移動できたぞ、と */
}
for(i=0; i<n; ++i)moveable(i, ...); /* n方向の再帰関数の呼び出し */
}
こんなんでいいのか?
まあ、はじめの呼び出しをどうやればいいかは宿題だな。
テーブルの初期化を含めて、それも一つの関数にしておくと楽だな。
64 :
デフォルトの名無しさん :02/03/06 22:52
迂回路のコストが低い場合を考えて全検索すると無駄が出るから、 パスを作って枝借りしたほうがいいかも、っつーことで、 A* 調べろに1票
66 :
デフォルトの名無しさん :02/03/10 22:17
PhotoShopとかで領域を線で選択するときのアルゴリズムってどーやってんの?
void Circle2ch(unsigned long x, unsigned long y, float n) { float tx, ty, fy = y; long i = 0, j = 0; fy = -fy; while(i <= j){ tx = i+x; ty = j-fy; Pset(tx, ty); tx = j+x; ty = i-fy; Pset(tx, ty); tx = -i+x;ty = j-fy; Pset(tx, ty); tx = -i+x;ty = -j-fy; Pset(tx, ty); tx = i+x; ty = -j-fy; Pset(tx, ty); tx = -j+x;ty = i-fy; Pset(tx, ty); tx = -j+x;ty = -i-fy; Pset(tx, ty); tx = j+x; ty = -i-fy; Pset(tx, ty); i++; if((i*i+j*j-n*n-n) > 0) j--; } } これは古い。微分補間の方が速い。 でもsin、cosでやってる人にはイイ。
68 :
デフォルトの名無しさん :02/03/13 04:36
二つの線分が、交わるかどうかを調べるアルゴリズムを教えて下さい。
69 :
デフォルトの名無しさん :02/03/13 04:41
>>68 いやーそれは数学の教科書見たほうが早いよ。
70 :
デフォルトの名無しさん :02/03/13 08:44
>>66 領域を線で選択 のイメージが判らないので答えられないのだと思います
フリーハンドで描画したら、内部が選択領域になる、ってやつ。 うう、言葉で説明するの難しい。
windowsアクセサリのペイントブラシだったけの左上にあるフリーハンド領域選択?のこと?
そうそう、それ。 自分で考えたのは一度フリーハンドを描画してから左右1ピクセルずつ 大きくして左上から塗りつぶしを行って反転させる、って方法なんだけど もうちょっといい方法あるかな、と思って。
>>74 単純にフリーハンドの塗りつぶしと同じアルゴリズムで 2枚のビットマップに分けてるだけでは?
76 :
デフォルトの名無しさん :02/03/17 23:56
最新 アルゴリズム事典 奥村著 のマンデルブロートのパラメータ教えてください。 xmin,xmax,ymin,ymax,maxiterの初期値例が載ってたような気がします。 (いま本が手元にない)
79 :
デフォルトの名無しさん :02/03/21 18:19
囲碁を作りたいのですが、 石が囲まれてるか、囲まれていないかの判定をする 最速のアルゴリズムを教えてください。
>>79 石は置いた時にグループ番号を振る。
グループにはダメの数を記録しておく。
置いた時に隣接に同じ色の石があったら、自分も同じグループにする。
隣接に違うグループ番号の石があったら、そのグループの番号も自分の番号にする。
グループのダメの数は、自分のぶんを引き、自分のダメの数を足す。
こうしておくと、囲まれてるかどうかは、グループのダメの数を見ただけでわかる。
81 :
デフォルトの名無しさん :02/03/21 20:21
82 :
デフォルトの名無しさん :02/03/21 20:24
今日会社で仕事さぼって二分木の勉強しましたが、おもしろいですね。
>>82 いまさら2分木を勉強してるあなたは何者?
>>83 そんなことで得意げになっているあなたは何者?
85 :
デフォルトの名無しさん :02/03/21 21:02
VB の本を読んでいるのですが、線形探索を一通り読んで、今二分木のとこまできました。 コンピューター関係の勉強をしていて、ゲームよりも面白い、と最近感じることが多くなりました。 仕事をさぼって勉強している、というのがまた良いんですけどね。 いかにも給料泥棒してるぞーって感じで。
ボソッ ×マンデルブロート ○マンデルブロー
>仕事をさぼって勉強している、というのがまた良いんですけどね。 >いかにも給料泥棒してるぞーって感じで。 いや、業務時間内の勉強は必ずしも給料泥棒とはいいきれない 「ライブラリの勉強にはむしろ通常の倍支払っても良い」 なんて書いてある本もあったよ
河西 朝雄さんのCとJavaのアルゴリズムの本は どちらか買ったほうが(・∀・)イイ?
89 :
デフォルトの名無しさん :02/03/21 23:13
囲碁で、コンピューター側の思考ロジックで良いアイディアありますか?
>>87 同意。勉強はサービスなんて言ってたらやってられないよ。
91 :
デフォルトの名無しさん :02/03/21 23:38
最近のCPUで二分木検索が有意な速度差を持つためには、 リストが1万件以上必要。 しかし、その場合、ソートに時間がかかるから、あぼーん。
92 :
デフォルトの名無しさん :02/03/21 23:39
>>91 はあ? キーが何かも定義せずにいい加減なこと言ってんなよ!
keyが32bit固定とかの話をしてるのかい?
ソートに時間がかかるってなんだい? sorted treeじゃないの?
二分木検索って二分木探索のこと?
返事しなくていいぞ、スレが汚れるから。
94 :
デフォルトの名無しさん :02/03/22 00:01
最初に全てを計算してテーブル等に入れるのではなくて、 必要になるまで計算しない技法のことを何といいましたっけ? 遅延なんとか?
95 :
デフォルトの名無しさん :02/03/22 00:31
遅延評価、遅延実行、lazy evaluation, lazy execution辺りでどう?
96 :
デフォルトの名無しさん :02/03/22 00:39
>>87 >>90 いやー実は私はISPのヘルプデスクなんですよ。
本当はTCP/IPとかADSLの勉強をしなきゃいけないんですけどね。
それらってつきつめると、結局Cで書かれてるじゃないですか。
わかんないことあって質問しても、すぐ
「ソース読め」
って言われるしそれでプログラミングの勉強はじめたらこっちの方が面白くなってきちゃったんでもうネットワークなんかどうでもいいです給料泥棒まっしぐら
>>96 それが真剣であるならそれこそネットワークスペシャリストになって、会社にもっと貢献できるだろ。
まぁ、いつまでも二分木やソートやってたら無理だが
よし! 遅延評価でいこう。
一般的なコード↓ for(;h>0;h/=3){ for(int outer=h;outer<list.length;outer++){ int inner = outer; Sortable temp = list[outer]; while((inner -= h) >= 0 && list[inner].getKey() > temp.getKey()){ list[inner+h] = list[inner]; } list[inner+h] = temp; } } ↓こっちのほうが速かった。 for(;h>0;h/=3){ int end = 2 * h; for(int outer2=h;outer2<end;outer2++){ for(int outer=outer2;outer<list.length;outer+=h){ int inner = outer; Sortable temp = list[outer]; while((inner -= h) >= 0 && list[inner].getKey() > temp.getKey()){ list[inner+h] = list[inner]; } list[inner+h] = temp; } } }
100 :
デフォルトの名無しさん :02/03/31 21:10
二つの長方形が共通の領域があるかどうか調べるアルゴリズム 誰か教えてください 二次元座標系、長方形は回転して斜めになっている場合でも適用できるようなの
101 :
デフォルトの名無しさん :02/03/31 21:30
うんこアルゴリズム教えて
102 :
デフォルトの名無しさん :02/03/31 21:40
>>100 いずれかの頂点が他の長方形の域内にあるか、
または二つの長方形の辺が交差しているなら共通の領域が存在する。
>102 レスありがと やっぱり二つ組み合わせないとだめか
105 :
デフォルトの名無しさん :02/03/31 23:49
あ,なるほどー。それがあったっすね。 失礼しました。
107 :
デフォルトの名無しさん :02/04/01 03:46
>>93 91の言ってることがよくわかってないな。
108 :
デフォルトの名無しさん :02/04/01 09:31
>>105 いずれかの頂点が他の長方形の域内にあるか、
106は誰やねん。
109 :
デフォルトの名無しさん :02/04/01 09:32
あ、104に言ってるのか。
110 :
デフォルトの名無しさん :02/04/28 18:18
あげげ
111 :
デフォルトの名無しさん :02/05/04 21:00
矩形内に円を描画するアルゴリズムを教えて!
ブロックソーティングと、算術圧縮のアルゴリズムが知りたい。
>>111 座標と大きさを間違えなければ描画できるだろ。
>>112 BOOL block_sort_e(const BYTE* src,BYTE* dst,size_t size,unsigned int* index)
{
unsigned int i;
unsigned int* offset = NULL;
assert(size > 1);
assert(src != dst);
assert(src != NULL && dst != NULL);
offset = (unsigned int*)calloc(65536, sizeof(unsigned int));
if (offset == NULL)
return FALSE;
for (i = 0; i < size - 1; i++) {
unsigned int index = src[i] << 8 | src[i + 1];
offset[index]++;
}
offset[src[size - 1] << 8 | src[0]]++;
for (i = 1; i < 65536; i++)
offset[i] += offset[i - 1];
dst[ --offset[src[size - 1] << 8 | src[0]] ] = src[size - 2];
for (i = size - 2; i; i--) {
WORD idx = src[i] << 8 | src[i + 1];
dst[--offset[idx]] = src[i - 1];
}
*index = --offset[src[0] << 8 | src[1]];
dst[*index] = src[size - 1];
free(offset);
return TRUE;
}
続き。 BOOL block_sort_d(const BYTE* src,BYTE* dst,size_t size,unsigned int index) { unsigned int i; size_t sum, count[256]; size_t* offset = NULL; assert(size > 1); assert(src != dst); assert(src != NULL && dst != NULL); offset = (size_t*)calloc(65536, sizeof(size_t)); if (offset == NULL) return FALSE; memset(count, 0, sizeof(count)); for (i = 0; i < size; i++) count[src[i]]++; sum = 0; for (i = 0; i < 256; i++) { memset(dst + sum, i, count[i]); sum += count[i]; } for (i = 0; i < size; i++) offset[(src[i] << 8) + dst[i]]++; for (i = 1; i < 65536; i++) offset[i] += offset[i - 1]; dst[0] = dst[index]; dst[size - 1] = src[index]; dst[size - 2] = src[--offset[(dst[size - 1] << 8) + dst[0]]]; for (i = size - 1; i > 2; i--) { WORD idx = dst[i - 1] << 8 | dst[i]; dst[i - 2] = src[--offset[idx]]; } free(offset); return TRUE; } 先頭文字の限定ソート
先頭2文字の限定ソート、ね。
>>115 2文字じゃ効果無いでしょ?
もっときっちりソートした奴書いて
算術圧縮 数字0,1,2の3値しかない。 出現頻度を 0が7 1が2 2が1 とする 数直線上に対応を描くと .0.1.2.3.4.5.6.7.8.9 0 0 0 0 0 0 0 1 1 2 この表を逆にひく、最初の数が0なら領域 は 0.0<=W<0.7 というように。 最初が0なら 0.0<=W0<0.7 1なら 0.7<=W1<0.9 これを組み合わせて 値01なら 領域を 0.7*0.7< W01 <= 0.7*0.9 値10なら 領域を (0.9-0.7) * 0.0 + 0.7 < W10 <=(0.9-0.7) * 0.7 + 0.7 こういうふうに領域を分割してゆけば、数直線上の点の範囲として全ての組み合わせを表現出来る W01,W10は範囲を含んだ表現なので、その必要精度だけのビット数で表現しなおせば 圧縮して表現出来るという理屈
121 :
デフォルトの名無しさん :02/05/05 15:41
>>120 ちょっとわからないので、ソース出してください
>>121 書いた事は原理であって、
実際のコードは整数演算で 吐き出したMSB分だけ全体を2^N倍しな
がから考える必要があります。
120の説明の例で10進で考えると
最初に2が選ばれた場合は 0.9=W1<1
となり最初の桁が 9と確定します。
確定すれば10倍して9を吐き出します。
コードがどうしても必要ですか?
123 :
デフォルトの名無しさん :02/05/05 17:16
以下の規則で変換させるにはCでどうやってコーディングすればいいでしょうか if文の羅列はしたくないんで、ビット操作でできないでしょうか 0x80->0x01 0x40->0x02 0x20->0x03 0x10->0x04 0x08->0x05 0x04->0x06 0x02->0x07 0x01->0x08
>>123 それぐらいなら、swich() で書けばいいとおもうが...。
>>124 typo した、switch() だ。
あ! もしかして ビット操作でって for(i=1;i<8;i++) if( ( 0x100>>i ) & x ) break; return i; みたいな意味?
127さんのみてたら for(i=0;i<8;i++){ if( ( 0x10>>i ) & x ){ break; } } でできそうな感じがしてきました
ごめん C はあんまり触りたくないから pascalのコードで悪いけど
>>123 を満たす関数を分岐・ループ無しビット操作だけで
function func(x:Integer):Integer;
begin
x:= (not (x-1)) and $FF;
x:= (x and $55)+((x shr 1) and $55);
x:= (x and $33)+((x shr 2) and $33);
x:= (x and $0F)+((x shr 4) and $0F);
Result := x and $F;
end;
Rangecorderも変形算術圧縮じゃん
アルゴリズムの勉強をはじめたのですが、 本を読んでいると2分探索は 実行回数:long n 計算量:O(log n) 等、いきなりでてきて、何を基にこういう式が求まるのかが 良く分かりません。 分かりやすく説明されている本やサイト、 もしくはどなたか説明できる方がいれば教えてほしいです。
134 :
デフォルトの名無しさん :02/05/14 22:04
>>133 算数とか数学でいいんじゃないかな?
Bサーチだと、
木が平衡な場合の最悪のケースの場合の探索の時間が
logN(底は2だよ)なのはわかるよね?
個人的には
アルゴリズム設計者になるわけではないのなら、
厳密な計算量がわからなくてもいいと思うよ。
1回比較を行うたびに範囲が半分になっていくのダ
136 :
デフォルトの名無しさん :02/05/14 23:13
>134 >logN(底は2だよ)なのはわかるよね とありますが、そのあたりが今一つ分からないんです。 logとか底が2とかがどこからきてるのかが分からないです。 数学の勉強からやり直さないとだめですかね・・・ > 厳密な計算量がわからなくてもいいと思うよ。 性格上、気になって・・・ できればすっきりして勉強進めたいかなと思うので。
137 :
デフォルトの名無しさん :02/05/14 23:24
>>136 logの意味は分かってるんだよね?
log x Y = Z なら
xのZ乗 = Y (逆もまた真)
二分探索するデータの総数がNとする。
1回の比較で、探索する範囲は約N/2になる。
(厳密にはN/2または(N-1)/2になる。)
もう1回比較するとさらに半分のN/(2の2乗)になる。
もう1回比較するとさらに半分のN/(2の3乗)になる。
…
そして、いずれ探索する範囲が1になる。
k回比較して1になったとする。
すなわち、N/(2のk乗) ≦ 1
これはk ≦ log2 Nと同じこと。
つまり、比較回数は高々log2 N回。
n個ので〜たの探索回数をxとすると
>>135 に書いてあるとおり1回の比較で探索範囲は半分になるのだから
n = 2^x
よって
x = log n
140 :
デフォルトの名無しさん :02/05/15 00:08
>137-138 なるほど、良く分かりましたo(^o^)o はじめはlog nの底がてっきり常用対数の 10かと思ったりして混乱してました。 親切にありがとうございます。 本よりも勉強になりました(^_^; いやーインターネットって本当に凄いですね。 そして、なによりも、見ず知らずの無知な私に 丁寧にアドバイスしていただいた方々に感謝です。 それでは、また、分からないことがあったら よろしくお願いいたしますm(_ _)m
>o(^o^)o >(^_^; >m(_ _)m 2chで見るとムカツク
>>141 かわいい子からのメールならカワイく思える罠。
>>140 アルゴリズムの優劣を比較するときは、定数倍の違いを無視するんだ
よ。
例えば「かけ算をx回する必要があるアルゴリズム」と「たし算をx回
する必要があるアルゴリズム」では、たぶんたし算の方が何倍か速い
だろうが、どちらも「たし算をx^2回する必要があるアルゴリズム」
と比べれば、xを十分大きくすれば必ず速くなる。
底が2の対数と常用対数では、定数倍の違いしかない。なぜなら、
log10 x = (log2 x) / (log2 10)
1/(log2 10)は定数だから。つまり、底が何であっても同じこと。
>>137 不等号の向きが途中で逆になってる。
2 < N/(2^k) ≦ 1 をみたすkがあったとすると、
2^(k-1) < N ≦ 2^k だから、
k-1 < log N ≦ k
「比較回数はlog N回以上必要だが、(log N)+1回はいらない」
つまり「ちょうどlog N回」が正しい。
> 2 < N/(2^k) ≦ 1 をみたすkがあったとすると、 > 2^(k-1) < N ≦ 2^k だから、 > k-1 < log N ≦ k 気が狂ってるな。 1 ≦ N/(2^k) < 2 をみたすkがあったとすると、 2^k ≦ N < 2^(k+1) だから、 k ≦ log N < (k+1)
145 :
デフォルトの名無しさん :02/05/18 20:41
フェルマーテストは、O(log n)の増加なので、 1000000近くの素数をテストする時間を1000近くの 素数をテストする時間と比べどのくらいと予想するか。 って1000000近くのテストは1000近くのテストの1.5倍ですか?
ん?2倍だろ?
147 :
デフォルトの名無しさん :02/05/22 16:08
log10 1000 = 3 log10 1000000 = 6 よって、2倍でいいの?
148 :
デフォルトの名無しさん :02/05/23 02:43
>>147 まあそうだけど、底が10でなくても
(log x 1000000)/(log x 1000) = log 1000 1000000 = 2
だ。(1000や1000000が何進法でもOK。)
149 :
デフォルトの名無しさん :02/06/09 21:49
バケットソートとバケツソートと分布数えソートは全て同じ物ですか? また、分布数えソートよりも逆写像ソートを使った方がいい場面というのはあるのですか?
違う
陰面処理のやり方って堂やんの
152 :
デフォルトの名無しさん :02/06/30 15:47
保守
153 :
デフォルトの名無しさん :02/07/01 06:55
さめがめの最適解を算出するアルゴリズムおしえれ
>>153 その前にお前が自力でさめがめを作れるかどうかをおしえれ
156 :
デフォルトの名無しさん :02/07/03 09:53
質問です。 二次元座標上に、円と線がある時、この線が円と交わる点(0ヶ所か、1ヶ所か、2ヶ所) の座標を求めたいのですが、どのようにすれば求められるでしょうか? 数学サパーリなのですが、一応自分でも考えたのですが詰まってしまいました。 私が足りない頭で必死に考えた方法は、この線を直角三角形の斜辺として考えれば 良いのではないかと思ったのですが、その先が思い付きませんでした よろしくお願いします。
>>156 円の中心とその線までの距離を求めて円の半径と比較
>>157 レスありがとうございます。
ちょっと質問が分かりづらかったのかもしれません。
交わっている点の数ではなくて、
交わっている座標を知りたいのです。
よろしくお願いします。
>>156 普通に線と円の方程式を連立して解いたらいかんの?
>>159 レスありがとうございます。
「普通に」と言われてしまうと悩むのですが、
そう言われても私には「線と円の方程式を連立して解く」という言葉の意味すら
理解できないのです。
「線 円 連立 方程式」で Googleってみましたが、
それらしいものが見つかりませんでした。
どういう事をすればよいのでしょう?
よろしくお願いします。
>>156 いま、線はどうやって表現しているの?2点を通る直線?
>>161 レスありがとうございます。
はい、2点を通る直線です。
この線と、その延長線上で、円と交わる点の座標を得たいのです。
よろしくお願いします。
とりあえず、2点の座標から直線の方程式を求める。 2点(Px,Py)(Qx,Qy)を通る直線の方程式は (Qy-Py)(x-Px)-(Qx-Px)(y-Py)=0となる。 ここまでいいかい?
直線の式y=ax+bを円の式(x-c)^2+(y-d)^2=r^2 に代入して その結果の式 (x-c)^2+(ax+b-d)^2-r^2=0 を公式で解く、というのが王道だと思う。 あとは「円の方程式」とか「二元方程式の公式」とかで適当に検索しる!
>163 スマソ、見てなかった・・・
>164 いいさ。
>>163-164 ありがとうございます。
サパーリ理解できませんが、公式と検索のヒントを教えて頂けたので
後はなんとか自力で頑張って理解したいと思います。
本当にありがとうございました。
>164 2元方程式? 2次方程式じゃないの? 変数がxしかないので1元では?
>>167 もし見つからなかったら、直線をX軸に、円の中心をy軸にあわせると
単なる3角形になるから考え易くなると思うよ
うーん、コンピュータで計算できる公式に直す事ができないです。
「二元方程式」だけでググルって57件しかないので、
片っ端から見ても……??????う〜ん。
>>168 二次方程式なのでしょうか?
あらゆる二次方程式は解の公式に変形できると書いてあるサイトを見つけたのですが
↑もできるのでしょうか?
>>169 直線を X軸に合わせるというのはどういう事でしょうか?
円の中心を Y軸に合わせるというのはわかるのですが…。
171 :
デフォルトの名無しさん :02/07/03 12:41
そう、二次方程式だ。書き間違えたよ。無駄な時間を取らせてスマソ>156 鬱だ詩嚢。 あと、164の式中の ax というのは a*x のこと。 ^2 はもちろん二乗のこと。 円の方程式は 円の中心の座標が(c,d)で、半径が r のときに164の式になる。 念のため。 >166 ありがd!
>>171 大人ですよ(汗)
学生時代は数学の時間は寝るものだと決めていたので…。
今になって禿しく後悔しています。
実は円じゃなくて四角形で代用できるような問題の気がしてきました。
四角形なら線と線の交わる点だけでいいですね……。
四角形で片づけようかな…。
>>173 直線って、ひょっとして水平か垂直な直線だけなのか?
>>172 大丈夫です。表記は読めました。
ありがとうございます。
>>174 いえ、さすがにそれはないです。
176 :
デフォルトの名無しさん :02/07/03 13:46
いちおう展開してみたけど、これでいい? もっと変数減らせるかは知らん。 D = 2ac(b-d) - r*r D < 0 で0個 x = c - a(b - d) ± sqrt(D) y = ax + b a = (Qy - Py) / (Qx - Px) b = a * Px - Py
>>176 ありがとうございます。
VBScript で計算してみたのですが、ちょっと答えが変です。
私、何か解釈し間違っているでしょうか…。
LargeD = 2 * a * c * (b - d) - r * r
If LargeD >= 0 Then
x1 = c - a * (b - d) + sqr(LargeD)
y1 = a * x1 + b
x2 = c - a * (b - d) - sqr(LargeD)
y2 = a * x2 + b
MsgBox "ans1=(" & x1 & "," & y1 & ") ans2=" & x2 & "," & y2 & ")"
End If
コピペしまちがえました。 こっちです。 VBScript ですが、読めると思います。 Option Explicit Dim a, b, c, d, r Dim LargeD Dim Qx, Qy Dim Px, Py Dim x1, y1, x2, y2 Qx = 1 : Qy = 0 Px = 0 : Py = 2 c = 1 d = 0 r = 1 a = (Qy - Py) / (Qx - Px) b = a * Px - Py LargeD = 2 * a * c * (b - d) - r * r If LargeD >= 0 Then x1 = c - a * (b - d) + sqr(LargeD) y1 = a * x1 + b x2 = c - a * (b - d) - sqr(LargeD) y2 = a * x2 + b MsgBox "ans1=(" & x1 & "," & y1 & ") ans2=" & x2 & "," & y2 & ")" End If
これかな? もう自信ない。 k = (a*c + b - d) / (1 + a*a) D = r*r - k*k x = (c - a*b + a*d) / (1 + a*a) ± sqrt(D)
これでいい? k = (a*c + b - d) / (1 + a*a) D = r*r/(1 + a*a) - k*k x = (c - a*b + a*d) / (1 + a*a) ± sqrt(D)
182 :
デフォルトの名無しさん :02/07/03 16:07
b = Py - a * Px
うわー!みなさんありがとうございます!! それらしい値が出てきました!! 結局全部他力本願になってしまいましたが、皆さんのおかげで なんとかなりそうです。本当にありがとうございます。 Option Explicit Dim a, b, c, d, r Dim LargeD Dim Qx, Qy Dim Px, Py Dim x1, y1, x2, y2 Dim k Qx = 1 : Qy = 0 Px = 0 : Py = 2 c = 1 d = 0 r = 1 a = (Qy - Py) / (Qx - Px) b = Py - a * Px k = (a * c + b - d) / (1 + a * a) LargeD = r * r / (1 + a * a) - k * k If LargeD >= 0 Then x1 = (c - a * b + a * d) / (1 + a * a) + sqr(LargeD) y1 = a * x1 + b x2 = (c - a * b + a * d) / (1 + a * a) - sqr(LargeD) y2 = a * x2 + b MsgBox "ans1=(" & x1 & "," & y1 & ") ans2=" & x2 & "," & y2 & ")" Else MsgBox "No junction " & LargeD End If
184 :
デフォルトの名無しさん :02/07/22 18:07
n個の行列M1,M2,M3....,Mnが与えられたときに、スカラー乗算の回数が 最小になるように行列積M1M2M3…Mnに括弧をつける問題に対する アルゴリズムを、コードじゃなくて日本語で説明してください。
数学板に逝け。
板違いスマソ
187 :
デフォルトの名無しさん :02/07/22 20:29
動的計画法について教えてください。
動的計画法? 何の? トポロジカルソーティングの事か?
順列生成のアルゴリズムで一番速いのって何ですか? 辞書順でなくてもいいです。
190 :
デフォルトの名無しさん :02/08/10 19:24
192 :
デフォルトの名無しさん :02/09/09 05:44
ボイヤ・ムーアでなぜ高速検索できるのかわかりません
検索しなくても良い部分をはしょっているから
>>192 ちゃんとした解説は市販本でも読んでいただくとして・・・
n文字テキストからm文字キーワードを探す場合、
キーワード末尾の比較を行って、一致しなければ、一気にm文字分比較したのと同じ効果が得られる。
すなわち、最小比較回数が n/m 回になる。そして、実際もかなり小さい。
他の方法(KMPとか)は、必ず n 回比較するので、BM法の方が速い。
BMって、素朴サーチと比べてオーダは小さそうだけど 定数部分がおっきい感じがする。 って言うか、多バイト文字とかBMで検索するのって 難しそうだし。
>>194 >>n文字テキストからm文字キーワードを探す場合、
>>キーワード末尾の比較を行って、一致しなければ、一気にm文字分比較したのと同じ効果が得られる。
まさにそこがわからんのです。
説明しずらいのですが、n文字列の先頭(厳密には先頭でないが)からキーワードの末尾との比較を行い、一致しなかったら次はキーワードの末尾の一個前(後ろから2番目)と
比較を行い、文字が一致すれば一文字文スキップする。一致しなければ、またキーワードの今比較した文字の一個前(キーワードの後ろから3番目)と比較して文字が一致すれば
2文字分スキップする。一致しなければ、同様にキーワードの後ろから4番目と比較する、、、、というふうにキーワードをスキップさせて行くんですよね?
これだと比較の回数はn/m回にはならないのですが、、どうでしょう?
何か私の説明は間違ってますか?
> >>n文字テキストからm文字キーワードを探す場合、 > >>キーワード末尾の比較を行って、一致しなければ、一気にm文字分比較したのと同じ効果が得られる。 > まさにそこがわからんのです。 テキスト側の一致しなかった文字を x としよう。 もし、x がパターン文字列に含まれていなければ、一気に m文字分 スキップできる。これは OK? もし、x がパターン文字列に含まれているなら、その出現位置によって スキップできる文字数が決まる。 実際には、マッチングに先立ち、パターン文字列をもとにして、この 「スキップできる文字数」のテーブルを使っておく。
× 使っておく ○ 作っておく
>>195 表を1つだけつかうならば、定数部分はそんなに大きくないよ。
演算数は、せいぜい2倍。
もちろん、パターンが1文字とか2文字とか、
アルファベットサイズが2とか10くらいだと、単純法より遅くなるだろうけど。
多バイト文字は、まぁ、wchar_t とかJavaのcharとか、
あるいは自前で (unsigned) short int とか、使ってやってくれぃ。
>>195 ,
>>199 ShiftJIS や EUC とかでも別に難しくはない。
普通にBMでマッチングかけた後、マッチした部分が1バイトずれた
ところでないかどうかをチェックすればよいだけ。
>>197 レスありがとうございます
>>もし、x がパターン文字列に含まれていなければ、一気に m文字分
>>スキップできる。これは OK?
これは理解できます
しかし
>>もし、x がパターン文字列に含まれているなら、その出現位置によって
>>スキップできる文字数が決まる。
この説明で、出現する位置まで一つ一つ比較を行っているとれば
>>194 さんの説明の最小比較回数がn/mになることはありえないと思うのですが、
>>201 オーダーで考えればO(n/m+m-1)=O(n/m)だな。
あるいは、見つからなければn/mである。
203 :
デフォルトの名無しさん :02/09/15 01:43
教えてください 円周上におかれた、3点の座標から、その円の半径と、中心座標を 求めるプログラムを書きたいのですが・・・。 どっかに、アルゴリズムありませんか?・・(^^; よろしくーです
>>203 3点でわかるの?
120度ずつの3点なら中心求めれば簡単だけど
0、1、2度の3点ではわからないのでは。
>>203 残念ながらその最適アルゴリズムは俺様が特許を持っています。
206 :
203です :02/09/15 02:33
え?・・特許ですか?・ 円の方程式から、連立方程式を立てて、解けばできると思うんですが・・。 やっぱり、ガウスジョルダンとか使わないとだめなのかな・・・ めんどくさいよー 引き続き、ご意見募集
>>205 残念ながらその発言方法はボクが特許を取っています。
月末に特許料の請求書を送りますので、間違いなく振り込んで下さい。
ある5リズム (ズンチャチャズンチャ)^n
211 :
203です :02/09/15 04:34
>>207 外心の計算をする場合、2元2次連立方程式、あるいは、3元2次連立方程式の
解をもとめないと、いけないの思うのですが、
プログラム上で、連立方程式を行列で解くのが、手間なので質問してます(−−;
よろしくです。
google で検索すれば山のように見つかると思うが。
>>211 定規とコンパスを使って外心を求める方法は中学校で習わなかったか?
215 :
203です :02/09/15 05:28
ありがとうございました。 なんか、数学の板に同じ質問をしていた人がいたので、 参考にさせてもらいました。
マルチに踊らされたな
文章から単語を切り分けたいんだけど
英語?半角スペース?
>>218 英語の場合は 空白で区切る 行末が -ならつなぐ
日本語の場合は人工知能のまず開発をお願いします
>>220 日本語の場合は茶筅とか案山子使えばいいんでは?
英語の行末ハイフンは連結語のハイフンも兼ねている場合があるので、
単語辞書も持っていたほうがいいね。
日本語で 細かい文法的なことはあんまりきにしないで 漢字の単語だけ切り分けたい 茶筅 案山子 ってなんですか?
インタラクティブな万華鏡ソフトを作ろうとしています。ある図形から正三角形を切り出すところまで終わりました。 三角形の各辺の中点を軸に180度回転させながら、図形を形作ろうと考えてます。 もっと良いアルゴリズムがあったら教えてください。
>>224 sageで聞いても皆が見てくれないよ。
とりあえずもっと良いアルゴリズムって言われてもなあ
bitmapをリージョンかけて切り出してそれをまた回転するくらいかなあ
226 :
デフォルトの名無しさん :02/09/24 17:20
多バイト文字は、まぁ、wchar_t とかJavaのcharとか、 あるいは自前で (unsigned) short int とか、使ってやってくれぃ。
227 :
デフォルトの名無しさん :02/09/24 17:21
k = (a*c + b - d) / (1 + a*a) D = r*r/(1 + a*a) - k*k x = (c - a*b + a*d) / (1 + a*a) ± sqrt(D)
228 :
デフォルトの名無しさん :02/09/28 19:31
X = x[1] ... x[n]とY = y[1] ... y[n]というサイズnの配列があって、 それぞれにソート済みのn個の実数が入っているとき、これら2n個の実数の 中央値を求める、オーダーがlognのアルゴリズムを探しているんですが、 何か良いアルゴリズムはありますでしょうか?
>>228 抽象的な割には、やけに汎用性の乏しい問題だな。。。
これが宿題でなく、実際に問題になっているのなら
まず先にデータ構造の方を考え直せ。
スミマセン。宿題です…。 二分探索木をどのように使えばいいんでしょうか? 空の二分探索木に2n個の数を入れると根の数が中央値になる…なんて性質 ありましたっけ?この操作ならO(logn)で出来ますが…。
233 :
デフォルトの名無しさん :02/09/29 01:42
えーと、どういう風にすればいいんでしょうか…?
よくわからないんだよね〜僕には中央値が。 二つの配列の値を比較しながら、近づくように走査していくのかな? このとき、それぞれの総和を求めて行った方が良いのか?とか 二つの配列のそれぞれ両端から色々比較したりするのであれば、 4つ場所を保持しておかなければいけないと思うのだけれど、 その辺もわからない。わからないだらけの第3者です。
235 :
デフォルトの名無しさん :02/09/29 03:22
うーん、とりあえず条件は計算量がO(logn)であることと、2n個の数の 中央値を求めるってだけなんで…。 宿題なので実行効率とかそういうのは考えなくていいと思います。 変数や配列などの記憶場所も好きに使って良いと思います。 わざわざ配列が二つあるってことはマージを利用するのかなーとか いろいろ考えては見てるんですけど…。
宿題スレへ逝け
おまいらしっかりしてください。 値を2個ずつとってきて、 「現在の中央値」「新しい値(1)」「新しい値(2)」 の<3つの中の中央値>をとれば、 それが新しい中央値になるじゃないの。
まてよそれだと O(n) か?
問題(
>>228 )読んでなかった。。
思いっきりバイナリサーチ(二分探索)じゃねーかYO!!
初歩だ初歩。あと二分探索木とか逝ったやつ反省しる
low1 = low2 = 0; high1 = high2 = n - 1; do { mid1 = mid2 = (low1 + high1) / 2; median = x[mid1]; if (x[mid1] < y[mid2]) { low1 = mid1; high2 = mid2; } else if (x[mid1] > y[mid2]) { high1 = mid1; low2 = mid2; } else break; } while (low1 < high1 || low2 < high2); ここに直書き。あってるかどうかまったくわからない。
242 :
デフォルトの名無しさん :02/09/29 11:17
>>228 (ちょっと怪しいけど)こんな感じでは?
double f(double x[],double y[],int l)
{
double xp,yp,z;
do {
l>>=1;
if((xp=x[l])==(yp=y[l]))
return xp;
z=(xp<yp)?(x+=l,yp):(y+=l,xp);
} while(l);
return z;
}
double xx[]={1,2,3,10,11,12,};
double yy[]={4,5,6,7,8,9,};
int main(void){f(xx,yy,6);return 0;}
243 :
デフォルトの名無しさん :02/10/05 00:44
答え合わせは?
中央値は、x[],y[]のそれぞれ両端から比較していかないと取れないって・・・
245 :
デフォルトの名無しさん :02/10/05 02:04
中央値。とりあえず文章で説明してみる。実装は自分でやってくれ。 中央値を求めるのではなく、集合を大きい方と小さいほうに二等分する問題と 考えてみる。たとえば 集合X{1, 3, 6, 7, 10} 集合Y {2, 4, 5, 8, 9} としてみる。 まず、集合Xを二つに分けると、ある敷居を境に大きいグループと小さい グループにわかれる。この敷居を動かしていくと考える。まずは真中近辺 からスタート。6と7の間に敷居があるとしよう。 X{1, 3, 6 || 7, 10} Xが小さい方に3つ、大きい方に2つに分けたのだから、 Yは小さい方に2つ、大きいほうに3つに分けることになる。だから Y {2, 4 || 5, 8, 9} となる。このとき、6>5だから、この分け方は正しくないことがわかる。 #分け方が正しいか正しくないかを見分けるには、例の場合4>7、6<5 #を確認すればいいので、o(1)で調べられる。 では、この敷居の位置が悪かったことがわかる・・・、あとはバイナリサーチ よろしく敷居の位置を変えればいい。o(logn)回敷居の位置を変えれば、正しい 分け方が発見できる。そうすれば中央値も求まる。
#include <stdio.h> #define N 5 void f(double x[], double y[]) { int l = 0, r = N-1; do { int m = (l+r)/2; (x[m+1] < y[N-(m+1)])? (l = m+1): (r = m); } while (l < r); ((x[l+1] == y[l]) || (x[l+1]-y[l] <= y[l+1]-x[l]))? printf("%f,%f\n",y[l],x[l+1]): printf("%f,%f\n",x[l],y[l+1]); } main() { double x[N]={2,3,3,7,9}; double y[N]={1,6,6,7,11};/*1,2,3,3,6,6,7,7,9,11*/ f(x,y); }
失敗
248 :
デフォルトの名無しさん :02/10/09 00:06
平面グラフの頂点を,隣接する頂点を異なる色で塗るとき, 4色あれば十分なことが証明されてますが(いわゆる4色定理), その塗り方を求めるアルゴリズムを教えて下さい.
でかい本屋いって探せよ〜〜といいたくなるようなものなのですが。
>>248
251 :
デフォルトの名無しさん :02/10/09 21:23
>>248 >平面グラフの頂点を,隣接する頂点を異なる色で塗るとき,
>4色あれば十分なことが証明されてますが
一点から辺が5本以上出ている "頂点" は
4色では塗れませんが、何か?
>>251 真ん中を青で塗って、周りの五つを赤、緑、赤、緑、白とすればよい。
>>251 日本語をもっとしっかり読め。
>>248 mod4で2足したりとか順にしていけばけっこうできるんじゃ無いの?
>>248 つーか、今はどんな手法使っているのよ?
始めは
>>249 のように力任せでもいいと思うけどな。
頂点数が1000くらいまでなら、最近のコンピュータなら十分速い。
えっと,4色塗りのアルゴリズムそのものが欲しいんではなくて, そのアルゴリズムを使って別のことをしようとしています. (具体的に何をしようとしているかはかなりややこしいので書きません) 考えて頂いておいて申し訳ないのですが,時間がかかるかもしれないけど 解けるというような方法は,私の目的には使えそうにりません. 真面目に文献調査をすることにします.
256 :
プロの逝って良しの1 ◆MvRbZL6NeQ :02/10/14 13:09
257 :
デフォルトの名無しさん :02/10/14 13:10
>>255 N. Robertson, D. P. Sanders, P. Seymour, and R. Thomas, ``Efficiently
four-coloring planar graphs'', In Proc. 28th ACM Symp. Theory of
Computing, pp 571-575, 1996.
259 :
hiloshi :02/10/23 20:18
フィボナッチ探索ってどういうのか分かります?
>>255 一松信先生の「正多面体を解く」とか読むと良いかも。
三十ページ辺りだけでも。
情報ありがとうございます.
>>258 ご指摘の STOC の論文を入手し読みました.まだ理解できておりませんが,
4色問題の証明に基づくアルゴリズムということで,非常に面倒そうだという
ことだけ分かりました.逆に言うと,単純なアルゴリズムがあれば,4色問題の
単純な証明になる!ということですね...
>>260 調べてみます.
四色問題(ブルーバックス)
Perl は屑!
265 :
デフォルトの名無しさん :02/10/27 15:52
ハノイの塔おもしれーーーーー(゜∀゜)ーーーー!
番号の低い順にならべてください(1が一番上)。 番号の高い物は上に重ねられません。 1 3 1 23 2 ────
32 133 1221 ─────
268 :
デフォルトの名無しさん :02/10/27 19:35
迷路を解くプログラムを作って欲しい
ハノイの塔の板の枚数がnのときの移動回数をnの関数として求める というのはアルゴリズム論のよくある試験問題かも
271 :
デフォルトの名無しさん :02/10/28 22:35
>>269 n^2-1
光速で導きだせましたが何か?
枝刈り法
>>272 平面でも壁の連結成分が2個以上になった時点でアウト
>>268 交差点で進んだ方向を記録しる。
平面なら最高3回、立体なら最高5回(つーか、分岐数−1回)
>>268 入口から水を注入して、最後まで水流のあるルートが解です
矩形内に円を描画するアルゴリズムを教えて!
279 :
デフォルトの名無しさん :02/10/30 19:45
baranced kd-tree の日本語解説があるページ or 本ってありますか?
280 :
デフォルトの名無しさん :02/10/30 20:29
3次元のダンスが見られる韓国製のフリーソフトで「D-Player」ってのが あるんだけど、すごくリアルなモーションのくせにモーションデータが 小さすぎ。2、3分のデータでなぜか数百バイトとかなんだけど……。 どういうアルゴリズムか少しでも知ってる人いませんか?
グレッグ・ブライトの迷路は、行き止まりがありません。
Objective-C !!
285 :
デフォルトの名無しさん :02/11/02 18:59
ゴールはゴールでフラグでも立てとけよ
288 :
デフォルトの名無しさん :02/11/02 21:13
↑ DQN大学っぽい卒論だと思ったらやはり山形かよ
292 :
デフォルトの名無しさん :02/11/04 15:19
age
293 :
デフォルトの名無しさん :02/11/06 10:11
>>287 おれはこの子の論文どうこうに興味はないが、この子がついている教授がどの程度のもんなのか
見てみたい。
294 :
デフォルトの名無しさん :02/11/08 21:31
>>294 学外活動
看護管理者(ファーストレベル)研修会
ナースいっぱい・・・ハァハァ
浮動小数をサポートしてない機種で、浮動小数を実装したいと思っています 数値を浮動小数化するのは難しくないのですが、 浮動小数同士の足し算掛け算などで詰まってしまいました。 計算方法を解説してるHPなどありませんでしょうか
>>296 足し算掛け算に詰まるのに、浮動少数化するのが難しくないとはどういうわけですか?
漏れには信じられん。
浮動小数の仕組みはあっちこっちにあるので、変換はうまくいきました。 ただ掛け算はともかくとして、 足し算引き算は指数の離れている同士だとどうしましょうといった感じです
> 足し算引き算は指数の離れている同士だとどうしましょうといった感じです 有効数字が被らなければ無視すれば?
足し算引き算は、指数の大きいほうに揃えるしかないだろう。 それで失われる情報が「桁落ち」というやつだよ。 しかし、掛け算も結構面倒なはずだがなー たとえば、仮数どうしをかけた後で、もう一度正規化する必要があるとか… (1/2*1/2は1/4になっちゃうから。)
もしや掛け算この方法間違ってるのかな… 色々情報ありがたいことです。さらに調べてみます
>>301 そういうときこそ Knuth の本を読むのがよいと思われ
303 :
デフォルトの名無しさん :02/11/11 01:24
固定小数点に関するお勧めのサイトありませんか?
多角形と線分の交差判定って 凸型の多角形を前提にしてるものばっかりに思えるんだけど 凹型でも問題なくて、プログラムしやすそうなアルゴリズムって どんなのがありますか? あとこの辺りの計算幾何学のオススメの本とかあったら知りたいですけど こういう本ってやっぱ高いのはしょうがないんですかね? ちょっと安めでいい本があったら知りたいです。
305 :
デフォルトの名無しさん :02/11/11 13:27
交差判定って 普通、線分同士でしょ?
or and xor notだけで足し算ルーチンは作れないものでしょうか
CPU内部ではそうやってるよ
なるほど。 WinAPIに、BitBltという画像転送があるのですが 主にそのままコピー、or合成, and合成, xor notができます それらを組み合わせて上手く加算合成とかをつくれないかなと
310 :
デフォルトの名無しさん :02/11/13 22:10
>>307 シフトが無いと 配列として処理するしかないけど
1ビットのレジスタ A,B とキャリの演算
A+B+Cy -> Cy+X
0+0+0 -> 0 cy0
0+1+0 -> 1 cy0
0+0+1 -> 1 cy0
0+1+1 -> 0 cy1
1+0+0 -> 1 cy0
1+1+0 -> 0 cy1
1+0+1 -> 0 cy1
1+1+1 -> 1 cy1
この表から論理演算を作ればいい
311 :
デフォルトの名無しさん :02/11/13 22:44
>>309 > WinAPIに、BitBltという画像転送があるのですが
下位からの繰り上げの処理が実装しにくいと思うので、Bit数に応じて同等数
以上のBitBltが必要になると思うんだけど、、、
間違っているかもしれないので、突っ込みよろしく。
素直に「リプルキャリー」で1ビットハーフアダー(1ビット入力*2、 1ビット出力*1とキャリー出力)を作ると、 A+B=A or B, Cy=A and B 1ビットフルアダーは(1ビット入力*2、キャリー入力*1、 1ビット出力*1、キャリー出力)は、 A+B+Cy=A xor B xor Cy Cy=(A and B) or (B and Cy) or (Cy and A) =(A and (B or Cy)) or (B and Cy) これをビット数だけ繰り返せばよいわけだが。
そうなんですよね。「2倍にして合成」とかあるかと思ったんですが、ありませんでした ピクセルごとに処理する方法は別に簡単なのですが、BitBltはハードウェアサポートのおかげで 超高速です。 それこそ100回や200回描画したところでびくともしません シフトがないので桁あがりが無理そうですね…
うわ、見事に同時書き込み。 じっくり読んで理解するよう勤めます
>>313 なるほど、
まず合成する画像の特定bit部分だけとりだすのは、andを使えば簡単ですね。
特定の色で塗りつぶした画像を作り、それとand合成すれば良いわけですから。
加算器の構造に関してもHPと併用して理解できました。
しかしやはり繰り上がりができませんね。
シフトができない以上ここで手詰まりでしょうか。
>>304 線分の始終点のどちらかあるいは両方が多角
形内部の場合は交差。
多角形が反時計周りか時計周りか調べておく。
後は、線分と多角形の辺との交差関係を順次
調べて、交点での外積値の比較によって線分
が多角形の内部に入り込んでいるかをチェッ
ク(反時計周りか時計周りかの情報も利用)。
てのはどうでしょう。
>>316 > シフトができない以上ここで手詰まりでしょうか。
Bitmapを一次元にするとxを1ビットずらしてクリッピングでOKでは?グラフィッ
クカードに演算させるもは面白そうなので頑張ってね。
選択ソートと、バブルソートって比較回数はバブルの方が少ないですか? でも実際交換回数は、バブルの方がぜんぜん多いんですけど。
>>318 RGBデータ部を1バイトずつ読み、シフトして返すのは可能ですが今回の目的にはそぐわないです
RGBデータ部全体を1bitシフトするのは流石に無理な気がします
何故シフト演算合成つくらなかったんだマイクロソフト!!
>>319 なんで?
単純なインプリメントだと
選択ソートは(n-1)(n-2)/2回
バブルの場合は(n-1)^2回
だと思う。
バブルソートでも最後に交換のあった位置を覚えておけば減るけどな。
>>320 > RGBデータ部を1バイトずつ読み、
2値のBitmapじゃないんだ。じゃ大変そうですな。
ヒープソートがわからない・・・。
ヒープソートを、図を書かずに分かりやすく説明する自信がない。
ダウンヒープってさ、根に向かって値があがっていく感じなの? みためは上に向かってるけど、木として考えたら根に向かってるから ダウンだけど。
326 :
なるなる ◆QkRJTXcpFI :02/11/15 22:08
おめぇら何歳? 我17だ。 そこまで知識を得るのに何歳から勉強してんだ? たのむおしえて
マジレスだけど幼稚園で競馬プログラムをハッキンハッキンしてますた と言っても本当に簡単なものだけどね 1から作りはじめたのは小学校後半 0から作るようになったのは高校ぐらいだ 17だったら丁度2種とって喜んでた頃だな
328 :
デフォルトの名無しさん :02/11/15 22:21
10年も前の話だけど取引先の総務部長が、
韓国人の総会屋に一歩も引かなかったんだけど、
高校生の娘がレイプされて陥落。
ピストルをあそこに突っ込んだ写真を送ってきたらしい。
ネガは返してもらったらしいが親にしたらたまったもんじゃないだろう。
,
帰ってきただけまだましかも・・・・・・。
同じような目にあって、薬漬けにしてパチンコ屋の店長に
ペットとして払い下げられた中学生を知ってます・・・・・・。
http://ex.2ch.net/test/read.cgi/korea/1035676130/ ↑ レイプ、拉致、人身売買、バラバラ殺人、カルト、毒殺、暴力など
330 :
デフォルトの名無しさん :02/11/15 23:16
>>323 >>324 樹構造に、重りをぶら下げて行くと、上の部分は総和になり重くなっていく。
そのような、順番に大小のある値が入っている。
>>330 別に総和じゃないけど...
>>325 ふつう根を上に書けば「ダウン」は下へ行くだろ。
まあ、本によって説明の仕方は違うかも知れんが。
根が最小値のとき、ヒープ(priority queueともpartially-ordered tree
とも言う)へ値を挿入するには、葉から根へ向かって適当な場所まで
シフトして行く。最小値を削除するときは、空いた根の位置に、
いちばん端の葉の値をまず入れ、葉に向かってシフトして行く。
>>326 適当なアルゴリズムの参考書を購入しる。
最初は分からなくてもいいから、同じものを全部を通して最低10回は読む。
あら不思議、5回目くらいから書いてあることが頭にどんどん入ってくるYo!
...これ、ちゃんとした学習法でつよ?
>>331 > 根が最小値のとき、ヒープ(priority queueともpartially-ordered tree
> とも言う)へ値を挿入するには、葉から根へ向かって適当な場所まで
heapとpriority queueとは同じじゃないよ。priority queueを実装するのに
heapを使うことが良くあるだけ。つまりheapじゃなくてもpriority queueは実
装できる。partially-ordered treeってのはあまり(というかほとんど)耳にし
たことがない。
>>332 なんだかんだとそれが一番正しい勉強法だと思う。
私も同じ方法で勉強してましたw
どの分野にも言えるけどがむしゃらに手を出すよりは、
ひとつの本を何度も読んで理解した方が早いよね。
その上で、内容がものたりなかったり、どうしてもわかりにくいところがあれば、
別の本に手を出して、また読み返していれば良し。
ちゃんと理解もしていないのにどんどん本を変えると、
かえってわかりにくくなるときもあるよ。
書く人によっては言葉の定義が違ってたり、くせもあるから。
後は、やはり実践かな。
>>333 まあそうね。priority queueを実装するのには単にbinary partially-ordered
treeが標準的な手法というだけで、イコールではないね。
partially-ordered treeを聞いたことがないってのは…(笑
「ヒープ」なんて呼ぶのはヒープソートの時だけだよ。ふつーの
文脈でヒープといったら別の意味だから。
>>JPS ねぇ、マージソートはできたの?
338 :
デフォルトの名無しさん :02/11/17 00:16
>>335 ヒープってデータ構造のことだろ。Cormen,Leiserson&Rivestでも読め。
339 :
デフォルトの名無しさん :02/11/17 01:14
>>338 ほかのヒープもあるからややこしいの。
ややこしく無いようにpotと呼んどけ。
340 :
デフォルトの名無しさん :02/11/17 02:16
posetは使われるけど,potってのはなぁ…
>>340 そりゃまたぜんぜん違う意味っス。
これだから知ったかは…(w
hurry porter! いよいよっすね!
>>342 ほんとのスペルミスかどうかわかりにくいボケはやめて…
344 :
デフォルトの名無しさん :02/11/17 02:58
posetとpotが同じ意味だなんてどこにも書いてないと思うけど…
ネタはもういいよ…
>>344 はいはい。わかったわかった。
ageずにおれないほど悔しかったのね、ボクチャン?
347 :
デフォルトの名無しさん :02/11/17 03:03
どうしてもpotがよく使われているということにしたいんでしょう。CLR程度さ えまともに勉強してないのがバレバレなのに。
>>347 はいはい。ゼミで読んでうれしかったのね。
じゃ、君はPOTの替わりにずっとヒープと言ってなさい。
ちなみに俺のゼミではAho, Hopcroft, Ullmanだったよ。
RivestとAhoとHopcroftとUllmanは知ってるけど、あとの2人は何した人?
350 :
デフォルトの名無しさん :02/11/17 03:18
>>348 > ちなみに俺のゼミではAho, Hopcroft, Ullmanだったよ。
まだそんなひどいの使ってるのか…だいたいゼミってなんだよ。学部2年で終
わらせとくもんだろう、アルゴリズムの単位なんて…日本の大学ってやっぱレ
ベル低いな。
>>350 いや、18年前の話なんだが…
ま、いずれにせよ「ヒープ」といったらデータ構造のほかに
動的メモリ割り当てのための領域のことを指すことも多いから、
よりspecificにpartially-ordered-treeと言った方が安全。
352 :
デフォルトの名無しさん :02/11/17 03:21
Cormenはダートマス大、LeisersonはMITの先生。
>>352 フーン…
別にたいした人じゃないのね。
354 :
デフォルトの名無しさん :02/11/17 03:22
>>351 >
>>350 > いや、18年前の話なんだが…
で、それっきり研究の進展を勉強してない、と。ひとりで通用しない
partially-ordered-treeって言い続けてろや。
355 :
デフォルトの名無しさん :02/11/17 03:24
>>353 > 別にたいした人じゃないのね。
そのとおり。こんな時にこんなところで書きこんでるあなたさまと比べたら。
>>351 たしかにそっちのheapの方がよく使うよね。
>>354 (プ
partially-ordered-treeと言われると理解できないらしい。
>>354 まあ、あんたは「メモリ領域じゃないほうのヒープ」と言いつづけてろや(w
CLR程度の初級教科書を読んで「研究」(禿藁
Wirthの「プラスイコール」ですが何か?
どうでもいいけどお前ら必死すぎ
>361 禿同 なにをこんな朝早くから議論してるかと思えば、アルゴリズムじゃなくて名前に ついてかい…
363 :
デフォルトの名無しさん :02/11/17 05:20
>>359 > CLR程度の初級教科書を読んで「研究」(禿藁
CLRさえ読んでないのか。タイトルだけで入門書だと思ってる。
>>363 なにやら知らんが必死だな(藁
漏れはCormen, Leiserson, Rivest and Steinなら読んだが、
あれを読むと何か研究したことになるんか?
マタ〜リマタ〜リ
366 :
デフォルトの名無しさん :02/11/22 15:06
遺伝的アルゴリズムの入門者用の良いサイトあったら教えて下さい
368 :
デフォルトの名無しさん :02/11/23 14:42
>>367 サンクス
でも何か具体例がないから難しいですね
>367 具体例は分かりづらいかと思われるが>287にある。
370 :
デフォルトの名無しさん :02/11/24 03:16
371 :
デフォルトの名無しさん :02/11/24 04:44
・小さなファイル(500Byte程度)が6000個ある ・全てのファイル名はユニークで、一つのディレクトリ内に集めれている ・あるファイルと、中身の文字列が全く一緒であるファイルが最大20個程度 ある可能性があります(内容ダブっているってこと。) これらのファイルを、内容が重複するものを削除したいのです。 更に、A⊃B となるような(Aは、Bの内容になんらかの文字列を追加したもの) ファイルもあるので、Bも無駄なので削除してしまいたいのです。 最速、いやせめて実用的な方法ってどうやればいいんでしょう。。
500Byteが6000個でしょ。全部メモリに入れちまえば。
ファイルの内容をキーにファイル名をソート。 比較時にA⊇Bであるようなペアを記憶しておく。 上の前提条件を改めれば劇的に速くなるだろうけど。 たとえばデータ構造やらファイルの命名規則やら ファイル作成時にチェック入れるとか。
頭の悪い俺は、こんな風にやりました。perlで実装してます。 1) ディレクトリのエントリからなるリストの上から順に 次のファイルとdiffで比較→同じなら削除 →違うなら更に次のファイルとdiff..(以下略 この馬鹿げた方法では、10時間経っても終わりませんでした(藁 少しは無い頭使ったところ、以下のようになりました。 2) ディレクトリエントリのリストを使うのは一緒ですが、初めに サイズ順にソートしておきました。ファイルサイズが一緒の 場合のみ、実際にdiffで比較。ファイルサイズが異なるファイル に出会ったら、中身の文字列が完全に一致しないのは明らかなの でスキップ。次以降のファイルも、サイズが違うのは明らかなの で同様にスキップ。次のループへ... これでやると、3分で終わりました。 しかし、A⊃Bの場合にBを削除する要求にはノータッチなのです。 なやんでるところ。
>373は当然として俺まで無視かよ!!
ごめんちょ
皆さんありがとう
>>372 効率よい&&実装できそう な方法を使っても、それでも遅かったら
そうしてみようと思います。
>>373 早速、今日試してみます。出勤なので・・
>>374 その方法で検討中wちょっと楽しみ。
そもそもの背景が、3交代シフト勤務の現場で、勤務交代するときに
生成される引継ぎファイルの内容を全文検索可能にしようという企画です。
1件の引継ぎ項目ごとにファイルに分割し、それにユニークな名前を
つけて一箇所に集めているのです。
個々の引継ぎ事項ってのは全員に行き渡るまで消去されないので、
複数日の引継ぎファイルに残る → 結果、重複する内容がある
データ構造かぁ。。問題ありあり、というかマークアップもなにも
ない、プレーンテキストだからなぁ。
>>373 しまつた!この仕組みは、Linuxで動いてます・・
500Byte6000個。 create table hikitugi ( hikitugi_cd char(10), author_cd char(10), naiyo varchar2(4000) insert_date date, ); SELECT * FROM HIKITUGI WHERE NAIYO LIKE '%もうね%'
382 :
デフォルトの名無しさん :02/11/24 05:31
112233334444555555556666をLz78符号化して 112020343440474059510510606136 という結果を得たとき、これを復号化する際 〜106 を10番目の語句+6ではなく、1番目の語句+0+6番目の語句+…と解釈すると 1122333344445551203316612334となります。 辞書の番号が一桁なのか二桁なのかどう区別したらいいのでしょうか?
class Pair def initialize(name, contents) @name = name @contents = contents end def name @name end def contents @contents end end Dir.chdir(ARGV[0]) data = Dir.glob("[^.]*").collect { |file_name| f = File.open(file_name) begin Pair.new(file_name, f.read) ensure f.close end } data.sort{ |a, b| a.contents <=> b.contents } i = 1; while i < data.length do str = data[i - 1].contents if str == data[i].contents[0..(str.length - 1)] then File.delete(data[i - 1].name) end i += 1 end
>>379 Rubyで書いてみた。
ruby ディレクトリ名
で実行せよ。ファイル名はピリオドで始まらないと仮定してる。
ruby スクリプト名 ディレクトリ名 のマチガイ。逝ってきます…
>>382 何故十進数で符号化するのか分からないんだけど・・・
固定長でも可変長でもいいから別の符号化法使うか、
そういうのがダメ(っていうのは無いと思うけど)ならセパレータを使ったら?
たびたびスマソ sortじゃなくて sort!ですた。
>370 論文ではなく、研究発表用の資料だろう。発表は短時間で概要を説明するのが 主眼だから、細かい証明や考察なんかはザックリ落とす。
390 :
デフォルトの名無しさん :02/11/29 09:02
フーリエ変換って周波数成分取り出してそれをどういった事に応用できるのでしょうか?
>>390 宿題?
直接的にはシステムの応答特性を見たり
畳み込みを高速に処理したり、
それを応用して多倍長掛算を高速化したり
>>390 あと、lossyなデータ圧縮にも使う。
>>393 DCTもFFTも似たようなもんでしょ。
まあでもそれを同じと言ってしまうと フーリエ変換とラプラス変換も同じようなもんだって事に
FFTを使ったlossyなデータ変換は、実際にあるでしょ。
>>396 例えば?
DCTをFFTで実現するのは普通にあると思うけど
398 :
デフォルトの名無しさん :02/11/30 00:54
>>391 ふーん、よくわからんからやっぱいいです
>>397 Dragon Cuest Ten
Final Fantasy Ten
合併だってな・・・
Dragon Fantasy になるのかな? それとも Final Quest になるのかな?
>>397 >DCTをFFTで実現するのは普通にあると思うけど
そしたら、それは「FFTを使ったデータ圧縮」といって良いんとちゃうんかと…
DCTはFFTの変形版でつよん? 波形をコピーして、位相をずらしたFFTの特殊系をDCTと呼ぶのでつ。 その変形方法によってDCT I,II,III,IV の4種類がありまつ。 JPEGなどで使われているのはDCT-IIでつ。
FFT使ってもlossyとは限らないとは誰も突っ込まないのか?
>>403 まぁ普通のFFTが普通はlossyで、無歪みのFFTは特殊なFFTです。
405 :
デフォルトの名無しさん :02/11/30 17:15
2分木に関する質問です。 頂点数nの完全2分木の高さがlog nであることを証明しなければならないのですが、わかりません。 どうやって証明すればいいのですか? 教えてください。お願いします。
406 :
デフォルトの名無しさん :02/11/30 17:22
ファイナルファンタジータクティクス2がでるんだからいいかげん1に話はやめましょうよ。
高さがnのときちょう点数が2^nであることをいう.
>405 > 頂点数nの完全2分木の高さがlog n 高さ k の完全二分木に含まれる頂点数が 2^k - 1 ってのは証明できたか? 帰納法を使うなり何なりして導け。 あとは n = 2^k - 1 とおいて k について解けば良い。
>407 高さがnのときって頂点数は2^k-1って証明できたんですが、2^kでいいんですか? >408 2^k - 1 ってのは証明できました。 でも、n = 2^k - 1 じゃなくてlog n は、n = 2^k じゃないとでないんですが。
釣りか
>409 > でも、n = 2^k - 1 じゃなくてlog n は、n = 2^k じゃないとでないんですが。 O(log n) だろ? 定数項は捨てられるやん
412 :
デフォルトの名無しさん :02/11/30 17:58
VB厨です。レベルの高い人にはついていけない人です。まぁガンガリますが。 質問 統計です。データがN個あり、データの値で累積度数分布を作ります。 一応は正規分布するもの(分布のイメージね)、とでも思って下さい。 このときのX%値を素早く求めるアルゴリズムを教えて下さい。 今は、単にソートして、例えば100個(ほんとは101個)あるとすると、 5%なら5個目を選んでます。
>411 あがとうございます。分かりました。 まだ勉強が始まったばかりなんで、また来るかもしれませんがそのときはお願いします。
>>412 その5%を密度関数に代入して出てくる値をインデックスにすればいいのでは?
415 :
デフォルトの名無しさん :02/11/30 19:04
ガンダムseedで使われているOSについて教えてくさい。
>>412 それでいいんじゃないの?
「ソートして、順位がx%になるデータの値を求める。」でOKだろ。
累積度数分布表ができれば、ソートはおわったも同然
(累積度数分布表は「値nから順位への表」とみなせるので)
だから。
>>414 実際のデータから密度関数をどうやって求める?
また、そこから求めた百分位点が、実際の標本の百分位とあってる
確率は低いと思うが。
417 :
デフォルトの名無しさん :02/11/30 19:32
>412 平均と標準偏差だけ求めて,後は標準正規分布表見てやるのかなあ.Nが大きくなきゃ別にそれでもいいと思うけど.
418 :
デフォルトの名無しさん :02/11/30 19:49
>>417 なんで
>>416 じゃだめなのさ?
度数ソートならO(N)時間で(つまり平均や標準偏差の計算と同じオーダーで)
できるんだよ?
>>416 う〜ん、それしかありませんか、やっぱし。
今作っているのが、実は一組当たり3万〜4万個のデータがあって、
その一組ごとに%値を求め、それをいっぺんに数百回やらないと
いけないんです。これが結構時間がかかるので・・・
注)416さんの仰るとおり、%値は標本値と一致しないといけません。
>>420 だあか〜ら〜。
どうせ累積度数分布表つくってるんなら、それでソートが終わったも同然でしょ
ってば。つまり、それ以上は速くなりようがないんでしょ?
まさかqsortとか使ってるんじゃないでしょうね。
>>421 なんか誤解されてしまったようですね。わかりにくい質問ですみません。
質問の意図は「X%値を求めること」であって、累積度数分布は実際に
は作ってません。「累積度数分布のX%値を求める」です。
ん?度数分布表作った方が速いの?
>>422 それなら完全ソートしなくてもよいので、
よほど変なことをしない限りO(n)で求まると思います。
>>422 まずソートについて。
累積度数分布表が作れるようなデータ(つまり、0〜100とかみたいに、
値の範囲が限られた整数になるデータ)では、累積度数分布表を作ってソート
するのがもっとも高速です。O(N)時間でソートできます。「度数ソート」
「分布数えソート」等で検索してください。
x%点について。累積度数がx%を超えるまで累積度数を計算し、その順位にある
データを見つければよいわけですが、
・度数分布…N回ループ
・累積度数…(xN/100)回ループ
・その順位のデータを見つける…(N/2)回ループ
で、まあ、何割か早くなるでしょうが、「度数ソートしてX番目」と
オーダーとしてはおんなじです。
>>424 分布数えソートがあるというのは知りませんでしたが、
昔考えたことはありました。値の範囲を決めないといけないので
汎用ルーチン化は難しいと思って、放棄。
うーむ、頭が固いのはだめですねぇ。クイックソートが一番速い
と思いこんでましたから。
結果、めちゃくちゃ速くなりました。ありがとうございました。
426 :
デフォルトの名無しさん :02/12/01 15:09
僕も分布ソート知りませんでした。 ひとつ賢くなれたよありがとう!
427 :
デフォルトの名無しさん :02/12/01 15:14
分布ソートってなんですか?
>>427 ごめん 分布数えソート のタイプミスです。
vectorとlistを比べたときシーケンシャルアクセスもランダムアクセスもvectorの方が早いですよね? ただ挿入とか削除が遅いと。でもプログラム中ってアクセスのほうが多いから 時々挿入とか削除が起こるくらいならvectorの方がいいのでしょうか?
そうだね。
>429 > でもプログラム中ってアクセスのほうが多いから プログラムによる。 あと list は node 単位でメモリを確保・解放するのに対して、vector は 一括してメモリを処理するから、iterator を長時間に渡って保持してお きたい場合には list の方が良い。
433 :
デフォルトの名無しさん :02/12/02 13:08
| 2のべき乗じゃないんですけどフーリエ変換できますか? \____ ________________/ /||ミ V _/ ::::||_____ [ / . :::::::||____ ] |:::::::::::::::|| || |:::::::::::::::||│ / || |:::::::::::::::|| ̄\ ガチャッ |:::::::::::::::||゚ ∀゚)─ || |:::::::::::::::||_/ || |:::::::::::::::||│ \ || |::::::: C=||∧ ∧∩ || |:::::::::::::::|| ゚∀゚)/. || |:::::::::::::::||∧ ∧∩ || |:::::::::::::::|| ゚∀゚)/.� || |:::::::::::::::|| 〈. � || |:::::::::::::::||,,/\」. � || [\ . :::::::|| ̄ ̄ ̄ ̄ ]  ̄\ ::::|| ̄ ̄ ̄ ̄ ̄ \||
>>433 FFTなら、2のべき乗になるようにダミーのデータを足せ。
436 :
デフォルトの名無しさん :02/12/02 15:04
学習アルゴリズムって何ですか?
437 :
デフォルトの名無しさん :02/12/02 18:43
等高線図(平面)を書くアルゴリズムを教えて下さい。 座標はx、yを任意に与えられるものとします。格子状とは限りません。 (格子状ですらわからないアフォですので、格子状でもいいですが)
>>437 x, yが任意に与えられるだけだったら等高線なんか描けないが。
それともその等高線は同一高度に限られてて画面に一本だけか?
>>438 失礼。測点のx、y座標というべきでしたかね。当然、その位置の
高度(z座標)は与えられます。
440 :
デフォルトの名無しさん :02/12/02 20:07
>>434 ダミーのデータを足すってことは、ある画像に対して例えば200*200Pixelならば
縦横56ずつ、何かの画像をプラスして256*256にするって事ですか?
そのとき足すデータはどういうものが良いのですか?
>>437 手順1、 与えられた座標点間を補間した関数 F(x,y) を求める
補間は色々。フーリエ変換とかスプラインとか
手順2、F(x,y)-C=0 を解く
数式上解けないならニュートン法を使う
>>441 あかん、素人にはようわからん。それなりに難しいのかなぁ、やぱし。
(フーリエ変換とかスプラインとか、知ってはおるが結びつかん)
本とかURLとか紹介して下さる人いないですか?
できれば、その逆に等高線図から(スキャンして)任意のX,Y点の高度とかも
求められたらなぁ、などとアフォが壮大な夢を見ているのだが。
等高線。 まずグリッド生成。これは三角格子が楽だと思う。 なるべく正三角形に近い三角形になるように、点を結んでいく。 次に、等高線をどの高度についてどれくらいの間隔で引くか決める。 すべての三角形の辺について、等高線が辺と交わる(辺の両端が、 片方は等高線より高く、他方は低い)なら、直線補間で交点を決める。 等高線は、 ・三角形の1つの頂点だけを通る。 ・三角形の1辺から入り、別の辺から出る。 ・三角形の頂点から入り、対辺から出る。 のいずれか。 こうしてできた等高線の点の連なりを結んでいく。 その時にスプライン補間などを使ってなめらかな曲線にする。
仕事なら、 等高線書いてくれるソフト使った方が早いと思うなー Mathematicaとか、gnuplotとか。
>>443 サンクス。
で、グリッドに測点を持ってこいってことですか?
・・・・とまれ、なんか分かりそうでわからんような、難しそうですな、なかなか。
>>444 てか、ああいうのがどうやっているのかを知りたいんでね。多くのソフトが
コンター図作れているわけで、何かセオリーみたいなのがあるのかなぁ、
と思った次第。ナントカ法によるコンター図とか。
>>440 200点なら まず素因数分解してみろ
200 = 2^3*5^2
な? FFTが使えるだろ?
>>442 幾何的に等高線を生成するのはかなり面倒くさい。
任意展の高度を求めるのは近傍の測点から補完して高度を求めればよい。ので簡単だ。
等高線図にしても描くだけなら画面上の点すべてについて高度を求めて等高線の高度なら点を打てばよい。
>>447 ( ゚д゚)ポカーンってな感じでした。アフォですのですみません。せっかくご紹介
いただいたのでそのアドレスはお気に入りに入れときます。
>>448 >等高線図にしても描くだけなら画面上の点すべてについて高度を求めて等高線の高度なら点を打てばよい。
無茶いわないで下さい。実は測点の高度というのは、実際には「高度」ではなく
計算値(これが結構時間がかかるのです)なのです。従って、それではほぼ永遠
に終わりません。手で書いた方が速い(w
> >等高線図にしても描くだけなら画面上の点すべてについて高度を求めて等高線の高度なら点を打てばよい。 > > 無茶いわないで下さい。実は測点の高度というのは、実際には「高度」ではなく > 計算値(これが結構時間がかかるのです)なのです。従って、それではほぼ永遠 > に終わりません。手で書いた方が速い(w 等高線ってもしかして地形じゃなくてシミュレーションかなんかの可視化なのか? そんな前提はしとらん。 本当の高度を求めるのは適当に決めた測点だけにして、その他の点は測点の値から補完すれ。
>>443 さんがマジレスしてるので
正方格子 つまり等間隔なら簡単
a--b 今 高さ h の 等高線を描きたいとしたら
| |
c--d
1、a〜b a〜c b〜d c〜d間に h が入るかどうか
2、入るなら a=10 b=30 h=20 としたら a〜b間の(20-10)/(30-10)の比率の位置に点を打つ
3、同じように a〜c b〜d c〜d間 でも行う 時計回りに見る事にするといい
4、この点を結ぶ線を登録(始点終点) 最大2本の線が引ける
5、登録した線を結ぶ (前にやった時はB木に登録し検索して繋ぎながら処理した)
まあでも、今のCPUパワーなら まともに
>>441 をやった方が簡単かもね
等高線は三角形で平面を埋め尽くせれば後は簡単なのだと思う。 問題はどの点同士をつないで三角形を作るか、なんだろうな。
手順はボロノイ図(2番目の例で蜂の巣になってる方)を作って『ボロノイ点』を求め、 その後、ドロネー三角形を作ってるのか。 2ステップ踏まなきゃ三角形で埋め尽くした図は作れないんだな。 ボロノイ図(蜂の巣の方)の作り方はこんな感じかな。 1)点Aのまわりの蜂の巣を作るには for i=1 to n-1 for j=i+1 to n 点Aと点iとで作る垂直二等分線と、 点Aと点jとで作る垂直二等分線の交点をもとめる。 これがボロノイ点の候補になる。 これがボロノイ点かどうかをチェックする−−− すべての点と点Aとで作った垂直二等分線よりも外側にあったらアウツ! このチェックにパスしたらこの点をボロノイ点として登録する。 登録する際にはどの3つの点で作ったかを記録しておく。 (この場合はA, i, j。) −−− next next これで点Aのまわりのボロノイ点は求まる。 2) この要領で総ての点に対してボロノイ点を求めていくが、どの3つの点で作ったか(A, i, jとか)の情報をもとに 重複を避けながら登録していく。
>>447 のページを見ると、ボロノイ点のまわりの母点(測定点)を結べば
ドロネー三角形の図になるそうだが、
幸い、上のルーチン中では使用した3つの点の情報を既に記録してある。
だから三角形を作るには、この3点を使えば良いわけだ。
等高線は各ボロノイ点ごとに(それの作る三角形ごとに)処理していけばよさそうだね。
> 等高線は三角形で平面を埋め尽くせれば後は簡単なのだと思う。 > 問題はどの点同士をつないで三角形を作るか、なんだろうな。 それをメッシュ生成と呼ぶ。 なかなか難しい問題で、まだいろいろと研究されている。
最終的には3重ループになって重複チェックはいらなくなるね。 三角形を作る段で3点の情報(A, i, jとか)は必要になるんだが。 別な話だが、中学生の頃、気象図(等圧線)を作る宿題が全然できなかった。 (手順なんかは一切教わらず地図と各点での気圧のデータを渡されただけ) 出来た人(他のクラス)のを見た時は「なんだ、こんなの簡単じゃん」とか思ったんだが 実際やり始めたらどこから手をつけていいかさっぱり分からず 何本か線が引けただけで、どーにもならなかったな。
地球儀のような球面状だともう訳ワカメ
458 :
デフォルトの名無しさん :02/12/04 10:14
| 今からここでFFTしたいんですけどいいですか? \____ ________________/ /||ミ V _/ ::::||_____ [ / . :::::::||____ ] |:::::::::::::::|| || |:::::::::::::::||│ / || |:::::::::::::::|| ̄\ ガチャッ |:::::::::::::::||゚ ∀゚)─ || |:::::::::::::::||_/ || |:::::::::::::::||│ \ || |::::::: C=||∧ ∧∩ || |:::::::::::::::|| ゚∀゚)/. || |:::::::::::::::||∧ ∧∩ || |:::::::::::::::|| ゚∀゚)/.� || |:::::::::::::::|| 〈. � || |:::::::::::::::||,,/\」. � || [\ . :::::::|| ̄ ̄ ̄ ̄ ]  ̄\ ::::|| ̄ ̄ ̄ ̄ ̄ \||
>>459 あ、なるほど、これが
>>447 のページで言われている
『母点を一つずつ付け加えていく逐次添加法(incremental insertion method)』
になるわけですか。
>>453 のやり方だとnの4乗のオーダーの計算時間がかかりそうですから
こっちの方が全然速そうですね。
===
>>459 のページの内容 ===
アルゴリズムの概要は
既に存在する三角メッシュに点を1つずつ加えてメッシュを更新していく。
処理の最初には全ての点を内包する任意のスーパートライアングルを1つ作成する。
これに1点ずつ母点を加えていってメッシュを更新し、処理が終わったら
スーパートライアングル自身と、それと辺を共有する三角形を削除する。
点を付け加えていくプロセスは
Figure 2a.の様に、メッシュと新しい母点があった場合、
・新しい母点を内包する外接円を持つ三角形を全て選びだす。(Figure 2b.)
・それらの三角形をつなぎ合わせると母点を内包する多角形ができる。
・多角形内の三角形を削除し、多角形の辺と母点を結んで新しい三角形を作る。(Figure 2c.)
461 :
デフォルトの名無しさん :02/12/07 13:55
1bit/pixelのフォントイメージを、1byte/pixelのVRAMに 展開するのに速いアルゴリズムってあります? 今は if (font & 0x80) *(vram + 0) = 色; if (font & 0x40) *(vram + 1) = 色; if (font & 0x20) *(vram + 2) = 色; if (font & 0x10) *(vram + 3) = 色; if (font & 0x08) *(vram + 4) = 色; if (font & 0x04) *(vram + 5) = 色; if (font & 0x02) *(vram + 6) = 色; if (font & 0x01) *(vram + 7) = 色; ってのをフォントの幅/8*高さ分やってるんだけど べたすぎて、他にいい方法がないものかと
落下の計算式きぼん
vy += ay; y += vy;
ay = m*g - y*u; vy += ay; y += vy;
F = ma
スレ違いだったら申し訳ありません。ここが一番近しいと思ったもので RSA暗号をCで作りたいのですが、150桁くらの素数が必要になります 10,000,000くらいまでの素数表ならネットに転がっていたのですが、 到底安全と思える桁数ではありません。 何か大きめな素数を手に入れる方法はありませんでしょうか
468 :
デフォルトの名無しさん :02/12/10 16:13
STLのrotateを実現する最適アルゴリズムをお教えくださいm(゚▽゚)m
469 :
デフォルトの名無しさん :02/12/10 17:35
2chはバカだらけなので、その質問には答えられません
こいつら…知識なさ過ぎ!!(ププッ
471 :
デフォルトの名無しさん :02/12/10 18:27
「Aアルゴリズム or A*アルゴリズムを使って8クイーンを解け」 っていわれたのだけれど。そんなことできるの?
へぇ。やっぱりね。
>471 A* って基本的には「全探索」のアルゴリズムだから、できるんじゃない。
アルゴリズムの特許って、どうやって検証するの? 形式的な検証方法があるのかな? フリーソフト/オープンソースでも、ネットワークでプログラムを ばら撒いただけで特許権侵害になるんでしょ? 果てしない禅問答に巻き込まれる様な気がする…。
匿名で公開する。完璧。
>>474 特許権の及ばない国で公開する。
時間設定が間違っているサーバで公開する。
477 :
デフォルトの名無しさん :02/12/12 21:43
任意のサイズ、任意個数の長方形があって、この長方形の すべてが収まるような長方形の最小サイズを求めたいのです。 調べてみたところこれはNP完全問題で、局所最適解を求める しかないようなのですが、なにかいいアルゴリズムをご存じのかた いらっしゃらないでしょうか?
478 :
デフォルトの名無しさん :02/12/12 22:25
プログラミングのレポートでアルゴリズムと考え方を書くのですがこの2つの違いが分かりません。 どうか教えて下さい。
>477 良いアルゴリズムといっても評価の基準は様々だけど、何を重視してるの?
>>477 もろにナップサック問題だね。厳密解を求める良いアルゴリズムは無い。
確率的アルゴリズムや、近似解を求める発見的手法ならあるかも。
>>479 計算論で「良いアルゴリズム」と言ったらクラスPに属するアルゴリズムを言う。
>479 ご回答ありがとうございます。 速度重視で探索したいと考えています。 それほど厳密な解は必要ないんです。 >480 ご回答ありがとうございます。 調査したんですが、どうも近似解を求める 方法はみつかりませんでした。 確率的アルゴリズムというのはGAとかの ことでしょうか?
>480 > 計算論で「良いアルゴリズム」と言ったらクラスPに属するアルゴリズムを言う。 近似解を求めるアルゴリズムにしても基準が色々あるだろ、という話だと思うが。 最適解の定数倍オーダーの答えを出すが計算量 O(n^3) のアルゴリズムと、 最適解の二乗のオーダーの答えを出すが計算量 O(n^2) のアルゴリズムが ある場合、どちらが良いかは用途による。
>>482 質問者は誤解して使っているのかも知れんが「良いアルゴリズム」というのは
定義ずみの用語であり、その定義は「多項式オーダー」ということ。
>>481 GAは確かに近似アルゴリズムとして動作するが、
うまく動くようにプログラムする技術が確立していない。
問題の種類によって異なるが、GAのほかに、
シミュレーティッドアニーリングとか、シミュレーティッドエボリューション、
などを検証するとよろし。
関数の極小探査をしたいのですが、 どんな物がありますか? 名前で検索しようと思ったのですが、 黄金分割法しか知らないのでできませんでした。 よかったら、極小探査アルゴリズムの名前を教えてください。
関数といっても1次元なのか多次元なのか知らないけど。 とりあえず「最小値問題」 でググレば?
487 :
デフォルトの名無しさん :02/12/25 16:11
n個のブツをm(<n)個のグループにわける問題をGA(遺伝的アルゴリズム)で 解く時に、どう言った遺伝子にコーディングすればいいか悩んでます。 例えば話を簡単にするために、ABCDの4グループに分類する場合、n個の 配列を遺伝子として表現すると、同じグループ分けのことなる遺伝子表現 が出来てしまいます。これは、あまり収束が良くなさそうなのでアイディア なんかないですか? 例)同じグループ分けなのに異なる遺伝子になってしまう例 AABBBADDCCABBC BBCCCBAADDBCCD
最高のalgorithmを目指すと数学が必要になってきますか?
489 :
デフォルトの名無しさん :02/12/25 16:44
除算の基本アルゴリズムはどうなりますか?
>>487 こんな感じで遺伝子を変換してはどうでしょう。
'言語はVBです
'グループは1〜mの整数で表してます。
Dim g(1 To n) '遺伝子
Dim t(1 To m) '変換テーブル
j = 1
For i = 1 To n
If (t(g(i)) = 0) Then
t(g(i)) = j
j = j + 1
End If
g(i) = t(g(i))
Next
あんまりいい方法じゃないかも。
場合によっては、変換のコストが無視できないほど掛かりそうですし。
>>490 こんな事すると、よけい収束が遅くなりますね。
このレスは忘れてください。
492 :
デフォルトの名無しさん :02/12/26 21:13
今VBで画像処理プログラムを作ってるんですが処理速度がすごい遅いです 例を挙げると、たかだか512*512pixelの画像の反転ですら3秒ほどかかります Photoshopなら1秒もかからないのに、、 マシンは2ギガのペン4だからスペックが悪いわけじゃないし アルゴリズムに問題があるのだと思います、でも やってることは x=読み込んだ画像の横サイズ y=読み込んだ画像の縦サイズ ループ0〜y ループ0〜x 一画素を取得するメソッドで得た値をにcolor代入 colorをシフトビットとAND演算でRed,Green,Blueの各値を得る 255-Red,255-Green,255-Blueで得た値をそれぞれ新しいRBG値とする 一画素を描画するメソッドで、新しいRGB値をセットする ループxの終わり ループyの終わり ってやってるんですけど 私のアルゴリズムが悪いのでしょうか? それともVBだから遅いの?
>492 アルゴリズムというか、使ってる API が悪いんだと思うが。 VB は知らんが、Win32 API だとピクセル単位で画像データを処理するのは SetPixel(), GetPixel() という API だが、これは GDI 汎用に作られてるために ムチャクチャ遅い。 画像処理をやる場合には、ふつうは CreateDIBSection + BitBlt を使う。あと 画像反転程度なら、自前でコード組むまでもなく BitBlt の引数で指定できる ぞ。 (続きは Win32 関係のスレに行った方が、詳しい人間が見つかると思われ)
494 :
デフォルトの名無しさん :02/12/27 04:11
>>493 ありがとう
やっぱアルゴリズムどうこうではないようですね
そっちのスレで聞いてみます
論理演算、ビットシフト等を使ったアルゴリズムで有用なものはありませんか? あったらぜひ紹介して下さい。
>>495 アルゴリズムは手段であり、目的があってこそ発明され利用されるものだろ?
何を目的にするのかわからないのに、アルゴリズムを紹介できるか。
有効じゃなくて有名なって言ってくれれば ○ABS ○ビット単位ストア ○条件付交換 ○2のベキ乗かどうか
○奇偶判定 ○除算を使わずに剰余を求める
○ABS ○条件付交換 ○奇偶判定 ○除算を使わずに剰余を求める 横レスだがどんな処理してるの? 奇遇判定は最下位ビットを見てるのかなとおもったんだけど
501 :
デフォルトの名無しさん :03/01/02 19:24
変数の中身を入れ替えるswapアルゴリズムに関してなんですが tmp変数を使わず実装することはできますか?
502 :
デフォルトの名無しさん :03/01/02 19:26
余ってるレジスタ使えば可
#include <stdio.h> main(){ int a=2,b=5; printf("a=%d b=%d\n",a,b); a^=b; b^=a; a^=b; printf("a=%d b=%d\n",a,b); return 0; }
>>501 技術評論社「C言語による最新アルゴリズム事典」買え。
過去には目的があったからアルゴリズムは存在している。
歴史と同じ。
>>496 は歴史を学ぶことは不可能だと言うのか?
目的馬鹿は死んでいいよ。 吐き気がする。
スレ違いかもしれませんが、お願いします. とあるボードをRT-Linuxで利用したいのですが、付属のドライバでうまく 使えなかったので、ボードに直接アクセスして利用しようと考えています。 幸い、ドライバのソースを手に入れることができたので、何とか理解して必要な部分を 利用ようとしているんですが、ソースの中のioremap( )が良くわかりません。 引数が2つ在るんですが、それぞれ何と何を表しているのかご存知の方折られませんか?
512 :
デフォルトの名無しさん :03/01/04 23:39
>>511 うちんところでは、iomapのベースアドレスと、サイズのように思えるが。
>>512 レスありがとうございます。
ioremap()の引き数が意味するのは、ベースアドレスからサイズ分のメモリを確保
するという意味なのでしょうか?
man ioremap
manで出てこないんですよ・・・
manのデータなかったらでてけえへんわな
うちでは、 /usr/src/linux/Documentation/IO-mapping.txt に説明があった。
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
IPとってるのかぁ・・・ オマンコなんて書いたら捕まっちゃうかな(;´Д`)コワヒコワヒ
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。 これで完全終了ってことか。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
そうだね。
Abone
>>47 日本語の分からない人だね。内容証明があったからといって
名誉毀損があったとは限らないって言ってるの。
その上で裁判所は訴状送達の翌日としたのは、その時点で
名誉毀損を「認識した」ではなくて、「認識しえた」からなの。
わかる?この違い。
405 名前:心得をよく読みましょう 投稿日:02/12/31 11:04 ID:ADTGAx9x はぁぁぁ。あと、1週間以内で生理・・・。 何事にもむかついてたまらないっ! 生理前って、ブルーになったり、いらいらしたり。。。 ほんと勘弁してって感じ。
君たちの年収を教えたまえ。
1年を通じて勤務した給与所得者
男性2,834万人、女性1,675万人
男
100万円以下 68万6000人 2.4%
100万円超 200万円以下 117万8000人 4.1%
200万円超 300万円以下 231万1000人 8.1%
300万円超 400万円以下 450万4000人 15.1%
400万円超 500万円以下 517万6000人 18.1%
500万円超 600万円以下 425万3000人 14.9%
600万円超 700万円以下 308万8000人 10.8%
700万円超 800万円以下 229万1000人 9.0%
800万円超 900万円以下 156万7000人 5.5%
900万円超1, 000万円以下 104万9000人 3.7%
1,000万円超 1,500万円以下 198万3000人 6.9%
1,500万円超 2,000万円以下 37万6000人 1.3%
2,000万円超 14万1000人 0.5%
平成13年度 1年を通じて勤務した給与所得者 給与階級別分布 国税庁
http://www.nta.go.jp/category/toukei/tokei/menu/minkan/h13/04.htm
2chには2つの価値が今まであった、それは「匿名性」と「人数の多さ」 そして今そのうちの1つが無くなった、まあ「人数の多さ」だけでも人は集まるんだろうが しかしこうなると「匿名性」と「人数の多さ」が合体して出来る"祭り"という物が、無くなっ ていくんじゃないかなあ?祭り厨房としてはとてもそれが心配なんだが、、、
腐れの良い物件選びの講座開いてください
俺は火星人設立宇宙サーバーをとうしているので、 毛利宇宙飛行士でなければ追跡は不可能です。
肉体改造しろよ。ひろゆき。
87さんがんばってください。 応援だけはします!
試して駄目だったのならすみません。 でも、普通そんな風には思えませんが。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
どうぞ暴露してください
2chという不定形の巨大な組織に晒された個人も大変なわけです。
閑話休題; Aさんが、ある「特定の結果」を得られるアルゴリズムを作りました。 のちにBさんが「同一の結果」を得られる別のアルゴリズムを作りました。 そしてAさんが「Bはパクリだ訴えちゃる」と言い出した。さて筋は通る? 通例では「筋は通らん」「Aにそこまで縛る権利はない」の筈だが…。
( ´db`)ノ< 実況にないと思ったら地味にスレタイに納得なのれす。
20030107aになってる板は全て? 半角とと芸能板もなってるけど。。
ネオむぎを超えるわけない 犯人が17歳以下なら話は別だが
つーかトリップもキャップもついてないし。
600,000,002だった・・・(´・ω・`)
new clieに逝きそうなんですが・・・ でも、大きいのと、高そうなのが・・・ちょっと・・・ でも・・・ カミサンだまし作戦開始・・・
メルマガ転載きぼん
PTAって尽く冗談とか悪ふざけが存在しない世界で生きてるよな ある意味なんかスゲェと思う っつーか、ヴァカすぎる。 今まで2ちゃんで書かれた意味ない予告にイチイチ社会が振り回されて たらどうなるっていうんだか。
DHCと
fusianasan
対応はともかく、確実に通知したという事実は残るよ。 メールや電話だと「届いていない」「読めなかった」「回線の調子が悪くて聞こえなかった」で抜けられるからね。
3つのしもべみたいなもんか。
(^^)
は 低 学 歴 4 n d !!
(^^)
中央値は、x[],y[]のそれぞれ両端から比較していかないと取れないって・・・
558 :
デフォルトの名無しさん :03/01/19 22:56
559 :
デフォルトの名無しさん :03/01/20 00:08
4ndハリーポッターの本を4ndぁんだろ
560 :
デフォルトの名無しさん :03/01/20 23:48
教えて君ですいません、非常に基本的な操作に関してなんですが、 自分の稚拙な頭じゃ思いつかないので質問いたします。 長さ N×M の配列 A があり、これが N×M の行列を表しているとします つまり、A[i*M + j] が行列 A の(i,j)成分であると考えます。 (i=0,1,…,N-1, j=0,1,…,M-1 とします) この行列を "動的なメモリの確保なしに" (つまりN,Mに依存する余分な記憶領域を使わず) 転置して、M×N行列にしたいのです。 (もちろんN != M の場合に関してです。) すなわち、Aの(i,j)成分 A(i,j) = A[i*N + j] を、転置行列A' (Aと同じ配列です)の (j,i)成分 A'(j,i) = A[j*M + i] としたいのです。 O(NM)の計算量でこのような操作は可能でしょうか?
スワップ使えないの?
即レスサンクスです。 実装上の問題というよりも、純粋に数学的興味が重きを占めてます。 なんかうまい方法がないですかな… クイズみたいで気になってねれないよう
>>560 i'=j;
j'=i;
じゃ駄目なの?
A(i,j) <=> A(j,i)として転置ができるのはM=Nの正方行列のときだけです。 例えば 4×8の行列の (2,6)成分は 2*8 + 6 = 22 だから A[22]ですよね これを 8×4行列の (6,2)成分にするのだから 6*4 + 2 = 26 より A[26] に移動するわけです。 でも、もとの A[26] を A[22] と交換するのではだめなんです。 26 = 3 * 8 + 2 より A[26] = A(3,2) なわけですから、 これは転置後 A'(2,3) = A[2*4+3]=A[11]にいれなきゃなりません で、A[11] = A[1*8+3] = A(1,8)だから A'(8,1) = A[8*4+1] = A[33] で A[33] = …以下続く…
>>564 俺が言ってるのは、そういう事じゃなくて
わざわざ、メモリ上の値を入れ替えなくても
アクセス方法を入れ替えたんじゃ駄目なのって事
例えば4×8の行列の(2,6)成分は
2*8 + 6 = 22 だから A[22]
これを8×4の行列の(6,2)成分として読むには縦と横を入れ替えて
6 + 2*8 = 22 だから A[22] /* 当たり前だけど同じでしょ */
566 :
デフォルトの名無しさん :03/01/21 12:08
誤解すまんです。 各行を(横方向に)走査して変換するルーチンがありまして、 それを各列に対して縦方向にも適用したいのです。 もちろんルーチン内でのアクセス方法をおっしゃる とおりに変えれば良いんですけど、それはそれで結構 面倒なんで(連続する2つの実数を一つの複素数の実部 と虚部として扱っている部分があり、複素演算ライブ ラリでは当然実部と虚部のアドレスは連続しているもの と仮定しているので、単純に添字を変えていくだけでは うまくいかない) 最初は長さがNのテンポラリーな配列を動的に確保して 各々の行にたいして 一時配列にコピー → ルーチン適用 → もと配列に戻す としていたんですけど、malloc するのはなんだかなって 思ったんで、なんかスマートな方法ないかなと。 きっかけはそれで、今や数学的興味のみです。 上げておきます、知ってるかたはヒントくだされ。
まちがえた、13行目、各々の"列"にたいして の誤りです。 各行はルーチンに直接わたせます。 失礼しました。
もろにそれですね、ありがとうございます。
(^^)
sage
500Byteが6000個でしょ。全部メモリに入れちまえば。
573 :
空間回転移動 :03/01/31 22:27
空間座標変換について 例えばある点(X,Y,Z)がありますこれを空間上でRラジアン回転移動させたい場合 Z軸回転 X =X * Cos(R) + Y * -Sin(R) ; Y =X * Sin(R) + Y * Cos(R) ; Z =Z ; X軸回転 X =X ; Y =Y * Cos(X) - Z * Sin(R) ; Z =Y * Sin(X) + Z * Cos(R) ; Y軸回転 X =X * Cos(R) + Z * Sin(R) ; Y =Y ; Z =X * -Sin(R) + Z * Cos(R) ; というところまで何とか分かりました。 次に(X,Y,Z)を原点を中心として(X,Y,Z)の通る球の大円を描くように回転させたいと思っているのですが学力不足でできません。どなたか分かる方教えて下さい;; 大円を描く回転の場合もう一つラジアン値を設定しないといけませんが…
574 :
デフォルトの名無しさん :03/02/01 19:19
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・)< 赤黒木ってなによ? \_/⊂ ⊂_)_ \____________ / ̄ ̄ ̄ ̄ ̄ ̄ ̄/| l ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| .| | |/
バイナリ−サーチ?
576 :
デフォルトの名無しさん :03/02/02 11:54
>>573 日本語がおかしいのも学力不足だからですか?
がんばって解読すると「原点中心で点(X,Y,Z)を通る大円」を書きたいって
言っているように見えるんだけど、その条件では一意にならないし...
577 :
デフォルトの名無しさん :03/02/02 12:58
巡回セールスマン問題みたいに通る辺の値を最小(最大)にするような経路 で、かつ、通る辺の数をなるべく小さくしたいのですが、どんなアルゴリズムを 使えばいいですか?
深さ探索?
>>577 それだけじゃ仕様が曖昧だな。
・開始点と終了点は違っているのか、同じなのか
・すべての頂点を通らなければならないのか、最短パス上の頂点のみでよいのか
ダイクストラのアルゴリズムは検討した?
それで解けない問題なら、サラリーマン問題と同じくNP問題用アルゴリズムだな。
ごめんなさい 始点と終点が違うし全頂点を通るわけでもないのでTSPとは別物でした グラフのある点からある点への経路を探したいのですが、 通る辺の値の和を最小にすることと通る辺の数をなるべく少なくするという 2つの目的があって、ダイクストラのアルゴリズムを応用できないかとも思う のですが、いまいち思いつきません。 「なるべく」というのもはっきりしないので、質問の仕方が悪いかもしれませんが この事例ににた問題など紹介していただければありがたいです。
トーナメント表でも作る感覚で良いんじゃ無い?
>>580 二つの条件を同時に満たす解が、必ずしも見つからないことは承知してる?
普通は、辺の重みを最小にする「最短経路問題」を使うわけだが。
通過する辺(頂点)の数も同時に最小にするのは、
辺の重みとどちらを重視するかの重み付けが、別に必要となる。
たとえば、距離が1でも重みが100の経路と、
距離が100で各辺の重みが1の経路がある場合(それら二つしかない場合)、
どちらを採用するの?
>>584 538>なにやら、連日メルマガだしてるひろゆきです。
おまえはひろゆきに何を感謝しているんだ?
>>2 /9
2chがあることに感謝してるんじゃ!
と明後日の方向にレス
587 :
アルゴ初心者 :03/02/07 23:33
すいません、プログラムの考え方で詰まっている者です。 課題は下の画像ファイルを模したものから直線、斜線を切り出し、始まりの点と 終わりの点の座標をとってくるプログラムです。0が背景で、1が線の部分です。 どういうふうにプログラムを組めばいいのかわからず困っているのでお願いします… 000000000000000000000000000000000000000000000000 000000000000000000100000000000000010000000000000 000000000000000001000000000000000010000000000000 000000000000000010000000000010000010000000000000 000000000000000100000100000100000010000000000000 000000000000001000000010001000000010000000000000 000000000000010000000010010000000010000000000000 000000000000100000000001100000000010000000000000 000000000001000000000001000000000010000000000000 000000000010000000000010100000000010000000000000 000000000100000000000100010000000010000000000000 000000001000000000001000010000000010000000000000 000000010000000000010000001000000010000000000000 000000000000000000000000000000000010000000000000 000000000000000000000000000000000010000000000000 000000000111111111111111111111111111111111110000 000000000000000000000000000000000010000000000000 000000000000000000000000000000000000000000000000
細線化もしくはThinningでググれ
C++のソースで/**/ と // が入ってるのをコメント部分だけ削除するのってどうやるんでしょう? コメントが入り組んでるとわかりにくいんですけど…
591 :
デフォルトの名無しさん :03/02/08 06:17
オセロや将棋などの二人零和有限確定完全情報ゲームではなく 運的要素が強い麻雀などを確率的に判断して、最強のアルゴリズムで 有名な研究などありますか?
>>591 TDギャモンとかは?
でもあれは普通に評価関数使って打ってるだけだったかな。
593 :
デフォルトの名無しさん :03/02/08 06:40
おかまの質問にも答えてよ
誤爆
595 :
アルゴ初心者 :03/02/08 10:32
細線化でわかりやすいサイトが見つからない… すいませんが、理解しやすいサイトがあったら教えてください
>595 とりあえず縦線横線だけ限定で考えれば? それならできるっしょ 斜めは後で追加
おもしろそうな問題だな 自分で解けよ マインスイーパーみたいな感じでできるじゃん 周辺の8方向をチェックする
598 :
組込もしまっせ :03/02/08 11:03
自分ならどうするかな 水平垂直なら596さんの通り、同じX座標に連続して点がある って条件で取れる それと同じで45度の線分も x+a,y+b (a,bは±1) の4方向に連続してる条件で取れる ってやると、45度以外の斜めの線が水平垂直線と斜め線にバラバラに分解されてしまう だから、最後に、分解した線分の始点、終点を接続してみて、直線上に並ぶなら接続という感じの処理で接続してゆく
微妙な角度だと1つ飛びの可能性もあるから 将棋の桂馬飛びみたいにパターンが連続してるかチェックする
そういえば将棋のスレあったな
>>590 ぅぅ。cppのソースを読めってことでつか?めんどい。
がんばりまつ。
602 :
アルゴ初心者 :03/02/09 01:32
みんな凄すぎてよくわからない… すいません、何か簡単でいいのでソースとかありますか?
603 :
デフォルトの名無しさん :03/02/09 02:40
何かと言われてもねぇ
604 :
アルゴ初心者 :03/02/09 02:49
C言語が全然わからないものでして... 全ての縦線と横線の始点と終点の座標を求めるサンプルプログラムをお願いします。 斜め線は…どうしよう つД;)
605 :
デフォルトの名無しさん :03/02/09 06:55
麻雀の最強アルゴリズムおしえて
606 :
デフォルトの名無しさん :03/02/09 06:56
2ちゃんねらよりかは、はるかにマシさ。
直線の検出といえばハフ変換
609 :
デフォルトの名無しさん :03/02/10 00:35
ハフ変換で始点や終点、また交点なんて検出できたっけ??
■□□□□□□□□□□□□□ □□□□□□□□□□□□□■ 左と右の■を結ぶ直線
611 :
デフォルトの名無しさん :03/02/12 05:06
線の切り出しで相談した者です。 チェーンコードの考え方を使って縦横、斜めの線を切り出そうというプログラムをつくりました。 つまり、線の始点を見つけたら8連結内を時計周りに見て、他のドットと繋がっている部分を探して、そこに次々移動していくというものです (ちょっとわかりにくい説明だな…) 縦横はいいんだけど、斜めがちょっとまだ不十分… 例えば ****** ****** ****** ****** だと斜め線でなく横線4つと認識してしまう… どうしよう…
612 :
組込もしまっせ :03/02/12 06:34
>>611 基本的に区別つかないから 短い線分同士が接続してるかどうかチェックしてゆく作業は必要じゃないかな
長い線分から順に検索して、2つの線分A,Bの端点同士が一致していたら
1本の線に出来るかどうかチェックしていったら?
□□□ □□□ □□□ □□□ □■■ □■□ □■□ □■□ □□□ □■□ ■□□ □□■
初めてここに書きます。 PDFを出力するプログラムを書いているのですが、円を描く所で躓いてしまいました。 PDFには円を書くというオペレータがなく、3次ベジェ曲線を書くオペレータがあります。 或る円をかいているPDFファイルをみると4つの3次ベジェ曲線で円を描いているようでした。 4つの3次ベジェのそれぞれが、円の1/4弧を描いているらしいことはわかったのですが、 制御点をどのように算出しているのかがわかりませんでした。 ご存知の方いましたらおしえてください。
615 :
組込もしまっせ :03/02/12 14:23
>>614 斜め楕円の描画 で検索すると見つかりますよ
616 :
デフォルトの名無しさん :03/02/12 14:57
ポリゴンのテクスチャデータを効率よく格納したいと思いねぇ。 ある矩形領域に、大きさがまちまちな矩形領域を、はみ出さず、かつ それぞれが重ならないようになるべくたくさん並べて置けるようにする アルゴリズムってどういったものがあるのでしょうか? データはあらかじめ配置するので探索に時間がかかってもokです。
高さ順にソートしておいて横に並べるとか。<適当
確かに高さをあわせて、横に並べればよりナップザック問題に近くなりますね。 ほぼナップザック問題のような気がします。
バラバラで扱った方が効率良かったりして
620 :
アルゴ初心者 :03/02/12 21:07
以前、ここで斜めの線分の切り出しについて質問したものです。みなさんのおかげでなんとか斜めの線を切り出すことが出来ました。 下の図を、垂直水平、そして斜めに切り出すことができました! そして各辺の始点と終点の座標を得ることができました。 000000000000000000000000000000 000000000000011000000000000000 000000000000100100000000000000 000000000001000010000000000000 000000000010000001000000000000 000000000100000000100000000000 000000001000010000010000000000 000000001000010000001000000000 000000010000011000000100000000 000000100000101000000010000000 000001000000101000000001000000 000010000001000100000000100000 000100000001000100000000010000 001111111111111111111111111000 000000000010000010000000000000 000000000010000010000000000000 000000000010000010000000000000 (2,13),(26,13) //横線 000000000100000010000000000000 (6,25),(19,25) //横線 000000000100000001000000000000 (13,1),(2,13) //左ななめ 000000001000000001000000000000 (13,8),(6,25) //左ななめ 000000001000000001000000000000 (14,1),(26,13) //右ななめ 000000001000000000100000000000 (13,7),(19,25) //右ななめ 000000010000000000100000000000 000000010000000000100000000000 000000100000000000010000000000 000000111111111111110000000000 000000000000000000000000000000
621 :
アルゴ初心者 :03/02/12 21:08
さて次のステージですが… これを2つの三角形として認識させて、それぞれの三角形の頂点の座標を得るのにまた困っています この場合だと、1つめの三角形は頂点(2,13),(26,13),(14,1)、2つめは(6,25),(19,25),(13,7)という具合に… 線と線の座標が重なる部分が1ドットずれてることがあるけど、それを許容範囲にして一つの頂点としてみなしたいと考えています どういう風に頂点をみつけていけばいいでしょうか… つД;)
>>620 せっかくだから完成したプログラム書いとけば?
>>621 普通に点と点の距離の数学的公式使ったら?
差の2乗を取って〜〜
624 :
621です :03/02/14 06:53
こんなのを作りました
http://www.geocities.co.jp/AnimeComic/7356/temp0.bmp.zip sen5-1.bmpは読み込む画像、temp0.bmp.txtは読み込んだ画像を背景を0、線を1にしてテキストファイルに書き込んだもの。
そして1.cには違うツールを使って、この画像からの線の切り出しで得られた座標をインプットしてあります。
vec(x1,y1,x2,y2)で線の始点と終点を入力させています。(x1,y1)は線の始点、(x2,y2)では線の終点という具合です。
このプログラムを実行すると、それぞれ四角形の場合の全ての頂点の座標、五角形の頂点の座標を別々に表示します。その頂点の表示のされ方も、反時計周りに辺の順番に表示されています。
線の切り出しの部分でまだバグがあるため、角数1というものが出ますが、今回は三角形以上の図形のみに着目したツールを作るつもりなので、角数1の場合はこの頂点を見つけるプログラムであらかじめ除いておこうと考えています。
これで一応頂点の座標を取るプログラムは完成としました ミンナ(・∀・)サンクス!
しかし…
625 :
デフォルトの名無しさん :03/02/14 06:59
626 :
621です :03/02/14 07:01
たびたびすいません。線の切り出しで重大なバクを発見してしまいました… まず前準備で@白黒の画像を読み込み A1ピクセルごとにRGB値を調べる B背景である黒だったら0番、白である線の部分であったら1番を割り付け、画像の大きさと同じぶんの2次元配列gazou[y][x]に格納 線の切り出しですが、原点からx軸方向に順に走査していって、線の始まりを見つけます。 始めに横線だけを抜き出し、そしてまた原点に戻ってから縦線、次にまた原点に戻り左斜め、次にまた原点に戻り右斜め、といった具合に線の種類事に切り出しを行いました。 線の切り出しの方法ですが、 (続く)
627 :
621です :03/02/14 07:02
(続き)
線の切り出しのプログラム
http://www.geocities.co.jp/AnimeComic/7356/prog.zip 横線を調べるときは、x軸(左から右へ)に1が繋がっている時はその長さを足していき、1が途切れたところを終点にします。
また、線を調べるたびに原点から走査しなおしているので、長さが5以上あった線には二度と調べた線を読み込ませないために、1の部分を2に変えたり3に変えたりしています。
次に縦線も同じでy軸方向(上から下へ)に走査していって、1が繋がっているかを調べます。あとは横線の時と同じです。
左斜めの線ですが、まず線の始まりを見つけます。そして
345
2*6 (*は現在注目している点)
107
で0番に1があるかどうか調べます。あったらそこに注目点をずらします。
もし0番になかったら1番をみます。あったらそこへ注目点をずらします。
もし0番にも1番にも無く、2番にあったら、先ほど横線や縦線で調べた時、白を表す1が変化していなかったら、その横方向に進みます。
これら以外の場合は終点とみなし、その座標を計算します。
右斜めの場合は、左斜めと反対で、まず0番を見ます。
そして7番、次に6番をみます。
しかし、この線の切り出しのプログラムでは
http://www.geocities.co.jp/AnimeComic/7356/kekka.gif 上の図のように、 左斜め→右斜め なら切り出せるけど、左斜め→左斜め と続いたら線分A-B、B-Cと読み込まれなきゃならないはずなのに、A-Cとして認識されてしまいます。
でも、もうこれ以上どうしたらいいのかわからなくて途方にくれてます…
(長文スマソ…)
dx,dyを保持しておく。
630 :
デフォルトの名無しさん :03/02/14 16:06
"C言語による最新アルゴリズム事典"ってどうですか? これより完璧なアルゴリズムに関する本ありますか? あったら教えてください。
>>630 奥村氏の本だよね。安いし持っていても悪くないと思われ。
解説がやや少ないのでコードで理解できる人がサワリを学ぶのに向いてる
632 :
デフォルトの名無しさん :03/02/14 16:33
アルゴリズムC++なんてのはどうですか?
この621のはなし とある研究室でやりそうな話な気が・・・・・・
634 :
621です :03/02/16 01:04
どうも… 先日皆さんの知恵を借りて作ったプログラムを持っていったら全否定食らってしまいました… 先生がいうにはこのやり方はタフなやり方じゃないらしいです。 先生がいうには 「例えば6つずつドットを飛ばして読んでいって、そこに線のドットがあったらその座標を保存していく。 その後、2つの点を使って線の式を求め、同じように他の2点から求めた線の交点をとっていく。 ちょっとずつ荒くみていくドットの幅を変えていったりして、何回かこれを繰り返し、似通っていた交点の座標がたくさん出てきたら、そこを図形の頂点とみなせばいい」 らしいです。 言うことはわかるんですが、これはどうやってコードにするんだろう… 画面から取れた点達から全部の線のパターンを考えて、その交点を取らなきゃだめってことでしょうか? 膨大な計算量になりそうな予感が… 実際、よくわかってないもので弱りますた…(´・ω・)
635 :
デフォルトの名無しさん :03/02/16 03:54
たぶんPerlだったと思うけど、半角カタカナの イ だけを 例外にしてループ処理するのは何をする時だったかな??
多分ネパールだと思うけれどミャンマーに国名変わったよな??
ビルマだよっ(ミャンマー)
>>634 ロバストって条件ですか・・・厄介ですね。
点列が綺麗に集まってる付近でグループ化して、グループサイズを大きくしながら幾何的な最小2乗直線を求めて
2乗誤差が敷居を割ったら止めるとか そんな処理が思いつくけど
639 :
名無し@さん :03/02/16 20:08
ちょっとゲームのアルゴリズムで分からない事があるんで 教えてください。 シミュレーションゲームを作りたいんですが、いくら頭をひねっても、 移動可能な範囲を表示する方法が思い浮かびません。 ↓こんなのです ■■■■■■■■■■■ ■■■■□■□■■■■ ■■■□□木□□■■■ ■■□□□□□□□■■ ■□□□□俺□□□□■ ■■□□□□壁壁壁■■ ■■■□□□壁■■■■ ■■■■□□□■■■■ ■■■■■□■■■■■ ■■■■■■■■■■■ どなたか、分かる方教えてもらえませんか?
>>639 座標と移動可能値をキューに積む
キューから要素を取り出す
四方を調べて、それが「値−1」より小さいなら、置き換えてキューに積む
キューが空になるまで繰り返す
>>639 お世辞にもきれいなコードとは言えんが、これでどうだ?
#include <stdio.h>
#define X 11
#define Y 10
typedef enum {DM=99,KB=-1,KI=-2,OR=-3,} Map[Y][X];
Map map = {
{DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,},{DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,},
{DM,DM,DM,DM,DM,KI,DM,DM,DM,DM,DM,},{DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,},
{DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,},{DM,DM,DM,DM,DM,DM,KB,KB,KB,DM,DM,},
{DM,DM,DM,DM,DM,DM,KB,DM,DM,DM,DM,},{DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,},
{DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,},{DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,DM,},};
void PrintMap(Map m){int x, y;for(y=0;y<Y;y++){for(x=0;x<X;x++)
switch(m[y][x]){
case KB: printf("壁"); break; case KI: printf("木"); break;
case OR: printf("俺"); break; case DM: printf("■"); break;
default: printf("□"); break;}printf("\n");}printf("\n");}
void FindRec(Map m,int x,int y,int v,int w){m[y][x]=w;
if(w++<v){
if((0<=x-1)&&(w<m[y][x-1])) FindRec(m,x-1,y,v,w);
if((x+1<X)&&(w<m[y][x+1])) FindRec(m,x+1,y,v,w);
if((0<=y-1)&&(w<m[y-1][x])) FindRec(m,x,y-1,v,w);
if((y+1<Y)&&(w<m[y+1][x])) FindRec(m,x,y+1,v,w);}}
void Find(Map m,int x,int y,int v){FindRec(m,x,y,v,0);m[y][x]=OR;}
int main(void){Find(map,5,4,4);PrintMap(map);return 0;}
せめてインデントしてよw
643 :
名無し@さん :03/02/16 22:23
>>640 あっそうか、一歩ずつ四方を調べれば、確かにできますね。
四方じゃなくて、来た道を除く3方向でもOKかな?
移動できるコマの平均がnだとすると、 3^n だけ調べなきゃ
いけないんで速度が気になりますが、一度やってみます。
>>641 わざわざコードまで書いてもらってありがとうございます。
が、実はCはただいま勉強中で、詳しくありません。ToT
Cも分からないのかよ!! なんて怒らないで下さいね。^-^;
そのうち理解できる日がくるはずなので、しっかり保存させてもらおうと
思います。
640,641さんどうも親切にありがとうございました。
>>643 そんなに大きいnを扱うのか?
たとえばLSIの設計だとn=100万以上ということもあるので、
この手法だと数日かけて計算することもあるが・・・。
>>639 はLSIでいう詳細配線問題に相当するので、その線で調べてみ。
ちなみに
>>640 の手法を「迷路法」と呼ぶ。
645 :
デフォルトの名無しさん :03/02/16 23:25
アナルリズムて何ですか
その手のアルゴリズムはゲーム系プログラミングのサイトなんかにもにあったな…… ヘクス 移動 範囲 アルゴリズム あたりでググルと吉 探索済みかつ遠回りして来たマスに辿り着いたらそのルートはそこでおしまい、 とすると余計な計算を省ける。
647 :
名無し@さん :03/02/17 00:13
>>664 大きくても10ぐらいかな〜?でも3^10だと6万近くに・・・。
ほうほう、ちゃんと名前がついてるんですね。
探索で言うと、線形探索みたいなもんですか?
>>646 >ヘクス 移動 範囲 アルゴリズム
キーワードサンクスです!
やっぱり最終的にはそういう高速化が必要ですよね。
今度は高速化のアルゴリズム考えるのが大変・・・。
好きだからいいんですが。^-^
あ、すみませんsage忘れました。鬱。
649 :
デフォルトの名無しさん :03/02/17 12:49
アルゴリズム体操〜、 始め!!
650 :
デフォルトの名無しさん :03/02/19 10:29
100以下の数値が多数あって合計で100以内に収まるよう 数値を加算してできる最小のパターンを出す っていうようなアルゴリズムを教えてください VBのサンプル紹介してくださるとなお有難いです 例えば次の16個の数があれば... 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71 次の7つの組み合わせに分ける 41+59, 47+53, 11+17+71, 13+19+67, 37+61, 23+31+43, 29
652 :
デフォルトの名無しさん :03/02/19 10:48
653 :
デフォルトの名無しさん :03/02/19 10:50
PLI GLPL Jeda せりに きりせり まいしち
655 :
デフォルトの名無しさん :03/02/20 17:55
heap ってどういうときに使えるのですか? 今ひとつ使える場面がピンとこないのですが。
>>655 hsp?ちょことっと3Dモデル表示したり、サウンドノベル作ったり、
ちょこっと画像表示させるようなプログラムには最適でしょ。
・・・・・・じゃなくてヒープか。
確かに、何に使うんだろう。データの整列をするとき、じゃ駄目か。
自分も知りたいです。
>>639 最短経路の探索だったらダイクストラのアルゴリズムかな。
この場合だったら、3*n^2くらいで収まるはず。
>>655 あるデータから上位n個を取り出したい時とか、ヒープ使うと便利かな。
>639 まさか、塗りつぶしのアルゴズムが分からない、というわけではなかろうな
661 :
デフォルトの名無しさん :03/02/22 20:04
チェーンコードのプログラムを作ってみました。 ただ、このプログラムでは考えなしに次の点を決めているので、今度はロボットが自走するように、これまでのチェーンコードのログを元に、次の進行先を決定するものを作りたいと考えています。 例えば、56565656 というログがあった時、次の注目点の周囲8点の0番目,4番目、5番目にそれぞれドットがあったら、先ほどのログを参考に、自動的に「5番のドットへ進め」という プログラムにしたいのですが…どう組みこめばいいのかわからず困っています。 すいませんがよろしくお願いします。 ↓作ってみたプログラム。かきこの関係でぎちぎちですが・・スマソ while(1){ if(xs==i && ys==j && l>10) break; switch(vec){ case 5: if(gazou[j+1][i-1]!=0){j=j+1; i=i-1; vec=4; l++; break;} case 6: if(gazou[j+1][i]!=0){j=j+1; i=i; vec=5; l++;break;} case 7: if(gazou[j+1][i+1]!=0){j=j+1; i=i+1; vec=6; l++; break;} case 0: if(gazou[j][i+1]!=0){j=j; i=i+1; vec=7; l++;break;} case 1: if(gazou[j-1][i+1]!=0){ j=j-1; i=i+1; vec=0; l++;break;} case 2: if(gazou[j-1][i]!=0){ j=j-1; i=i; vec=1; l++;break;} case 3: if(gazou[j-1][i-1]!=0){ j=j-1; i=i-1; vec=2; l++;break;} case 4: if(gazou[j][i-1]!=0){j=j; i=i-1;vec=3; l++; break;} vec=5; } gazou[j][i]=label_no;//再度読みこませない為に印付け}
662 :
デフォルトの名無しさん :03/02/25 00:12
あの。。。アルゴリズム以前の話なのですが、 WORDを返す乱数ジェネレータ(rnd)から0〜100の範囲で 偏り無く取る場合、rnd*100/65535 とやらなければ成らないのでしょうか? もっと簡潔に得る事は出来るんでしょか。 2の累乗なら&で上位ビット外すだけで良いのですが。。
664 :
デフォルトの名無しさん :03/02/25 01:07
>>663 正直、最近迄何も考えずに%使ってたんですが、
上が65535だから、 100だと35以下に偏るじゃないですか。
0.15%程ですが。
じゃあ、その0.15%は捨ててしまえばいい。 do{rnd=rand();} while( rnd > 65500 ) ; val = rnd % 100;
>>662 0〜99迄の範囲で隔たりなくではなく、0〜100で隔たりなくですよね?
WORDを返すような環境だと、除算は掛算より遅いから %より
rnd*101/65536 として (rnd*101)
>>16 とした方がいいでしょう。
アセンブラで int MulShr16(int n , int m); みたいなのを作っておくといい。
>664 0.15%の偏りを気にする以前にrnd自体の乱数が偏ってたりして。
668 :
デフォルトの名無しさん :03/02/26 20:19
rnd自体も適当なnずつ何度も掛けて繰り返していたのだっけ?
>>666 +1でシフトですか。。有難う御座います。
ちなみにこの場合、DWORDが必要になりますが、WORDをWORD内で
処理する方法はありますでしょか。
>>667 よく考えると0.15て全く見当違いの数字でした;
0〜100の場合の話で、範囲が広くなれば随分偏りますよ。
671 :
デフォルトの名無しさん :03/02/27 19:25
Javaでディレリ情報を再帰的に取得しようと四苦八苦しております。 その際に、取得する深さを指定したいのです。 指定ディレクトリから、n階層下までのファイル名一覧を取得したいって感じです。 この指定階層より深いところは無視するという処理に関して、 どこか参考になるサイトないしアルゴリズムはあるでしょうか?
再帰呼び出しを使えば? int depth を引数につけて、再帰するときに 1 ずつ減らす。
遅レスすみません。
>>658 3*n^2ですか、結構少なくて済むんですね。
物は試しってことで今作っているので、できたら
何回ループするか計ってみます。
>>660 塗りつぶしのアルゴリズムは分かるんですが、これに障害物なんかが
入ってくるとさっぱりでした。
単純な塗りつぶしは、キャラクタからのx,y座標の絶対値を足した値が
移動力以下なら移動可でいいんですよね。
674 :
デフォルトの名無しさん :03/03/04 13:39
問題:次の構文規則で定義される記号列「特列」を考える。 特列='0'|'1' 特列 特列 入力が「特列の後ろに'$'の続いたもの」となっているかどうかを判定し、 なっていればYESと出力し,なっていなければNOと出力するプログラムを、 再帰降下法に従って実現して書き下せ。ただし、次の前提を置く。 getch()を呼び出すと,つぎの1文字が変数chに読み取れる。また、文字列sを引数として呼び出しerror(s)を行うとsが出力され,プログラムの実 行が終わる。この問題で t(){ if(ch=='0') getch(); else if(ch=='1'){ getch(); t(); t(); } else error(NO); } if(ch=='$') error(YES); else error(NO); こう書いて間違ってるみたいなんだけどどう書くと正解か分かったら教えてください
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
直通 090−8505−3086
URL
http://www.h5.dion.ne.jp/~grobal/ メール
[email protected] グローバル探偵事務局
676 :
デフォルトの名無しさん :03/03/05 18:00
3つの定数 S, D, C があり、それぞれ S: 初期値 D: 増分値 C: 分割数 と定義します。 この3定数を一組としてパラメータ X で決まる値 A を用意し、Aを A = S + D * X ( 0 <= X < C, 0 < C ) と定義します。 ここでAの式および各定数が独立して n 個( 0 < n )あるとして、 A1 = S1 + D1 * X1 ( 0 <= X1 < C1, 0 < C1 ) A2 = S2 + D2 * X2 ( 0 <= X2 < C2, 0 < C2 ) ... An = Sn + Dn * Xn ( 0 <= Xn < Cn, 0 < C3 ) という n 個の式があるものとします。 パラメータ X1〜Xn は初期状態で全て0とします。 パラメータは Xn を+1ずつカウントアップさせ、Xn < Cn が満たされないとき Xn = 0 に戻し、Xn-1 (1つ上のパラメータ) を+1するというパラメータ変化を 行うものとします。Xn-1 < Cn-1 が満たされないときは Xn-2 を+1です。 Xnカウントアップ繰り返しの結果、最終的に X1 < C1 が満たされなくなった時点で終了とします。 総繰り返し回数を T とすると、T はC1〜Cnを全て掛け合わせた値となります。ここで (1) 初期状態から終了状態(T回)までの各状態における A1〜An の和の総累積値 (2) 初期状態から任意の繰り返し時点 P (1<=P<=T) までの各状態における A1〜An の和の総累積値 (3) 任意の繰り返し時点 Q (1<=Q<=T) から終了状態(T回)までの各状態における A1〜An の和の総累積値 を求めたいのですが、皆さんの知恵を貸してください。 条件で不明な点がありましたらご指摘ください。
総累積値を求めたい背景も書いておきます。
現在既に、任意の繰り返し時点 P (1<=P<=T) におけるA1〜Anは求めることが出来ています。
A1〜Anは時間値として扱い、同時にn個の独立した電圧値V1〜Vnを用意して A1〜Anに割り当てて、
階段状に変化する電圧波形を出力させています。
ここで任意の時点 P において、 時点Tの電圧波形パターンを出力し終えるまでに掛かる時間を
正確に求めようとしたとき、
>>676 の(3)を計算により求める必要が出てきたのです。
時点P〜Tの各状態におけるA1〜Anを生成し、順次足し合わせるという方法は最も安易ですが、
nやC1〜Cnの値が大きいときには計算量が大きすぎて実用になりません。
現在 S, D, C と等差級数の和を求める数式を活用できないか、ということで試行錯誤していますが
正確な残り時間の累計値が出るに至っていない状況です。
面倒だからカウンタ X の添字は一番下を1、一番上を n とする。 t(X) = Σ[i=1〜n]{ (Π[j=1〜i-1]{ C[k] }) * X[i] } 以下では X を t の関数と考え、X(t)[i] のように書く。 時刻のときの A[i] の値 a(i,X) は a(i,X) = S[i] + D[i]*X(t)[i] (1) A[i] の累積 f1(i) は f1(i) = Σ[t=1〜T]{ a(i,t) } t=1〜T で X(t)[i] が値 k をとる回数は T/C[i] なので、 f1(i) = T*S[i] + Σ[k=0〜C[i]-1]{ (D[i]*T/C[i])*k } = T*S[i] + T*D[i]*(C[i]-1)/2 これを i=1〜n で和をとればよい。すなわち、Σ[i=1〜n]{ Y(i) } (2) Qまでの A[i] の累積 f2(Q,i) は f2(Q,i) = Q*S[i]+D[i]*Σ[k=0〜C[i]-1]{k*n(Q,i,k)} ただし n(Q,i,k) はt=1〜Q で X(t)[i] が値 k をとる回数で 「Q÷C[i] = q あまり r」として、 k ≦ r なら n(Q,i,k) = q+1 であり r < k なら n(Q,i,k) = q である。 Σ[k=0〜C[i]-1]{k*n(Q,i,k)} = Σ[k=0〜r]{k*(q+1)} + Σ[k=r+1〜C[i]-1]{k*q} = ( (q+1)*(r+1)*r + q*(C[i]+r)(C[i]-r-1) )/2 (3) は (1) から (2) を引けばよい。
レス遅れました。
>>672 うまくいってるような感じです。ありがとうございました。
>>678 さんどうもありがとうございます。
>>676 内に示す表記において
n = 2
S1 = 1, D1 = 1, C1 = 10
S2 = 1, D1 = 1, C1 = 10
という簡単な例(T=100)で検証中です。
(1)の計算結果は 1100 となり正しい値となるようですが、
(2)の計算結果が Q = 99 としたとき 900 となってしまいました。
本来の結果は 1100 - (10 + 10) で 1080 となるはずでしょうか。
f2(Q,i) = Q*S[i]+D[i]*Σ[k=0〜C[i]-1]{k*n(Q,i,k)} に従うと
Q = 99, i = 1 のとき q = 99 / 10 = 9, r = 99 % 10 = 9 となって
( (q+1)*(r+1)*r + q*(C[i]+r)(C[i]-r-1) )/2
= ( 10 * 10 * 9 + 9 * (10 + 9) * (10 - 9 - 1) ) / 2
= 450
i = 0 のときも q, r は同じであるから計算結果は 450 となり、
450 + 450 = 900 が(2)の答えとなってしまった次第です。
681 :
モジュラス43 :03/03/07 23:38
只今、納期に追われてます・・・ チェックデェジットのモジュラス43をVBで至急書かなければなりません。 アルゴリズムは解ったのですが、VBコードの関数お持ちの方、実コード教えて下さい。 お願いします・・・・
682 :
モジュラス43 :03/03/07 23:40
HELPです・・・
683 :
モジュラス43 :03/03/07 23:50
只今、納期に追われてます・・・ チェックデェジットのモジュラス43をVBで至急書かなければなりません。 アルゴリズムは解ったのですが、VBコードの関数お持ちの方、実コード教えて下さい。 お願いします・・・・
マップ自動生成するプログラムは解りますか?
どんなマップ?
関数型言語の map にきまってるだろ。
普通、マップといったら関数の写像関係を表す言葉しか思い浮かばないが。 f: Z -> N とかね。 関数を与えると、こういうマップを書き出してくれるプログラムのことだろ? prolog でも作るの?
φ Z/{1,-1} -> N
↑ 顔文字かと思った・・・
すいません。マップ生成とは、アートディンクのアトラスのような世界マップの自動生成と トルネコみたいなダンジョンマップとティルナノーグみたいなフィールトのマップの ことを言います。 わかる方どうかお願いします。
>>690 各ソフトがどんな作り方してるか、考えてみるといいですよ。
>>680 寝ぼけてたスマソ
A[i]の Q までの累積は
(Q+1)*S[i] + D[i]*(
((q0+1)*P[i-1])*Σ[c=0〜q1-1]{c} +
(q0*P[i-1]+r1)*q1 +
(q0*P[i-1])*Σ[c=q1+1〜C[i]-1]{c})
=(Q+1)*S[i] + D[i]*(
(q0*P[i-1]+r1)*q1 + ((q0+1)*(q1-1)*q1 + q0*(C[i]+q1)*(C[i]-q1-1))*P[i-1]/2 )
ただし P[i]=Π[k=1..i] C[i]、Q+1÷P[i]=q0 あまり r0、r0÷P[i-1]=q1 あまり r1
>>690 rogue の level.c:make_level() は短いから読んでみれば
694 :
デフォルトの名無しさん :03/03/13 02:14
三次元上で円柱と三角形の交差判定を行いたいのですが、どうしてもうまくいきません。 どなたか知恵を貸していただけないでしょうか。
695 :
Neiklot ◆pNTQ.vzQQM :03/03/13 02:21
Javaで10*10程度の小さな四角形を十字キーでコントロールできるプログラムを作っています。 その四角形が通ったあとに軌跡を残るようにして、 その軌跡にぶつかったら画面が赤く光るようにしたいのですが、 この問題は、どうすれば解決できるでしょうか?
>>695 その四角形が通ったあとに軌跡を残るようにして、
その軌跡にぶつかったら画面が赤く光るようにすればいい。
>694 三角形は枠だけ? それとも板?
699 :
Neiklot ◆pNTQ.vzQQM :03/03/13 02:35
三角形は板です。 それから、円柱は基本的にx,z軸に対して垂直です。
>699 そんなのここで語る話じゃないな。 Javaスレで聞け。
703 :
Neiklot ◆pNTQ.vzQQM :03/03/13 02:47
704 :
プログラム売買 :03/03/13 02:59
株価のチャートソフトを作りたいのです。 データを時系列にプロットするプログラムなのですが、 アイディアを貸していただけないでしょうか?
707 :
デフォルトの名無しさん :03/03/14 22:49
数学板が読めないのでここをお借りします。 問題:時刻t0にて位置x0、速度v0。時刻t1にて位置x1、速度v1。この条件下で滑らかに補間せよ。 で、加速度aを一定と仮定して、横軸t、縦軸xとするとtnで値xn、傾きvnの放物線ができると予想。 F(t)=x=a(t-p)^2+q--------------A 「 F(t0)=x0=a(t0-p)^2+q---------(1) L F(t1)=x1=a(t1-p)^2+q---------(2) dF(t)/dt=dx/dt=V(t)=2a(t-p)----B 「 V(t0)=v0=2a(t0-p)------------(3) L V(t1)=v1=2a(t1-p)------------(4) で解いたところ p=(v0t0-v1t1-2(x0-x1))/(v0-v1) a=(v0-v1)/2(t0-t1) q=2x0/(v0(t0-p))=2x1/(v1(t1-p)) となりましたが、全然違うみたい。式の立て方が間違ってますか? qの等式成り立つのかと疑問ですし。添削おながいします。
あー、加速度=2aだけどね
数学板ふっかつしたようなのでそっちに逝ってきます
…
VB初心スレから誘導されました。初心者質問で申し訳ないのですが, <全部平均するとこちらが設定したような数Nになるような乱数(乱数の個数も こちらが設定)を発生するような方法>というのはどのようなものなのでしょうか? どうかよろしくお願いします。
>>711 まず好きな特性の乱数を作りだす
その後、その乱数の平均を求めて、 設定した値 N との差を出し、 乱数列の全部の要素に足せばいい
>712 どうも有難うございました。助かりました。
714 :
デフォルトの名無しさん :03/03/18 21:40
アルゴリズムと聞くとリンゴを思い浮かべてしまうね
オーダ記法で教えてください O(f(n)) + O(g(n)) = O(max(f(n) , g(n))) この式のmax(f(n) , g(n))とはどういう数式なんでしょうか? エクセルのmax関数と同じでいいんでしょうか?
突然ですが、この間ゲーセンで「ぷよぷよ」やってたんですが そこでふっと疑問。 あの同色のぷよが4つ以上そろったら消えるって、どういうアルゴリズムなんですか? ぷよのならべ方はべつに直線とは限らないし、時には6つ・7つと繋がる こともあるわけで。 ほんと疑問です。誰か分かる方おられます? ひょっとしたら初歩的な質問かもしれませんんが。
>>718 わ〜い 1021点いった〜ヽ(∇⌒ヽ)(ノ⌒∇)ノ
わ〜い 1627点更新〜ヽ(∇⌒ヽ)(ノ⌒∇)ノ 南無ロックキー使いましょう(謎)
red black tree の名前の由来は何ですか? google ってみても、うまく引っかからない。
なぜ white black や red blue ではなくて red black か、ってこと?
Standard C/C++ 赤黒木の改良 P. J. Plauger/熊谷典大訳 まぁ、これでも読んでみ
引用、失敗。 上記記事は C MAGAZINE, 2000年10月号 に掲載なのだ
725 :
デフォルトの名無しさん :03/03/27 03:52
(゜Д゜)ゴルアリズム ズンチャズンチャ♪
>721 Red Sun Black Clossからきているんだよ(w
赤字黒字?
1 次時間、 2 次時間ってなんですか? 配列から要素を削除することの説明で出てきたのですが。
O(n) O(n^2) のことじゃない?
first order, second order かもしれない。
(doubly)linked list はどういうときに使うと効果的なのですか? 普段は Java を使っているんですけど、 LinkedList のありがたみがあまりよく分かりません。
可変長配列が作れる。 ArrayList とか連結リストじゃないっけ。
他には、キューからデキューするときのように全体をシフトしたい場合とか。
すみません、教えてください。
行列(最大10×10)の固有値を
Cのプログラムで求めたいです。
世には色々な方法がありますが、
ソースが手に入って、精度も良いお勧めの方法を教えてください。
希望をいえば、matlabのeigと同じ精度(欲張ってすみません)
行列要素は、実数です。ただし、対称行列ではありません。
C言語によるアルゴリズム辞典
http://www.matsusaka-u.ac.jp/~okumura/algo/ では、全部実対称行列が対象だった。(泣)
よろしくお願いします。
>>735 さん、ありがとう。
でも、Cのソースが欲しいのですよ。
よい方法を模索中です。
いつもここから「NHKピタゴラスイッチ アルゴリズムたいそう」
>>734 マルチはマナーとしてあまりイクナイよ。
今度から気をつけてね。
>>738 さん
そうですね。気をつけます。
(ちょっと慌てていたもので、、、)
Cの標準関数 sqrt より 高速に平方根を求めるアルゴリズムはありますか? sqrt はニュートン・ラプソン法の逐次計算によって 根を求めているのでしょうか?初期値は? sqrt って基本的な関数ですけど ふと、どうやってんだろうと思ったもので。
>>740 > Cの標準関数 sqrt より
> 高速に平方根を求めるアルゴリズムはありますか?
答えは「ある」だろうけど、数値計算の相応の専門知識が必要になるのでは?
まちがっても、このスレでちょっと質問して、すぐわかるような問題ではないと思われ。
x86なら、多分FPUのfsqrt命令使ってるのでは?
>>740 標準関数だからといって実装まで<標準>があるのではありません。
>>742 さんが書いてる通り、パソコンではFPU命令が使われるのでそれ以上高速にするのは不可能です
浮動小数点の場合、初期値は、
指数部を半分にして、奇数なら√2倍する事を覚えておいて、実数部はテーブル検索で用意するのでしょう
>>それ以上高速にするのは不可能です 俺742だけど、そんな風に書かれると注釈加えたくなるなあw 標準関数といえど関数の中に入っている以上、インラインアセンブラでfsqrtを直接書けば スタックフレームとかcallまわりの処理を省けるので速くなります。 でも、コンパイルオプションによっては数学関数を自動的に展開してくれるコンパイラもあるのでなんとも。
>>744 それは実装上のテクニックだから、アルゴリズムを改善した事にはならないでしょう。
ニュートン法は1回毎に精度桁数が倍になるんで、初期値を適切に選べば
これより高速なアルゴリズムは難しいでしょうね。
精度が不要なら別だろうけど
AMD の 3DNow はsqrtや逆数を ・精度の低い値を求める命令 ・Newton-Raphson法で精度を高める命令 と段階をふんで求めるようになってるね。 低精度でいいのなら、1命令=1clkですぐに結果がでるという。
>>740 see.
情報処理学会論文誌 Vol.31 No.07
いろいろ参考になりました。 自分でもいろいろ調べてみます。
パトリシア木やDouble Array なんかが解説されている書物はありますか?
ヾ(゜▽、゜)ノ パトリシア……
(^^)
753 :
デフォルトの名無しさん :03/04/20 03:40
1:1のマッチングのロジックを書く時って大体 if a > b a only処理 if a < b b only処理 if a = b match処理 だと思うけど、他に良い方法ってあるかな?
if a > b a only処理 else if a < b b only処理 else match処理 分かっているとは思うけど、整順序の場合は比較評価は2回で済む。
いくつかの数字があって、それらを自由に組み合わせて二つのグループに分け、 各グループの数字の合計が、全数字の合計の半分の値に最も近くなるような組み合わせを、 発見するようなアルゴリズムってありますか。
「ナップサック問題」で検索すると幸せになれるかもしれない。
>>756 レス、サンクスです。ググって調べてみます。
ググって調べたところ、自分にできるのは総当たりしか無いことが分かりました。 幸せになったような、なってないような・・・。微妙なところです。
759 :
デフォルトの名無しさん :03/04/23 02:11
diffのアルゴリズムを教えてください。 一応動く程度の処理なら書けるのですが、出力結果が最小になるようにする方法が 全然わかりません。
>759 diffのソース読め
>>755 ソートして交互に取り出したら、正解になったりしない?
>>754 アセンブラだと比較自体は1度で済むね。
条件分岐は2回入るので一緒だけど。
>>761 両グループ同じ要素数とは書いてないからそれじゃだめじゃない?
{10,1,1,1,1,1}のような場合、{10,1,1}と{1,1,1}じゃなくて
{10}と{1,1,1,1,1}に分けたほうが近いじゃん。
>>759 vivi の作者さんのページに文書比較アルゴリズムについての説明と
論文へのポインタが載ってる。
765 :
デフォルトの名無しさん :03/04/24 00:10
>760 見てはみたのですが何をやってるのかさっぱり...でした。 >764 はい、これも読ませてもらいましたが理解できなかったんです。 いろいろ調べてみたんですが良くわからなかったので、 諸先輩方に教えを乞おうっと思って書き込みさせてもらいました。
>>765 diff もどきが作れるのに、ソースも論文もわからないとなると、
関連参考書を買って、勉強するしかないんじゃないか。
767 :
デフォルトの名無しさん :03/04/24 01:11
>766 何か参考になるものがあれば、喜んで購入します。 もしご存知でしたら、関連参考書を教えてください。
>>763 あーそうかー。
じゃぁ、二つの集合A,Bに合計値を覚えながら追加することにして、
Aの合計がBの合計より大きいときだけBに追加(それ以外はAに追加)したら、
正解にならないだろうか?
>>768 例えば {2, 9, 9, 10, 10} なんかで困りそう。
多かったらどれかを戻して…とかやってくと、やっぱり総当たりと同じになりそうだし…
ソートするなりして、最小値のを一つ取って再帰する。
再帰の結果に残しておいたのを合計値の半分により近くなるように分配する。
大きいほうから並べて
>>788 のやり方でもいいと思うけど。
>>755 の問題って、結局のところナップサック問題(合計の半分の大きさのナップサックに詰める)で、
ナップサック問題はNP完全だろ。
ちゃんと解こうとしたら総当たりにしかならないんじゃないか。
AVLムズい。頭パンクしそう、、、
>>770 ,771
>>769 のは {2, 9, 9} と {10, 10} に分けたい例だけど、最初から均等にしてたらできないよ。
大きいほうからだと、 {9, 10} と {9, 10} のどっちかに 2 を追加するって感じになっちゃう。
>>767 アルゴリズムイントロダクション第2巻の最長共通部分系列
>>755 以前、もう一つのアルゴリズムスレで話題になった。
>>775 B木ならまだなんとかなるけど、AVLとか赤黒ってよっぽど慣れてないと
ちゃんと動くまでに時間掛かりすぎるよね。
781 :
デフォルトの名無しさん :03/04/26 22:33
>>778 ありがとうございます。
探してみます。
782 :
デフォルトの名無しさん :03/04/29 11:23
1970年を起点とした秒数から、年月日・時刻を求めるアルゴリズムを探しています。 丁度、gmtime関数がtime_t型の値を変換するものと同じです。 単純に秒を365*24*60*60で割ると閏年の問題で4年ごとに1日ずれてくるので、 Year/4-Year/100+Year/400-477 (閏年で増えた日数) を単純計算で求めた日数から引いてマイナスになったらYearから1引く…なんて考えましたが、 そもそもYearが正しく求められていないので使用することができませんでした。 誰かご存じの方がいればよろしくお願いします。
2年ずらしたら?
year%4==0 (year-1970)/4 ? 色んな計算式を挙げてみたら? C言語?
>>782 400年の日数は 146097 = 400 * 365 + 400 / 4 - 400 / 100 + 400 / 400
100年の日数は 36524 = 100 * 365 + 100 / 4 - 100 / 100
4年の日数は 1461 = 4 * 365 + 4 / 4
n400 = day / 146097;
n100 = (day % 146097) / 36524;
n4 = ((day % 146097) % 36524) / 1461;
n1 = (((day % 146097) % 36524) % 1461) / 365;
year = n400 * 400 + n100 * 100 + n4 * 4 + n1;
みたいな感じでやれば?
秒>分>時>日と出していき、
>>785 さんの方法で試したらできました。
意見を出して頂いた方々、ありがとうございます。
例えば大量の千円〜9千円ぐらいの領収書が大量にあったとして、 その中の組み合わせで3万円に 一番近い数字になるように計算して一番近い順にならべていく方法が あったら教えてください。 一応、考えている言語はC言語です。 ちなみに ナップザック問題を見たのですがどう応用するばいいかよくわかりませんでした
788 :
デフォルトの名無しさん :03/05/02 16:44
790 :
デフォルトの名無しさん :03/05/02 18:36
>>789 総当りしかないんすかねー。
バカなんで、総当りでもどうやったらいいか悩みそう・・。
後、そういうフリーまたはシュアのソフトがあれば、それでもいいのですが。。 ソフトがあるかどうか質問するスレで聞いたのですがなかったもので 自分で作るしかないかなと思って質問しました。
そのうちの一つが3万円に近いことを優先するのか、 3万円から最大誤差のセットで差を出来るだけ小さくしたいのか
>>793 そのうちの一つが3万円に近いことを優先のほうです。
あ、すいません。ちなみに3万は越えないという条件で・・。
2千円ばかりの物だったら、2万8千円のばかりを作ってもいいということ? 28千円×14組?
配列[ a b c d e f g h i j]があってこれは昇順で整列されているとする。 で、配列が正規分布に従うと仮定する。でa+j = b+i = c+h = d+g =e+f と推測して、a〜jが1から9である場合、(a+j) + (b+i) + (c+h) = 30 になるとするってどうよ
>>796 えーと。
3万円までのグループでOKです。
3万1円はXで、3万円は○です。
>>797 まだ理解してないんですけど、どうなんだろうか。。
800 :
デフォルトの名無しさん :03/05/02 23:49
1〜100までの自然数において、2の倍数、3の倍数、5の倍数の和をそれぞれ求める SU…1〜100までの自然数、B2…2の倍数の和、B3…3の倍数の和、B5…5の倍数の和 このアルゴリズムがかけないです・・・ どなかた助言お願いします
>>800 for(i=1; i <= 100; i++){
if(i % 2 == 0) B2 += i;
if(i % 3 == 0) B3 += i;
if(i % 5 == 0) B5 += i;
}
>>800 教えたので教えてください.
組み合わせ/パズルに関するアルゴリズムについてです.
「カ」「キ」「ク」「ケ」「コ」の文字を使って形を作ります.
(別にカキクケコじゃなくてもそれぞれの文字が見分けられれば何でもいいです)
・作る形の例
+++++++ +++++++
+++キ+++ +++++++
++カクケコ+ +キカクケコ+
+++++++ +++++++
+++++++ +++++++
好きなように配置して形を作ればいいのではなく,
どこになら置いていいのか,というのが決まっています.
・置くきまりの例
「カ」の横に置ける文字 「キ」と「ク」
「キ」の横に置ける文字 「カ」と「ク」
「ク」の横に置ける文字 「カ」と「キ」と「ケ」
「ケ」の横に置ける文字 「ク」と「コ」
「コ」の横に置ける文字 「ケ」
(続く)
(続き) で,このきまりに当てはまる形が上の 作る形の例 で示したものです. 次の2つは同じ形とします. +++++++ +++++++ +++キ+++ +++++++ ++カクケコ+ ++カクケコ+ +++++++ +++キ+++ +++++++ +++++++ ・・・ こんな具合のパズルなんですが, これを 置くきまり を元に,何通りの形があるのか, どんな形が作れるのかを求めるアルゴリズムは何かありますか? 応用できそうなアルゴリズムでも結構です. なにか情報があれば教えてください. (ズレました.実際は+マークがそろいます)
コケコケコケコ....と無限に続くような気が... それとも枠が決まってて、それが+で表した領域?
>>806 あ,文字は一度しか使えません.
説明不足でした.
ペントミノのピースに文字を書くみたいなものか。
>>808 そうですねぇ,近いかもしれません.
置くきまりを,
「カ」の横に置ける文字 「キ」「ク」「ケ」「コ」
「キ」の横に置ける文字 「カ」「ク」「ケ」「コ」
「ク」の横に置ける文字 「カ」「キ」「ケ」「コ」
「ケ」の横に置ける文字 「カ」「キ」「ク」「コ」
「コ」の横に置ける文字 「カ」「キ」「ク」「ケ」
と,自身以外の文字全て指定すれば
ペントミノのピース(12種類)の形は全て作成できると思います.
ペントミノ(その他のミノでもいいですが)のピースを
生成するアルゴリズムがあれば参考になるかも知れません..
ピースの自動生成は後回しにして、取りあえず手作業でデータを作る。 個々のピースの各位置に文字を書いていけるか総当たりでチェック。 対称性のチェックは後回し。。。 ピースの構造体 (Pascal) type moji = (ka, ki, ku, ke, ko); var piece: array[1..5] of record V: moji; l, r, u, d: integer;{上下左右に連結してるパートの番号) end; ■ ■■■ ■ 例えば上のピースの定義は piece[1].d := 2; piece[2].u := 1; piece[2].d := 3; piece[2].r := 4; piece[3].u := 2; piece[4].l := 2; piece[4].r := 5; piece[5].l := 4; で、piece[1]からpiece[5]にルールチェックしながら文字を順に入れていく。
ルール表現 (Pascal) type moji = (ka, ki, ku, ke, ko); var rule: array[moji] of set of moji; としておいて rule[ka] := [ki, ku]; rule[ki] := [ka, ku]; rule[ku] := [ka, ki, ke]; rule[ke] := [ku, ko]; rule[ko] := [ke]; せっかくあるんだから、ついでだからと Pascalの集合やスカラー型を目一杯使ってみたりして。 わざわざ面倒な(他言語使用者に分かりにくい)書き方をしてるとも言える。
ペントミノは12種類くらいじゃなかった?
御参考まで、ペントミノ全12種類 ■■■■■ ■■■■ ■■□□ □□□□□ □□□■ □■■■ ■■■ ■■□ ■□□ ■■ □□■ □■■ ■■■ ■□ □□■ □□■ □□■ ■■ □■□□ ■■□ ■□□ ■■■■ □■■ ■■■ □□□□ □■□ ■□□ ■■■ ■■□ □■□ ■■■ □■□ 最後の2つは、この問題の解にはならないね。
ランダム置換列の生成の問題で、0からn-1の整数値があり、全て値が異なるような長さL(L<=n)であるランダム置換列をできるだけ速く、短いプログラムを作り、その正当性を証明して。 という問題が出んです。rand()を使ってみるといいって言われたんだが、どうもできません。助けてください!
815 :
そのこちゃん :03/05/07 17:29
知りたかったらageなさい。
スマソ。age ぜひともアドバイスくださいまし。
>>814 同じ質問を答えたことがあったな。宿題スレだったかな?
そのときは
・n個の配列を作り 0〜n-1 まで順に入れてゆく
・randを使い、配列をシャッフル
・先頭からLまでを答えとする
などの解答がでた。過去ログさがしたがDATオチかな
毎年、必ずこの時期に出る質問だよね。 俺も、もう2度書いたと思う。飽きた。
そんなにベタな問題なのでしょうか? それとも同じ学校、同じ授業で誰かが毎年2chで質問?((((;゚Д゚)))ガクガクブルブル
>>819 たぶん同じ授業だな。5年は続いてるよ。 そろそろ課題変えろって先生に言え
とにかく ニフティ時代から毎年ゴールデンウイークあけにこの問題だ
そうなんだ。 とにかくなんとかなりそうです。ありがとうございます
正当性って定義によるけど例えば順列上の一様分布になることの証明って 簡単じゃないと思う。
たぶん、正当性をきちっと証明するのは要求して無いとおもいます。 その方法が一番早いよってことを説明する程度でよかったとおもう。
>>824 > その方法が一番早いよってこと
むしろそっちの方が難しいと思われ
そっか。うぬぬ。まあちゃんと動くよってことぐらいにしときますw でもうまく書けないんですよ。プログラム自体が。 100*rand()%50 こんな感じにrand使えばいいんですかね?変数にして。
>>827 今C++でやってます。
char s[n]
で数列sをつくってみて
for文でn回ループさせて・・・
ってとこまでで、それから進みません(|| ゚Д゚)
明日なのに、やばいです・・・・
先頭になれるのは Nから一つ 次は (N-1)から一つ って手順をそのまま書くのが一番はやいだろうな
// 変な方法 #include <time.h> #include <stdlib.h> #include <stdio.h> int shuffle_cmp(const void *x, const void *y){return 2*(random()%2)-1;} void shuffle(void *b, size_t n, size_t s){return qsort(b,n,s,shuffle_cmp);} int main(int argc, char **argv) { int n, i, *a; long s; n = argc>1 ? atoi(argv[1]) : 10; s = argc>2 ? atoi(argv[2]) : time(NULL); if (NULL == (a = (int*)malloc(n*sizeof(int)))) return 1; for(i=0; i<n; i++) a[i] = i; srandom(s); shuffle(a,n,sizeof(int)); for(i=0; i<n; i++) printf("%d ", a[i]); puts(""); return 0; }
831 :
デフォルトの名無しさん :03/05/08 00:18
>>830 これは?いったいどうなっているのでしょうか?
変な方法なのですか?
832 :
デフォルトの名無しさん :03/05/08 00:27
c:\program files\microsoft visual studio\myprojects\XXXXX\test.cpp(14) : error C2065: 'shuffle' : 定義されていない識別子です。 srand(s); っていわれます。これはどうなってるんですか?
>>814 C++でもっともマトモな方法ならば、
#include <algorithm>
#include <vector>
std::vector<int> make(int n, int k)
{
std::vector<int> x;
x.reserve(n);
for(int i = 0; i < n; ++i)
x.push_back(i);
std::random_shuffle(x.begin(), x.end());
return std::vector<int>(x.begin(), x.begin() + k);
}
これ以上はないでしょう
スレ立てるまでもない質問はここでスレ(
http://pc2.2ch.net/test/read.cgi/tech/1051370263/ )
より誘導されてきました。
経路探索アルゴリズムを勉強しているのですが、A*(A-Star)アルゴリズムがいまいち
つかめません。
breadth first search(bfs)にコストを導入したもの、というところまではわかったのですが…。
1.パス情報を持つデータを用意する
2.それをオープンリストとし、開始点q(親)を選ぶ
3.qの子ノードのコストを計算する
4.子ノードから一番コストの低いものを選ぶ
5.qをクローズリストに追加し、選ばれた子を親として終点にたどり着くまで繰り返す
これでいいんでしょうか?
これだと行き止まりにいってしまった場合探索が失敗すると思うのですが…。
google による検索結果から以下のURLを参考にしました。
ttp://rajiv.macnn.com/tut/search.html
>>834 random_shuffle が利用する乱数生成器が一様分布に従う場合を考える。
まず k 回目の交換が終った時点で x[k]〜x[n-1] は未交換であることに注意しよう。
n-1 回の交換の結果 x[0]〜x[n-2] の順列が等確率に生成されることを仮定すれば、
n 回目の置換によって末尾の要素 x[n-1] を x[0]〜x[n-1] のいずれかと
等確率で初めて交換されるので n 回の交換によって作られる各順列は等確率となる。
あれから他にも調べて理解が進んだので・・・ 1.オープンリストに開始点を入れる 2.オープンリストが空になるまで繰り返す 3. オープンリストの中から最小コストfを持つもの選び、取り出す 4. それをqとし、周囲8セルの子ノードを作る 5. 子ノードの数繰り返し(8回) 6. コストを計算する 7. オープンリストの中に存在すればスキップ 8. クローズリストの中に存在すればスキップ 9. そうでなければオープンリストに追加する 10. 子ノード繰り返し終了 11.クローズリストにqを追加する 12.オープンリスト繰り返し終了 13.解はクローズリスト これでOKなんでしょうか? どうしても無駄な要素がクローズリストに出てくるのはコスト計算を失敗しているから?
>>837 理解が進んだというか、全然読んでなかったように見えるけど…
closed list は解じゃなくて探訪済みのすべてのノードをとっとく集合。
これがあるせいで A* は指数領域オーダー。
解かどうかの判定は5,6の間で行なって、子がゴールに到達してたらその時点で返すの。
7, 8 はコスト比較の条件が抜けてる。
そもそも該当ページのsuccessorがいったい何なのかが不明だったんです。 申し訳ない。 closed listが探訪済みノードの集合だとすれば解は一体どこへ…? 7,8のコスト比較はリスト内にコストの低い点があればを追加すればいいという 事でOKでしょうか。
>>839 ゴールに着いたらそこから親をたどっていけば解を作れるでしょ。
> 7,8のコスト比較はリスト内にコストの低い点があればを追加
逆。全然分かってないっぽいので注意しとくと、
比較するのは closed にある「同じ位置を指すノード」。
子が未探訪の位置を指すか探訪済みでも既知の道より近道(コストの低い道)だったら
open と closed の両方に加える。だから open 内のノードと比べる必要は本来ない。
そうか、親へのリストを辿ればいいわけですね、thx 7,8はつまりリストに一致するものがあって且つその一致するものと現在のノード コストの比較を行えばいいんでしょうか? つまり function check (list, node) { for each (list) { if (list == node && list.cost < node.cost) skip; } } 抽象的な表現ですがこんな感じ?
>>841 コードの意図がよく分からん。正しいともいえるし間違ってるともいえる。
この辺見るよろし
ttp://www-fs.informatik.uni-tuebingen.de/~hueffner/ 可能ならこの記事で参照してる以下の論文を入手して読むこと
P. E. Hart, N. J. Nilsson, and B. Raphael. A formal basis for the
heuristic determination of minimum cost paths. IEEE Transactions on
Systems Science and Cybernetics, SSC-4(2):100-107, 1968
>>842 そのページも一度みてみたんですけどね。
とりあえず論文取り寄せてみます、ありがとうございます。
#関係ないけど「A-Star(A^*)」という出だしの(A^*)が顔文字に見えた…
844 :
デフォルトの名無しさん :03/05/12 02:26
ランダムな数値配列の中である数値にもっとも近い組み合わせを導きたいのですが 総アタックよりも効率的な方法がありますか? 配列をソートして ・・・という感じになるような気がするんですが、そこからどうやれば良いかわかりません。
初めてです。でも過去ログにあるってことかな? 見てなかった。ごめんね
846==787?
848 :
844, 846 :03/05/12 20:42
>>847 ありましたね。しかもすぐ近所に。
しかし、797の回答ではプログラムに起こすのは困難な上に
非効率的すぎるのですが・・・
もともと、仮定と推測って・・・。
そんなファジーなアルゴリズムはアルゴリズムって呼べるんでしょうか?
>>848 自分の無知を誇るようなレスはやめたほうがいいよ。
リアル厨房なら仕方ないが。
>>848 てゆーか普通にケツから詰めてけばいいんじゃねーの
それが嫌ならもっとファジーな遺伝アルゴリズムを使えば?
終
了
ファジーなものがアルゴリズムじゃなかったら、 確率(ランダム)アルゴリズムは、矛盾した名称ということになるのかね?
組み合わせのアルゴリズムを考えてるのに 配列をソートするところまでしか考えられない奴よりマシ。
それよか近頃はDPも習わないの?
>>848 お前の頭のファジーさが足りねぇ
さらに、結局総当りくらいしか思いつかず、
答えられねぇから叩くだけの香具師も能無し杉だな
と、叩くだけの能ナシからのメッセージ
>>855 今のところ、総当りしか解が存在しないからでは?
NP問題のさわりくらいは知っておいてほしいと思ふ。
859 :
デフォルトの名無しさん :03/05/14 02:21
>858 本しか読まずに考えることをしないのはどうかと。 本や資料に「出来ない・難しい」って書いてあると君はトライしようとも思わんのね >848 工夫次第である程度までなら総当りを避けられるんだから、そっから攻めてけばいい 俺は一般的なアルゴリズム知らんからどこまで説明できるかわからんけど 大---小 0001111 ←は最小からの総和で目標値を超えない位置 0010111 この時、4つのアイテムについて確認するものとし、このリスト中のアイテム数も 0011011 4を超えない事がわかる 0011101 0100111 0101011 0101101 で、総当りをほんの少し回避できるかなー。と思った
書き忘れたけど あの下もずっと同じようなルールで 1111000まで続くんよ。
だから近似解ならO(NlogN)で出るだろ? 近似解で満足しろよ
>>859 そこそこの解を見つけるには、いくつか手法が知られている。
代表的なものは、Genetic Algorithm(遺伝的アルゴリズム)、シミュレーティドアニーリング、など。
そんなおおざっぱな分類をあげても困るという場合は、
情報処理学会の「数理モデル化と問題解決」研究会の論文などを入手して読むよろし。
大勢の人が、弁当を詰め込むのにいかに効率よくするかを研究しているから。
ttp://www.ipsj.or.jp/sig/mps/
この問題は、NP空間に入る問題のひとつである「組み合わせ最適化問題」です。 LSIの設計や、暗号理論、などに組み合わせ最適化問題が使われています。 金融工学にも応用があるようですね(専門外ですが)。 その手の参考書を読むとよいかと。
>>861 ハァ? ああ、そうですね。それはよかったですね。
ところで、二度とプログラム板には来ないでください。
アニメ板が良くお似合いです
p2pで拾ったVBでも使って時計でも作っててください。
>>859 の方法を使ったとしても、結局は、
厳密解に10000年かかるのが、9800年で済むのでうれしいね、くらいの役割しかない。
それがNP問題ですから。
これを現実時間でとくには、
>>861 やその他で言及したように近似解で我慢するか、
P=NPであることを証明しなければならない。
...
どうして同じことを言っている
>>861 >>862 に、
正反対の感情をもって返答しているのだろうか。
そして、人々の活動時間になり、
>>859-870 が自作自演であることが判明するわけだが。
>>870 ???
>>859 ナップザック問題といえば、一般には動的計画法を使うのがよろしいかと。
実装が容易で、実行時間も速い。
よーしパパ P=NP ってことを証明しちゃうぞ、ってなもんやさんどがさ。
>>869 内容理解できなかったから納得。理解できるものは煽る
という糞房特有の性質だから
>>874 863 ですが、865 ではありません。
まじめにこの問題について聞いているつもりですが
騙りが発生した責任をとって二度とここにはきません。
さようなら
ヒープ内の要素数をnとすると、枝を一本追加するのに必要な計算時間がο(log(n)) であるのは、何故ですか? また、枝を一本削除するのに必要な計算時間もο(log(n))であるのは、何故ですか?
トーナメント表のように階層毎にn分の1にデータ量が減るからじゃ?
881 :
デフォルトの名無しさん :03/05/21 23:28
2進10進相互変換のアルゴリズム教えてチョ。 10000桁2進数→10進数ってな感じの
>>881 君、本屋に行って基本情報の参考書の
一番最初の章の一番最初の項目でも
読みなさい。
>>882 人間が脳内変換する分には参考書の方法で良いけど、
プログラムのロジックとしてはまずいんじゃないの?
>>883 たいていサメンションを用いた記述変換公式が載っているかと。
Javaのjava.Math.BigIntegerあたりが参考になりそうなので漁ってみます。 お騒がせしました。
>>884 > たいていサメンションを用いた
サメが住むマンションとか?
>>881 10000桁2進数をそのままの精度で変換したかったらgmpかrubyでも使うかな
何にせよ多倍長数演算の除算と剰余の実装と同じことをしないと
サメイションでわ?
リッチテキストボックスで指定文字を入力すると色が変わるアルゴリズムというかロジックを聞きたい
>>881 >>887 足算だけ実装すれば大丈夫ですよ。
a=1
b=0;
を初期値にして
2進数で下の桁から見ながら
2進数のその桁が1ならb=a+b;
その後、 a=a+a;
>>890 データ構造として10進文字列で持つってこと?
それなら10進の全加算器を書けばいいわけだから納得。
892 :
デフォルトの名無しさん :03/05/26 22:07
自然数の数列 a1,a2,a3....anがあったとして、 それぞれ a1<a2....<an が保証されているとする。 この時 下限minと上限maxが与えられて min<ai<max となるような すべてのiを求める最速のアルゴリズムを考えているのですが。 具体的には 1,3,5,6,7,9,10,11,13,16 という数列があった時 最小4 最大10の時 5,6,7,9を返すという処理です。 DBのbetweenのアルゴリズムなんかが参考になりそうです。 誰か興味がある人議論しましょう。 今考えているのは 線形リストで数列を保存し それらをBTREE(ハッシュでもいい)にマッピングして minとmaxを検出して、ぶっこ抜くのが一番速いのではと考えています。
893 :
デフォルトの名無しさん :03/05/26 22:12
894 :
名無し@沢村 :03/05/26 22:48
おまいらよ、おれがいま研究している2方向量子ウォーク1カウンタオートマトンノアルゴリズムはだな、 出発点 (0,0,…,0), 吸収点 (1,1,…,1) の n次元超立方体上の対称量子ウォークの 吸収時間は Tr Xn - 1 で与えられるんだよ。 ここで Xnは方程式の解となるんだよ。わかるか? おれはいまそういう簡単な研究に取り組んでいるんだよ!!!
>>894 おまいは自分の書いていることがわかっているのかと小一時間(W
897 :
デフォルトの名無しさん :03/05/26 22:55
>吸収時間は Tr Xn - 1 で与えられるんだよ。 なぜ?
>>892 普通の方法
数列を 配列に入れておいて、min max でバイナリ検索し、アドレスを求め
挟まれた区間を取り出す
900 :
名無し@沢村 :03/05/28 03:55
おまいらよ、量子PCというのはな、量子重ね合わせの状態を使って並列計算を行うことができるPCのことよ。わかるか?。 おまいらよ、量子重ね合わせの状態とは何かわかるか? まあくだいていえば、一台の車が右向きに走っている状態と左向きに走っている状態が同時に成立しているということよ。 だが、おれらが実際見ると、車は右向きか左向きかに固定して走ってるだろ?それは観測することによって、重ね合わせの状態のうちのひとつが固定するからよ。 おまいらよ、重ね合わせの状態のうちのひとつがどれに固定するかは、重ね合わせの係数によって決まるのよ。おまいらよ、重ね合わせの係数は複素数よ。複素数の勉強をしてみろ? おまいらよ、量子PCでいう演算とは、この量子重ね合わせの状態を担う物理系に対してに対して、パルス電波を与えることよ。 いままでのPCでは4bitで表現できる16の状態のうち一つについて1回づつ演算を行い、合計16回計算して16通りの結果を出力してたが、量子PCでは4bitで表現できる16の状態を同時に実現している重ねあわされた量子状態に対して1回の演算を行い、結果を出力するんだよ。 当然処理bit数が増えるほど、量子PCの威力は大きくなるわな。だから並列処理よ。 だが、おまいらよ、その演算結果を見ようとすると、重なり合った状態のうちの一つしか見れないだろ? この問題を解決するものとしてShorのアルゴリズムというのがあるよ。 Shorのアルゴリズムは量子PCの教科書には必ず出てくる有名なアルゴリズムだから、見てみろ? おまいらよ、このようにこれからのプログラムは量子の時代よ。 おまいらも量子に取り組んだらどうだ?量子でないプログラミングなんて意味ねーよ!
量子PCのPCってパーソナルコンピュータ?
902 :
デフォルトの名無しさん :03/05/28 09:03
プログラムカウンタ
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
904 :
デフォルトの名無しさん :03/05/29 01:13
age
今のところ、量子など、暗号理論と人の名前でしか常用されない罠。 量子コンピュータの登場は沢村が死んでからになります。
そんなこといいから早く沢村はHelloWorldの次のソフト開発しれ わからないことあったらここで訊いていいから
ビット演算の質問ですが (ABCDは0または1の任意のビットとする) 0000ABCD を A0B0C0D0 に変換するスマートな方法はないものでしょうか? 今のところは、左シフトもしくは加算でAならAだけをとりあえず目的の位置に移動したのち&でゴミを除去、 というのをビットの桁数ぶんだけ行うという地道な方法しか思いつかない状態です。
char b = 0x00; char c = ( b&0x08 ? 0x80 : 0x00 ) | ( b&0x04 ? 0x40 : 0x00 ) | ( b&0x02 ? 0x20 : 0x00 ) | ( b&0x01 ? 0x10 : 0x00 ); こんなんでどう?
>>907 a = ((a & 0x08) << 4) | ((a & 0x04) << 3) | ((a & 0x02) << 2) | ((a & 0x01) << 1);
こんな感じが最短かもね a := ((a shl 2) and $30) or (a and $03) ;//AB00CD a := ((a shl 1) and $88) or (a and $22) ;// (AB00CD0 and 10001000)+(0AB00CD and 00100010
間違ってる。 00000000abcdefgh -> 0000abcd0000efgh ->00ab00cd00ef00gh ->a0b0c0d0e0f0g0h0 てな感じに処理したいから適当に
昇順にソートされた2つの配列 a[0], a[1], a[2]・・・a[n-1] b[0], b[1], b[2]・・・b[m-1] があるとして、これらの数を配列c[0]〜c[n+m-1]に 効率よく(n+mに比例する時間で)昇順に蓄えるには どのような方法が考えられるでしょうか?
915 :
デフォルトの名無しさん :03/06/02 14:23
転置索引って何ですか?
916 :
名無し@沢村 :03/06/02 15:03
おまいらよ、クリックソートはマウスをクリックするくらいの速さでソートするという意味だ。 マージソートはマジ(真剣)にソートするという意味だよ。 これは本当だぞ! ちなみにバブルソートはバブルの時代にはやったソートという意味な。
うるせえ黙ってろ
918 :
名無し@沢村 :03/06/02 18:44
>>886 >>888 ハゲ!!おまいらよ、サメンションっていったらシグマのことだよ。
シグマってわかるか?Σのことだよ。わかるかな?
919 :
名無し@沢村 :03/06/02 18:46
ちなみにインテグラっていったら積分記号のことな。 おまいらよ、intのことをインテグラていうだろ? あれはもともと積分記号のことよ。
インテジャー
921 :
デフォルトの名無しさん :03/06/02 19:11
しまった、沢村にレスしてもうた・・・
924 :
デフォルトの名無しさん :03/06/02 20:27
925 :
デフォルトの名無しさん :03/06/02 22:22
intはインテジャーだけど
インテガーだよ それよりアルゴリズム体操しってるか 面白いぞ
アルゴリズム行進も面白い
むしろ1りでやった後の2人プレイをみるとなるほどと思うこと間違いなし
929 :
デフォルトの名無しさん :03/06/02 23:03
Algorithmか・・.昔Famitsuに用語解説が載ってたな."敵のalgorithmを読み切れ!"とか.
>>928 そう
アルゴリズム体操は一人でやってもつまんないよね
そんな一人ぼっちには律動体操がおすすめ
933 :
デフォルトの名無しさん :03/06/06 16:25
なんとなくフリーセルのクローンを作ろうかなと思い立ち、頭の中で妄想 してみたんですが、問題作成アルゴリズムの見当が全く付きません; どなたかクローン作った事ある方いらしたら大まかでよろしいので 教えて頂けませんか。。。
>>933 Windowsのフリーセルで、ゲーム番号の指定で-1か-2と入れてみな。絶対に勝てないから。
935 :
デフォルトの名無しさん :03/06/06 16:42
? -1・-2は遊びでしょう。 アレ以外は全部解ける様に作られてるわけで。
とけるような配置を作ることは出来るのは分かるけど、 ランダムに配置した場合にとけない場合があるかどうかって証明済?
937 :
デフォルトの名無しさん :03/06/06 23:38
>>936 例えば、 -1・-2
乱数でばらまいて出る事はまずあり得ないけど。
938 :
デフォルトの名無しさん :03/06/06 23:51
CSVファイルの中身を検索したい場合、 今は、全部の行を配列に読み込んで、 その配列内をループして検索してますが、 ファイルの行数が300〜500くらいあるので時間がかかります。 もっと早く検索する方法ってあるんでしょうか。
939 :
デフォルトの名無しさん :03/06/06 23:53
>>938 どんなレコード構造で、どんなデータを探したいのか書け
次のような課題が出ました. ---- データ(x_i, y_i) [i=(1,2,・・・,N)] を直線近似する. 直線とそれぞれの点との 距離r_i の距離の和 Σr_i を最小にする直線を求める方法でプログラミングせよ. ---- 直線( ax + by + c = 0 )と点 (x_i, y_i) との距離は r_i = | a * x_i + b * y_i + c | / sqrt{a^2+b^2} なので,距離の和は Σr_i であり,これが最小になる a, b, c を求めればいいことはわかりました. しかし,この先がわかりません. 最小自乗法の式の導き方はわかったのですが, 今回のやり方では偏微分の式の中に絶対値が入ってしまっているので, どうしたらいいかわかりません. ヒントください.
941 :
デフォルトの名無しさん :03/06/06 23:57
943 :
デフォルトの名無しさん :03/06/06 23:59
945 :
デフォルトの名無しさん :03/06/07 00:00
レコード構造は 登録日(yyyymmdd),姓,名,姓ふりがな,名ふりがな,性別,年齢,E-Mail,電話番号 検索というより、ソートと抽出です。 全行を姓ふりがな、名ふりがなの値を利用して、五十音順(文字コード順)にソート。 その後、 性別(男、女、すべて) 年齢(20歳以下、30歳以下、40歳以下、すべて) の条件に合うデータを抽出したいと考えています。
C/C++の宿題 のスレッドに書き込みしましたが, こっちのスレッドのほうが質問の内容に適していると思い, こちらに書き込みさせていただきました. すいません.
945は939に対する返信です。
>>945 検索するキーごとについて予めソートしておく。
それぞれのキーについて二分法で探索し、得られた結果の共通部分をとる。
>950 あらかじめ、インデックスを作成しておくということですね。 全部の行を読むのは仕方ないにしても、検索処理は早くなりそうですね。 データファイルの更新日付を見て、更新されていなければ現在のインデックスファイルを 利用して、更新されていればその場でインデックスを作り直すというのがいいんでしょうか。
>>953 インデックス再構成のスケジュールは用途に応じて決めるべし。
オンデマンドで再構成だと応答の遅延が実用的でないかもしれないし、
更新が頻繁だとロックする必要がある。
検索が定型ならインデックスのインデックスを更に作っておくと早い。
例えば年齢に関するインデックス(それはレコードへのポインタの配列だろう)の
何番目からがn歳以上なのかをインデックスしておくと、検索の必要がない。
ただし、この配列の共通部分の計算がボトルネックになる場合は、
ソートせずにビットマップで持っておく。
例えば age[10] は i 番目の人が10歳であるときに age[10][i] = 1 であり
そうでなければ age[10][i] = 0 であるようなビットマップ。
これらのビットマップを年齢や単語などの数だけ用意しておき、
合致するデータをマスクとの積によって計算しビットマップの束として得る。
最後にこの束についてビット積をとることで求めたい共通部分が出る。
ビットマップ演算を bitfield で出来るのでtune-upしやすい。
また、定型の検索についてはマスクとの積を予め行なっておくことで、
要求時には共通部分をとる操作だけで済む。
googleなどで使われているのはおそらくこの手の方法じゃなかろうか。
955 :
デフォルトの名無しさん :03/06/11 23:54
n個の異なる数の集合から正確に(n+1)/2番目の要素、つまり中央値を縮小法を使ってアルゴリズムを設計しなさい。 ってでました。助けて下さい。
>>955 寡聞にして縮小法というのを知らないのだが、
Hoareのfindアルゴリズムがそれになっていないかな?
958 :
デフォルトの名無しさん :03/06/30 14:36
手の始点と終点の座標及び関節が曲がることのできる角度から 関節部の座標を求めるアルゴリズムってなんでしたっけ? わかりづらくてすんません。
ありがとうヽ(`Д´)ノ
961 :
デフォルトの名無しさん :03/07/01 09:44
有る点が領域(直線のみでよい)内に有るかの判断 何かいい方法有りますか?
>>961 意味がわからん。
2次元空間で、その領域が直線のみで囲まれているということか?
964 :
デフォルトの名無しさん :03/07/01 10:12
966 :
デフォルトの名無しさん :03/07/01 10:23
>>961 ありがとうございます。
でも、この方法だと半無限線の方向が問題になると思われます
仮に半無限線を+の水平方向にした場合
********* **********
* * * *
* * * *
* × ******** *
* *
* *
* *
*************************
***********
* *
* *
* × *******
* *
* *
* *
*****************
上は交点3、下は交点2ですが
どちらも領域内部です
967 :
デフォルトの名無しさん :03/07/01 10:24
すいません絵がめちゃくちゃですね
968 :
デフォルトの名無しさん :03/07/01 10:31
************ ********** * * * * * * * * * × ********** * * * * * * * ****************************** ************ * * * * * × ***** * * * * * * **************** 半無限線が水平で作成した場合 上は交点3、下は交点2ですが どちらも領域内部です
半無限線て何?
970 :
デフォルトの名無しさん :03/07/01 10:35
996>>無限線の端点が固定された直線の事です
971 :
デフォルトの名無しさん :03/07/01 10:36
↑969>>の間違いでした
972 :
デフォルトの名無しさん :03/07/01 10:36
絵がうまく描けませんが、上は凹、下はL字型です
無限線て何?
「線」・「直線」は、無限長。 「半直線」・「半無限〜」は、片側が端点で、もう片方が無限。 「線分」が、両方に短点を持つもの。
>>975 短点 → 端点 でした。
端点って辞書に載ってないのね。専門用語だから?それとも誤用?
直線・半直線は知ってるが、無限線・半無限線なんて聞いたことない。 どっかの業界の隠語?
978 :
デフォルトの名無しさん :03/07/01 13:41
CADでは日常ちゃめしごとと思われますです
>>966 検索した
>>963 の中に、
>方式1 交差回数法: 点qから直線を引き、多角形と何度交わるか
>方式2 巻付判定法: 多角形をゴムに換えたら点qに巻付くか?
> =点qから見て多角形の線分を順に追いかけてゆくと1回転以上するかどうか
とあって、サンプルコードまで付いてるじゃないか。よく見てみなさい。
>方式1 交差回数法:y軸と交わった時の符号が正ならインクリメント
> 線分が y軸と交わるかどうかは 線分の始点終点のx座標の符号が違うかどうか
でサンプルコードはこうだ
> if ((rx<0)and(nx>=0)) or ((rx>=0) and (nx<0)) then begin
この部分で水平線はひっからないだろ?
981 :
デフォルトの名無しさん :03/07/01 16:10
980>>ありがとうございます。水平線はひっかからない? これは、方式2のサンプルですよね。 良く解らないですが(頭悪いので)、サンプル手に入りました。みなさんありがとうございました
>>981 1も2も考え方は違うけどコードは殆ど同じになると書いてあるぞ