X



データ構造,アルゴリズム,デザインパターン総合スレ 3©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん 転載ダメ©2ch.net垢版2016/06/19(日) 14:47:29.63ID:5KvSKdL/
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

データ構造,アルゴリズム,デザインパターン総合スレ 2
http://echo.2ch.net/test/read.cgi/tech/1362301811/

【関連スレ】
3Dアルゴリズム全般
http://toro.2ch.net/test/read.cgi/tech/1164171086/
<集大成>アルゴリズム大辞典
http://toro.2ch.net/test/read.cgi/tech/1086272325/
アルゴリズム総合スレ in ム板
http://toro.2ch.net/test/read.cgi/tech/1217773415/

アルゴリズムとデータ構造 - Kaneko Lab.
ttp://www.kkaneko.com/adp/algo/index.html
アルゴリズムとデータ構造 - ソースコード探険隊
ttp://www.codereading.com/algo_and_ds/
各種アルゴリズムの C++ による実装 - Spaghetti Source
ttp://www.prefield.com/algorithm/
アルゴリズムとデータ構造 - プログラミングスレまとめ in VIP
ttp://vipprog.net/wiki/algo_and_data_const.html
0002デフォルトの名無しさん垢版2016/06/19(日) 14:52:46.31ID:5KvSKdL/
ttp://hissi.org/read.php/tech/20160619/YW80V0xnZlg.html
へんなのが居着いたな

981 :デフォルトの名無しさん[sage]:2016/06/19(日) 12:16:06.94 ID:ao4WLgfX
>>980
いつも思うんだけれども,この碁の勝負,棋譜は公開されているの?

985 :デフォルトの名無しさん[sage]:2016/06/19(日) 12:47:45.21 ID:ao4WLgfX
>>982
どこに貼ってあるかな?たぶん公開されてないんじゃないかな

986 :デフォルトの名無しさん[sage]:2016/06/19(日) 12:59:15.60 ID:ao4WLgfX
http://blogs.yahoo.co.jp/ten_nan_91/35774553.html

988 :デフォルトの名無しさん[sage]:2016/06/19(日) 13:02:20.35 ID:ao4WLgfX
ありがとう

1000:デフォルトの名無しさん[sage]:2016/06/19(日) 14:49:22.87 ID:ao4WLgfX
0
0007デフォルトの名無しさん垢版2016/06/19(日) 19:39:00.16ID:iKM7Z0CI
Haskellって勉強する意味ある?
実用性はないよね?
0009デフォルトの名無しさん垢版2016/06/19(日) 20:49:00.89ID:iKM7Z0CI
なぜ、HaskellやSchemeをありがたがる人がいるの?
どう考えてもC#とかのほうが生産性が高いのに。
単なるかっこつけ?
0010デフォルトの名無しさん垢版2016/06/19(日) 20:49:49.63ID:iKM7Z0CI
MITのコンピュータの入門書もSchemeを使っていたりする。
0011デフォルトの名無しさん垢版2016/06/19(日) 20:59:07.46ID:Axw7zBsF
言語としてのlisp最強論は理解できるけどね。
実用的ではないのは言語自体の問題ではなくてシェアとかサポートする企業の存在とかコミュニティの問題。
0012デフォルトの名無しさん垢版2016/06/19(日) 23:46:31.97ID:XG1Xog94
haskellやschemeは勉強したくない奴には不要
雇われには言語選択権はないので、かりにそれらがよいものであったとしたとしても、フラストレーションたまるだけだろ

一言でいうなら自分で一から十まで計算を構築するための言語だな
ライブラリ駆使して、なんとかすることが求められている人間にはこんなものは不要
0013デフォルトの名無しさん垢版2016/06/20(月) 00:15:53.04ID:VsbhBHIt
>>12
マジかよ
0014デフォルトの名無しさん垢版2016/06/20(月) 00:57:04.30ID:rbqmVuz6
>>12
> ライブラリ駆使して、なんとかすることが求められている人間にはこんなものは不要

ライブラリを駆使するのが今のプログラマに求められている技術だからな。

MITがSICPを教えなくなった理由
https://ezoeryou.github.io/blog/article/2016-05-05-sicp.html
> 今日では、状況が変わっている。今のエンジニアは、自分が完全に理解していない複雑なハードウェアの
> ためのコードを日常的に書いている(そして、大抵の場合、企業秘密により完全に理解するのは不可能である)。
> ソフトウェアでも状況は同じだ。プログラミング環境は、多大な機能を提供する巨大なライブラリ群の集合として存在している。
> Sussmanの今日の生徒は、その時間の大半を、ライブラリのマニュアルを読み、どのように組み合わせれば目的が
> 達成できるのかを把握することに費やしている。Sussman曰く、今日のプログラミングは、「より科学に近い。
> ライブラリを持ち寄って、つっつき回すのだ。プログラムを書くには、突っつき回して、どのように動作するかを観察する。
> そして、「目的を達成するために改造できるか」と考えるのだ」。SICPの「合成による解析」という物の見方である、
> 小さな、単純な部品を組み合わせて大きなシステムを作るということは、もはや今日の状況にそぐわなくなった。
> 今や、我々のプログラミングはつっつき回すことで行われている。
>
> なぜPythonを選んだかということについて、Sussmanは、"late binding"に決定したと冗談を飛ばした。
> Pythonには大量のライブラリがあり、教育者の様々な実習に使いやすい(たとえば、ロボットを制御するソフトウェアを書くなど)
0015デフォルトの名無しさん垢版2016/06/20(月) 06:52:18.91ID:1vrQKLsp
HaskellやSchemeの利点は?
少なくとも、分かりにくいよね。
0019デフォルトの名無しさん垢版2016/06/20(月) 18:23:24.04ID:78XmmaUt
>>14
>今日のプログラミングは、「より科学に近い。

ここは変だな
「より工学に近い。」
というなら判るが
0020デフォルトの名無しさん垢版2016/06/20(月) 18:31:26.30ID:1vrQKLsp
SICPをプログラミング初学者に教えるというのは確かに異様だよね。

やっとまともになったというだけの話。
0021デフォルトの名無しさん垢版2016/06/20(月) 18:35:05.72ID:1vrQKLsp
コンピュータサイエンスの中でアルゴリズムとデータ構造ってどれくらい重要な科目なの?
0022デフォルトの名無しさん垢版2016/06/20(月) 18:50:31.57ID:FhfmjeRD
アルゴリズム + データ構造 = プログラム。
ということは。
プログラムの占める割合と等価なのでは。
0023デフォルトの名無しさん垢版2016/06/20(月) 18:52:50.90ID:1vrQKLsp
なんか計算の理論とかのほうが上みたいな感じじゃない?
0024デフォルトの名無しさん垢版2016/06/20(月) 18:53:47.25ID:1vrQKLsp
コンピュータサイエンスで最も重要な科目は、コンパイラとかOS?
0028デフォルトの名無しさん垢版2016/06/20(月) 20:58:16.94ID:amTC+NJd
schemeやらないとアルゴリズムとデータ構造を組み立てるってことがどういうことなのか、コードでわからないだろうな
0029デフォルトの名無しさん垢版2016/06/20(月) 21:06:41.52ID:taQ4Dh1l
>>28
javaでよくない?
0031デフォルトの名無しさん垢版2016/06/20(月) 21:29:28.84ID:1vrQKLsp
>>28

アルゴリズムとデータ構造の本に疑似コードが載っていることがあるけど、
Scheme風に書かれていることなど決してない。
0035デフォルトの名無しさん垢版2016/06/20(月) 22:43:48.30ID:zvz85rzc
31
そのSICPはschemeでかかれているわけで
昨今のライブラリ重視の観点からいえば、javaがいいっていうのはとおるけど、アルゴリズムかくのにjavaがいいってのは、センスないというか、お手入れ大好きなんだろうな
0038デフォルトの名無しさん垢版2016/06/22(水) 04:43:48.40ID:W4spe1mc
日立、新型半導体コンピュータの実用化に向けた前処理アルゴリズムを開発
http://news.mynavi.jp/news/2016/06/21/172/

新型半導体コンピュータの実用化に向けて、
要素間の複雑なつながりを規則的な構造に自動変換する前処理アルゴリズムを開発
http://www.hitachi.co.jp/New/cnews/month/2016/06/0621a.html

関連記事
日立、量子コンピュータに匹敵する性能の室温動作の新型コンピュータを試作
http://news.mynavi.jp/news/2015/02/23/121/
0039デフォルトの名無しさん垢版2016/06/22(水) 07:14:40.76ID:rmORGvIR
日本人の書いたアルゴリズムとデータ構造の本でまともなのって1冊もないの?
0041デフォルトの名無しさん垢版2016/06/22(水) 07:59:50.23ID:rmORGvIR
日本人の書いた本は薄っぺらくて説明も十分ではなく厳密でもなく網羅性もない本ばかりに思う。
0042デフォルトの名無しさん垢版2016/06/22(水) 08:00:26.15ID:rmORGvIR
杉原厚吉の本は特にひどいと思った。
0053デフォルトの名無しさん垢版2016/06/24(金) 11:47:43.21ID:hSLmnyaY
>>19
は?変なのはお前だ
プログラミングは最初から工学的だろ何言ってんだ?

そもそもお前は工学と科学を理解してないから可笑しなことを言うんだ
0054デフォルトの名無しさん垢版2016/07/15(金) 12:10:18.78ID:P21uCIN+
何ヶ月か前に近代科学社に電話でセジウィックアルゴリズムの第四版の翻訳の予定はありますか、と訊いてみたが無いって返事だったんだよな
書いて欲しいんだがな
0055デフォルトの名無しさん垢版2016/07/16(土) 08:00:53.05ID:Akpk7DL9
アルゴリズムさえ知ってりゃ動くプログラムは書けるから他は優先度低いと考えてた結果
データ構造すら分からない化石プログラマになってしまった

今必死にデータ構造とデザインパターン勉強中だけど、わかってくると楽しいね

アルゴリズムみたいにオーダー詰める楽しみはないけど…
0057デフォルトの名無しさん垢版2016/07/21(木) 23:06:49.37ID:TpMXx+Na
vEB木の「僕の考えた最強のデータ構造」感が大好きなんだが誰か共感してくれる人いる?
0058デフォルトの名無しさん垢版2016/07/22(金) 07:32:19.08ID:ot11jjQx
データ構造の基本は、以下の2つと、他にはハッシュがある

A → B → C → D
のように、メモリ上の位置がバラバラなオブジェクトを、リンクでつないでいくものと、
(シーケンシャルアクセス)

ABCD
のように、連続したメモリ位置に、オブジェクトやオブジェクトの参照が確保されていて、
単純な計算式で、各オブジェクトにアクセスできるもの(ランダムアクセス)

シーケンシャルは、リンクをたどるから、アクセスには時間がかかるけど、
要素の追加・削除では、リンクを付け替えるだけで、要素をずらさないから速い
0061スモモンガー垢版2016/09/23(金) 22:08:49.88ID:oKXONAGb
どうも、お久しぶりです。スモモンガーです。(誰って感じだと思いますがそれで結構です)
以前紹介したアルゴリズムですが、結局全然応用分野は見つかっておりません。
前回は画像処理分野を中心に解説しましたが今回はより簡単に実装ができる
探索分野に絞って動画を作ってみました。つたない動画で大変申し訳ございませんが
見てみていただけたら幸いです。特許などは取得しておりませんのでどうかご自由に
お使いください。長文失礼いたします。痛いのは承知なのですが応用分野を必死に
探しているのでどうかご協力よろしくお願いします。

https://youtu.be/5m3kPHO2w98

以上、どうぞよろしくお願いします
0064デフォルトの名無しさん垢版2016/09/24(土) 09:14:59.70ID:osPXZH57
>>61
最初の数分見ましたが..

1) 何の探索なの?最初は「探索」と聞いて「グラフかな?」とか思ったけど配列みたいだし、最初に想定される入力を明確にした方がいいですね

2) プレゼンが文章を読み上げてるだけでイメージが湧きにくい
1,4,10,20,25 …
の例ではイラストを用いた方がわかりやすいと思います

3) Kangaroo Method とはのスライドでデータがソートされていて、キーの差が (中略) バイナリサーチと同等の効率を .. とありますが、例では入力が完全にソートされているようです。これなら最初からバイナリサーチを使います

また、11m10s くらいのところで「Sinカーブは整ってる」とありますが、「整っている」の定義がよくわかりません。その後の例も見ましたが、どのくらいまで途中に想定されていないデータが混じっていても許容範囲なのかが不明です

4) 先に長所短所のスライドを持ってきて、擬似コードとオーダーも明記し、「一部ソートされてなくても O(logn) で探索できます」みたいなのを書いて、見ている人を「それならもうちょっと続きを見てみようか」みたいな気にさせられればもっといいですね

以上、感想でした
0065デフォルトの名無しさん垢版2016/09/24(土) 09:32:41.92ID:n5/uj8Su
64さん。ありがとうございます。私はこういうスライドを作る機会があまりないのでこんな形になってしまいました。
実は整っているという抽象的な単語を使っていますが、実は定量的にこれを測る方法はまだ思いついていません。
そのほかのご指摘はその通りだと思います。
貴重なご意見ありがとうございます
0068デフォルトの名無しさん垢版2016/09/24(土) 09:55:26.18ID:n5/uj8Su
>>66
まず目的のキーと現在探索中のキーの差をとる。
それを隣接するキーの最大値で割る。
その値だけ進む。

まあ、原理は単純なアルゴリズムです
0069デフォルトの名無しさん垢版2016/09/24(土) 10:46:59.06ID:iZTaxfZT
>隣接するキーの最大値

これをあらかじめ求めておかなきゃならんってのが一番のネックだな。
一般のデータに対する探索だと、バイナリサーチと比較したメリットと言っていたものの大半が消し飛んでしまう。
0070デフォルトの名無しさん垢版2016/09/24(土) 10:49:01.89ID:9ZsTQHH6
>>61
印象としては
1. 要素間の差の最大値を求めるのに線形時間
2. 各要素の値の差が一定でないと性能を発揮しない(最大値を求めるのも含め)
3. 探索の最悪時間が線形時間、恐らく平均も線形時間
4. ソートされていなくても探索可能な条件が不明瞭
5. データの内容に探索コストが大きく左右される

例えば
1 2 4 9 15 24 100 120 1002 1225
とあった時、差の最大値は
1002-120=882
1002を探索すると
1002-1=1001, 1001/882=1
1002-2=1000, 1000/882=1
1002-4=998, 998/882=1
1002-9=993, 993/882=1
...
と線形時間になる(やり方あってるよね?)
演算している分、比較だけの線形探索より処理速度が遅くなる
0071デフォルトの名無しさん垢版2016/09/24(土) 11:09:23.58ID:n5/uj8Su
>>69
>>70
確かにキーの最大値を求めるのは線形時間かかります。なのであらかじめ、隣接するキーの最大値が分かっているデータに使用可能です。
探索の最悪時間は線形時間ですが、平均時間はlogのオーダーになるのではないでしょうか。私が不勉強なもので理論的には、示めせませんが多分logのオーダーになると思います。
ソートしなくても探索できるのは差の絶対値を取るからです。動画に入れるのを忘れました。すいません。
計算についてはそれであっています。わざわざご指摘ありがとうございます
0072デフォルトの名無しさん垢版2016/09/25(日) 01:17:16.51ID:MeFnEkA4
>>71
上でも指摘されているが整っているの定義が不明
二分探査の場合は、存在しないこともlog n で確認可能だが、この手法は整っているの定義次第では存在しない者の確認が非常に時間かかる(ソートされている場合は存在するものと同等だが、そうすると二分探索よりも利点が少なくなる)
平均計算量を求めるのはちと難しそうだけど、格納される値の値域に依存するかな
たぶん、log n 程良くはないと思う
0073デフォルトの名無しさん垢版2016/09/25(日) 09:29:52.06ID:byM8xGto
>>72
ご指摘ありがとうございます。確かに整っているの定義ができていないのが一番の難点ですよね。いつか勉強して考えたいと思います
0074デフォルトの名無しさん垢版2016/09/25(日) 12:26:29.96ID:3wiQalb8
>>67
ごめん
みたけど
だめだこりゃ
0075デフォルトの名無しさん垢版2016/09/25(日) 12:52:11.14ID:NTqjAG/u
>>71
各要素間の差が一定であればO(1)、当たり前だけど、これは計算で求まる
各要素間の差の分布数が要素数に近づき、尚且つその落差が激しい場合
著しく線形時間になる

で、探索したい数値と差の最大値の商が1だった場合
その探索したい数値がある位置以下の数値探索はO(n)になる
データ列の後半に行くほど1回の演算で要素をステップする数が増えるけど
その移動は微々たるもの
データ列の内容に左右されることを差っ引いても、O(log n)からは程遠いと思う
詳しい計算は出来ないが、これを線形時間としても無理はないと思う

参考として
0 1 3 6 10 15 21 28 36 45
このデータ列では、15以下の探索はO(n)、
21は5回、28は4回、36は4回、45は3回の演算

結論として
このアルゴリズムの最大の欠点は差の最大値が必要な事を含めて
データ列の内容に左右されてしまうことだな
この手のアルゴリズムはデータの外側にあるべきだな
0077デフォルトの名無しさん垢版2016/09/26(月) 13:42:01.27ID:ymOrEJcI
>>61
すもモンがnewton法をガチで知らないのであればnewton法をまず勉強するべき
カンガルーの敵はバイナリではなくnewtonだ
0078スモモンガー垢版2016/09/26(月) 20:32:40.67ID:7l1kSKga
確かにデータ間の差に一様離散分布を使ったのは公平ではなかったです。
なので、データを完全にランダムにして調べてみました。
データはCのrand()%1000000で10000個生成しソートして、
探索の時配列のうちランダムな値を探すキーとし間を線形探索、カンガルー法
バイナリサーチで100回比べてみました。
その結果線形探索では平均比較回数約4963回最大比較回数は9972回でした
カンガルー法は平均比較回数約70回 最大比較回数は111回でした。
バイナリーサーチはやはり一番はやく、平均比較回数約12回、最大比較回数は14回でした
皆さんがご指摘の通りやはりバイナリーサーチが一番はやいようです。
ただ、例えばKMP法が逆行がないから使われているようにカンガルー法も逆行がないので
使うことはできないでしょうか?もし、とんちんかんなこと言ってたらすいません。
0079デフォルトの名無しさん垢版2016/09/26(月) 20:37:55.45ID:7l1kSKga
>>74
www確かにそうかもしれませんね。
>>77
一応私はニュートン法については知っています。Newton法は求める関数の微分した値を
しっていなければならないとおもうのですが、現実の探索だと関数が微分できないことも
多いかと思います。ちょっと、私が使った例が悪くてsinカーブや円を使ったのがよく
なかったのかもしれません。整っていてソートされていないデータとして扱いやすかったので
sin関数を使ったのであってとくにデータが微分可能である必要はありません。円と
Y切片の交点も中学生でも二次方程式ときゃいいのでもっと簡単にできますが、本来は
多角形とさまざまな図形の交点を探るアルゴリズムです。円を使ったのは例をわかりやすく
したかったからです。
0080デフォルトの名無しさん垢版2016/10/16(日) 18:51:48.49ID:LqkHCFhg
状態遷移ってどういうステータス持てばいいの?

A と B のステータスがあって、お互いが切り替わるのに n秒 かかる
切り替わりに失敗したら切り替えをリトライする
AはBになろうとし、BはAになろうとする

というとき、A と B のほかに AからBになるのを待ってる状態と
BからAになるを待ってる状態の 2つがさらに状態として必要?
過渡状態も状態?
0081デフォルトの名無しさん垢版2016/10/17(月) 07:56:46.27ID:TukeUWYl
>>80
システムの設計次第。
切り替え中、待ち中が状態として存在するのならプログラムでも状態にすればいい
0084デフォルトの名無しさん垢版2016/10/17(月) 21:23:44.83ID:sc7L52q+
辛かろうが状態が存在するのならしょうがあるまい。
あるいは遷移をアトミックにして遷移中状態そのものを無くすか、遷移中の動作を共通化
できるなら遷移先をパラメータ化して「*への遷移中」という1状態にしてしまうとか。
0086デフォルトの名無しさん垢版2016/11/05(土) 20:41:10.12ID:PXYcOtjJ
ポリモーフィックなクラスの相互作用において特定の型の組み合わせの場合のみ処理を特殊化したい場合はどうすればいいのだろう?

x = xFactory.create(...);
y = yFactory.create(...);

if(x.typeCode() == X.Foo && y.typeCode() == Y.Hoge)
executeSpecial((Foo) x, (Hoge) y);
else if (...)
...
else
executeNormal(x, y);
0087デフォルトの名無しさん垢版2016/12/12(月) 23:13:40.61ID:IcWOSn01
デザインパターンを使って実装すると、年長プログラマーから、またこんなことしやがって的な拒否反応が帰ってくるんだがどうすれば
0092デフォルトの名無しさん垢版2016/12/13(火) 18:53:42.04ID:MUcELcjh
下手くそがデザインパターンとか使うと逆にこんがらがるからなぁ
老害とどっこいどっこいだろ
0093デフォルトの名無しさん垢版2016/12/13(火) 21:32:18.83ID:lYWHr0pJ
マルチスレッドで、なんの考えもなくオブザーバー使いまくられて、データ破壊しまくられた時には、本気で殺意を抱いたよ
0094デフォルトの名無しさん垢版2016/12/16(金) 15:12:11.72ID:kO0vFktz
『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』

の優先度付きキューについてのプログラムについて質問です。

p.241の heapIncreaseKey(A, i, key) という関数内で、

「if key < A[i] エラー:新しいキーは現在のキーより小さい」

というのがあります。

これがなぜ必要なのかが分かりません。

insert(key) を見れば分かるように、この本の使われ方では、
key < A[i] になることは決してありません。

よろしくお願いします。
0096デフォルトの名無しさん垢版2016/12/17(土) 16:05:18.68ID:lvQHWty7
完成形をいきなり見てると不思議に思うよね。
でも実際には作成中のバグを考慮して、最初にチェックを入れておくもんなんだよね。
まあ、一言で言えばassertなんだけど。

ただ、作業やデバッグ用には必須であっても、その本の例示として必要か?と言われれば、確かにいらない気がする。
0097デフォルトの名無しさん垢版2016/12/17(土) 16:09:26.93ID:GDWdcO6h
>>95-96

『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』の参考文献に
挙げられている『アルゴリズムイントロダクション』を見てみたら、全く同じプログラム
が載っていました。

完全にパクっていますね。

>>96
デバッグ用にどうして必要なのかが分かりません。

『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』はお持ちでしょうか?
もし、お持ちでないようでしたら該当箇所の画像をアップロードします。
0101デフォルトの名無しさん垢版2016/12/17(土) 18:12:28.79ID:rDdwnYMe
>>97
他の本も読んでみるとわかると思うけど、プライオリティキューを二分木ヒープで実装するのは定番で、どの本でも大体同じことが書いてある
0102デフォルトの名無しさん垢版2016/12/17(土) 19:29:55.59ID:GDWdcO6h
>>98

「if key < A[i] エラー:新しいキーは現在のキーより小さい」

というのが、デバッグ用であるとは思えないのですが、これは一体何なんでしょうか?

heapIncreaseKey(A, i, key) を何か別の用途に使う場合があって、そのときに必要に
なるのならば納得しますが。
0103デフォルトの名無しさん垢版2016/12/17(土) 19:31:29.47ID:GDWdcO6h
>>101

「if key < A[i] エラー:新しいキーは現在のキーより小さい」

という意味不明のコードも『アルゴリズムイントロダクション』のプログラムには
書いてあります。

こんな余計なコードは普通は入れないと思います。

完全にパクりだと思います。
0104デフォルトの名無しさん垢版2016/12/17(土) 19:35:00.61ID:a9hyyPvt
>>103
参考文献に書いてあるんだからパクリも糞も無い罠
参考文献に書き漏れたら小保方さんみたいに突っ込まれるが
0105デフォルトの名無しさん垢版2016/12/17(土) 19:35:29.11ID:GDWdcO6h
『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』の
他のプログラムもおそらくすべて『アルゴリズムイントロダクション』の
プログラムをそのまま使っています。

恥を知れと言いたいです。
0106デフォルトの名無しさん垢版2016/12/17(土) 19:36:34.73ID:GDWdcO6h
参考文献に文献を挙げれば何でも許されるということはないと思いますが。
0107デフォルトの名無しさん垢版2016/12/17(土) 19:39:42.80ID:GDWdcO6h
『アルゴリズムイントロダクション』のほうをよく読んでいませんが、

「if key < A[i] エラー:新しいキーは現在のキーより小さい」

というのも『アルゴリズムイントロダクション』のほうでは意味があるのかもしれません。

それをそのまま何も考えずにコピペしたために、意味不明なことになっているのかも
しれません。

>>98

を見て、誰か納得のいく説明ができるでしょうか?

意味不明としか言えないかと思います。
0108デフォルトの名無しさん垢版2016/12/17(土) 19:42:21.87ID:C/wQAZQ3
『アルゴリズムイントロダクション』のほうをよく読んでいませんが、
『アルゴリズムイントロダクション』のほうもまたどっか別の本からのパクリの悪寒。
0110デフォルトの名無しさん垢版2016/12/17(土) 19:57:50.69ID:rDdwnYMe
ID:GDWdcO6h は何をそんなに怒ってるの?
問題が解けなくてイライラしてるだけ?

どんな本も参考文献があり、どんなアルゴリズム、データ構造も元をたどれば最初に「ヒープで実装すればうまく行くぞ!」と発見した人の論文があるはず

新しい本を書くときは参考文献よりもわかりやすくなるように、説明やイラスト、擬似コードを変えたり、あるいは同じものを流用することもあるだろう
0112デフォルトの名無しさん垢版2016/12/18(日) 00:45:20.51ID:aCKcGLhu
プログラミングコンテスト攻略のための、
アルゴリズムとデータ構造、渡部有隆(わたのべ ゆたか)、2015
Ozy(協力), 秋葉 拓哉(協力)

Aizu Online Judge(AOJ、会津大学)

プログラミング・コンテスト・チャレンジブック、第2版、2012
秋葉 拓哉, 岩田 陽一, 北川 宜稔

元々は、3人の東大大学院生が作った、チャレンジブックが大ヒットした。
今までは、こういうコンテストの問題を研究した本が無かった

一方、すでに海外では、TopCoder, Google Code Jam などが、
プログラマーの主戦場となっていて、日本では、AOJ が後を追っている状態

渡部有隆の本は、チャレンジブックの後に出した。
協力に、秋葉 拓哉の名前もある

プログラマ脳を鍛える数学パズル
シンプルで高速なコードが書けるようになる70問、増井 敏克、2015

一方、増井は、Rubyで解く、このパズル本で、
「ITエンジニアに読んでほしい!技術書・ビジネス書 大賞(ITエンジニア本大賞)」を受賞している
0113デフォルトの名無しさん垢版2016/12/18(日) 00:49:54.79ID:VFzWAIXP
めんどくさ
0114デフォルトの名無しさん垢版2016/12/18(日) 01:14:58.25ID:aCKcGLhu
漏れも、JavaScriptで、2分ヒープ(BinaryHeap)を実装したので、参照して
http://jsdo.it/michihito/bGH5

2分ヒープは、優先度つきキュー (順位キュー、priority queue)や、
ダイクストラ法 (Dijkstra's Algorithm)で使う

配列の[0]は使わない。[1]から始めると計算が楽
親1, 左右の子は2, 3で、親n, 子2n, 2n+1

プログラミング・コンテスト・チャレンジブックでは、[0]から始めていますが、
もし[0]から始めると、
親0, 左右の子は1, 2で、
親1, 左右の子は3, 4で、
親n, 子2n+1, 2n+2、となり複雑だから
0115デフォルトの名無しさん垢版2016/12/18(日) 01:56:35.37ID:05Ug+E6t
>>114
汚すぎるコードだ。なんだろう。初心者とも違うな。
まるで20年ぐらい前から成長してない人が書いたコードのようだ。
0116デフォルトの名無しさん垢版2016/12/18(日) 02:12:34.14ID:KR24tnjc
>>115
ド素人と丸出しの感想文だな
0117114垢版2016/12/18(日) 04:57:12.61ID:aCKcGLhu
すまぬ

JavaScriptも、よく知らずに書いたのだw
本当は、== ではなく、型も一致する厳密等価演算子、=== を使うべきだろう

まあ、JSなどで、とても開発はできない。
Haxe で書き直せばよいのだろうが

Kotlin, Electron やら何やら、最近の言語に、ついていけてないw
0118デフォルトの名無しさん垢版2016/12/18(日) 08:19:04.80ID:05Ug+E6t
> 本当は、== ではなく、型も一致する厳密等価演算子、=== を使うべきだろう
そういうレベルじゃない。

無駄なロジック、意味不明な変数名、多すぎるコメント、
コードの意味を何一つ分かってないとしか思えないといってんの
0119デフォルトの名無しさん垢版2016/12/18(日) 11:08:48.21ID:7J/3tpZx
俺はむしろここ
> このソースコードのライセンスは、MIT License です
> Original Copyright (c) 2014 Michihito Seto All Rights Reserved.
残飯を神棚に飾るが如く宣言
ここにこそ初心者らしさが凝縮されてる
0120デフォルトの名無しさん垢版2016/12/18(日) 11:50:21.36ID:5nrc1ooF
>>114

『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』の

「if key < A[i] エラー:新しいキーは現在のキーより小さい」

というのは意味があるのでしょうか?
0121デフォルトの名無しさん垢版2016/12/18(日) 11:50:54.72ID:05Ug+E6t
jsdo使ってるやつって汚いコードが多いよな。
素人が使いたくなる機能でもあんのか?
ブラウザだけで開発ができるとか?
0122デフォルトの名無しさん垢版2016/12/18(日) 11:53:36.61ID:5nrc1ooF
デバッグなど必要のないくらい簡単なコードなので、デバッグ用とは考えられないかと思います。
0124デフォルトの名無しさん垢版2016/12/18(日) 12:12:58.36ID:5nrc1ooF
Introduction to AlgorithmsよりもAlgorithms(Sedgewick、赤い本)のほうがいい本ですね。

読んでいて楽しい。
0125デフォルトの名無しさん垢版2016/12/18(日) 12:18:23.69ID:5nrc1ooF
日本語のデータ構造とアルゴリズムの本だと、茨木の本が有名だけど、
どこがいいのかさっぱりわからない。

翻訳書ではない日本語の本でまともなのは、浅野孝夫の本くらいではないでしょうか?
0126デフォルトの名無しさん垢版2016/12/18(日) 12:18:30.80ID:d5jVhhWj
アルゴリズムやコードのライセンスってどの程度のものから付けていいんだ
あんまり簡単なものだと既出すぎてライセンス付けられるのか?って考えてしまう
かといってじゃあライセンス付けていい最低ラインは何なんだという話になる
0127デフォルトの名無しさん垢版2016/12/18(日) 12:20:00.87ID:5nrc1ooF
>>126

ライセンスとか書いてあっても一部だけコピペして利用したら、分からないですよね。

どうやって、だれかのコードを流用したか判定するのか、それに興味があります。
0128デフォルトの名無しさん垢版2016/12/18(日) 12:30:54.60ID:RB5DyRP2
アルゴリズムには著作権ないよ
あるのはそれをどう表現したか
簡単なアルゴリズムには表現バリエーションなんて限られてるから
ある程度似るのはどうしようもない
0129デフォルトの名無しさん垢版2016/12/18(日) 12:37:57.44ID:5nrc1ooF
特許ならありますよね。
0130デフォルトの名無しさん垢版2016/12/18(日) 13:02:47.44ID:PELrVlNw
デザインパターンの本高い・・・
一冊持ってたけど引っ越しのごたごたでなくしちゃった
無料で網羅できるサイトありませんかね
一冊読んではあるので、さらっと構造や仕組みを紹介してくれていればいいし
英語もある程度は読めます

基本のデザインパターンだけでもありがたいし
マルチスレッド対応に踏み込んだサイトならなおありがたいです
0131デフォルトの名無しさん垢版2016/12/18(日) 13:22:26.46ID:d5jVhhWj
基本的な考え方覚えたら幾らでも応用できるだろ
カタログを後生大事にとっておく意味はない
0132デフォルトの名無しさん垢版2016/12/18(日) 13:35:15.82ID:PELrVlNw
覚えてないんすよ
記憶力ないんで忘れちゃって、ぼんやりとしか覚えてないんです
だから概要をしっかり覚え直したいなと思って
0133デフォルトの名無しさん垢版2016/12/18(日) 13:42:55.97ID:+dKTlaSP
>>132
いや、デザパタ本こそ手元においておくべき
わけのわからん二次情報を見るとどんどんブレていくぞ
0135デフォルトの名無しさん垢版2016/12/18(日) 13:45:12.43ID:5nrc1ooF
ソフトウェア工学的な本って重要なんですか?
0136デフォルトの名無しさん垢版2016/12/18(日) 13:45:59.00ID:5nrc1ooF
学問的には全く面白くない分野ですよね。
0138デフォルトの名無しさん垢版2016/12/18(日) 15:45:37.97ID:VFzWAIXP
デザパタカタログは便利だよね
煮詰まったときに、休憩がてらパターンを眺めてると、閃くときがある
0140デフォルトの名無しさん垢版2016/12/18(日) 18:22:27.13ID:d5jVhhWj
基本的な発想を学んだらカタログはポイ
パターンに執着してもデザインがぎこちなくなるだけ
0141114垢版2016/12/18(日) 23:03:56.86ID:aCKcGLhu
>>119
jsdo.it では、全員のソースコードが、サイト内に限り、MITになる

漏れが、わざわざ、MITと書いておいたのは、サイト外でも使ってほしいという意味。
学生が勉強することも多いから、コメントも一杯書いた

2分ヒープ、AVL、赤黒木など、アルゴリズムの実装は、どうしても汚いソースコードになる
0143デフォルトの名無しさん垢版2016/12/18(日) 23:11:21.17ID:5nrc1ooF
2分ヒープって簡単なアルゴリズムですよね。

汚くなりようがないように思うのですが。
0144デフォルトの名無しさん垢版2016/12/18(日) 23:12:19.64ID:5nrc1ooF
計算幾何学って難しい割に見返りが少ないように思います。

だからあんまり人気がないのかもしれないですね。
0148デフォルトの名無しさん垢版2016/12/19(月) 12:42:11.26ID:z9XVuDpo
>>144
理論的な上限値をあらかじめ計算することが出来て
無駄な努力や試行錯誤をしなくて済むというメリットがあるよ
0149デフォルトの名無しさん垢版2016/12/19(月) 17:37:02.75ID:ic0p/3Yf
長さnの整数からなる列(a_1 ,a_2, ..., a_n) があるとして、列の大きさを
|a_1|+...+|a_n|で定義します。、
大きさがmの任意の列を大きさm-1の列の中の一つの値だけ1違う
列一つに対応させたいんですけど
対応のさせ方がわかりません、教えてください。
例えば n=3のとき(1, -1, 1)は大きさが3で、これに対応する長さ2の列は
(0 ,-1 ,1), (1,0,1),(1,-1,1),(1,-1,0)とかあるので一つには定まってません。
なのでその対応をする関数をおしえてください。
0150間違ってたので直します垢版2016/12/19(月) 17:39:59.34ID:ic0p/3Yf
長さnの整数からなる列(a_1 ,a_2, ..., a_n) があるとして、列の大きさを
|a_1|+...+|a_n|で定義します。、
大きさがmの任意の列を大きさm-1の列の中の一つの値だけ1違う
列一つに対応させたいんですけど
対応のさせ方がわかりません、教えてください。
例えば n=3のとき(1, -1, 1)は大きさが3で、これに対応する大きさ2の列は
(0 ,-1 ,1), (1,0,1),(1,-1,0)とかあるので一つには定まってません。
なのでその対応をする関数をおしえてください。
0152デフォルトの名無しさん垢版2016/12/19(月) 17:53:09.70ID:yHCszZUX
>なのでその対応をする関数をおしえてください。

意味不明です。
0153デフォルトの名無しさん垢版2016/12/19(月) 17:55:40.11ID:yHCszZUX
(a_1, a_2, ..., a_i, ..., a_n)

a_i > 0 のときには、

(a_1, a_2, ..., a_i-1, ..., a_n)

a_i < 0 のときには、

(a_1, a_2, ..., a_i+1, ..., a_n)

a_i = 0 のときには、

(a_1, a_2, ..., a_i±1, ..., a_n)

を返せばいいのでは?
0154デフォルトの名無しさん垢版2016/12/19(月) 17:57:14.37ID:yHCszZUX
(a_1, a_2, ..., a_i, ..., a_n)

a_i > 0 のときには、

(a_1, a_2, ..., a_i-1, ..., a_n)

a_i < 0 のときには、

(a_1, a_2, ..., a_i+1, ..., a_n)

を返せばいいのでは?

a_i = 0 のときには、条件を満たす列は存在しないね。
0155デフォルトの名無しさん垢版2016/12/19(月) 17:58:07.65ID:yHCszZUX
>>150

何がやりたいのかが不明確。
0157デフォルトの名無しさん垢版2016/12/19(月) 18:01:17.72ID:yHCszZUX
>例えば n=3のとき(1, -1, 1)は大きさが3で、これに対応する大きさ2の列は
>(0 ,-1 ,1), (1,0,1),(1,-1,0)とかあるので一つには定まってません。
>なのでその対応をする関数をおしえてください。

一つに定まらないから、すべての結果を返したいのか、
任意の一つの結果を返したいのか?
0158デフォルトの名無しさん垢版2016/12/19(月) 18:02:09.41ID:yHCszZUX
明らかに、

(0, 0, ..., 0) に対しては条件を満たす結果は存在しないね。
0160デフォルトの名無しさん垢版2016/12/19(月) 18:57:02.98ID:ic0p/3Yf
>>154
a_2を1としたとき(-1, 1)のとき(-1,0)を返し
a_1を-1としたとき (-1,1)は(0,1)をかえすことになるので
一つに定まりません
0161デフォルトの名無しさん垢版2016/12/19(月) 19:06:19.22ID:ic0p/3Yf
>>157
大きさn>0の任意の列aにたいしてf(a)=bでbがn-1の大きさでaと列の中の値が1だけ違う
列を出力する関数fを求めるということです。
0162デフォルトの名無しさん垢版2016/12/19(月) 19:13:51.38ID:ic0p/3Yf
>>156
初めはそんな風に考えてる時期もありました
もう2か考えてるけれど全然わからないのでここで質問してみました
0167デフォルトの名無しさん垢版2016/12/19(月) 19:47:31.40ID:hSWjQy3F
>>166
Mateだと>>156って書いてあるわ
自分の中ではこれは当然みたいな条件がいろいろあるんだろうけど、それを人に説明するのが下手なんじゃね
0171デフォルトの名無しさん垢版2016/12/19(月) 20:25:56.12ID:ic0p/3Yf
課題という証拠はありますか?
実際課題じゃなくプログラミングしていたら出てきた問題なので
全然課題じゃないです
0172デフォルトの名無しさん垢版2016/12/19(月) 20:33:03.53ID:ic0p/3Yf
>>170
あなたには誤った文を訂正する能力がないんですか?
それでは人間ではなくコンパイラーと同じですよ
0173デフォルトの名無しさん垢版2016/12/19(月) 20:37:51.17ID:ic0p/3Yf
>>169
面白い問題とつまらない問題を区別する能力が数学的推測には
一番必要なんんです
この問題がつまらないと思うのなら解かないでいいです
0175デフォルトの名無しさん垢版2016/12/19(月) 20:52:23.54ID:2q/Y95iw
あと、面白い問題だと思うなら、それこそ自分で解くのが楽しいのでは
ここで聞かずに
0177デフォルトの名無しさん垢版2016/12/19(月) 21:44:43.60ID:ic0p/3Yf
>>174
今読み返してみましたがキチンと書かれてますよ
どこがキチンと書かれてないのか言ってくれたら
それは理解力の無さなので説明してもいいです
0180デフォルトの名無しさん垢版2016/12/19(月) 23:04:39.12ID:L2gIhLeK
先頭から非0を探して、はじめの要素が正なら1ひく、負なら1足す
これで終わりじゃないの?
0182デフォルトの名無しさん垢版2016/12/20(火) 13:05:59.52ID:lAXr92yw
>>171
茶か尿かもう判らんって意見があるけど
検出時のガスクロのデータ見直したら判るはずという話がある
仮にそれでお茶だとしてももう発表はないだろう
0183デフォルトの名無しさん垢版2016/12/21(水) 18:35:54.54ID:UR5SKYPV
数列 1, 2, 3, …

すなわち、

数列 {a_n} = {n}

を考える。

{a_n} の任意の連続する有限部分列を a_k, a_(k+1), …, a_l(k ≦ l)とする。

各 i(k ≦ i ≦ l)に対して、0以上の整数 b_i を以下で定義する:

「2^(b_i) は a_i を割り切るが、 2^(b_i+1) は a_i を割り切らない」

このとき、 #{m | k ≦ i ≦ l である任意の i に対して、 b_i ≦ b_m} = 1 であることを示せ。

また、有限部分列 a_k, a_(k+1), …, a_l(k ≦ l)が与えられたとき、 k ≦ i ≦ l である
任意の i に対して、 b_i ≦ b_m となるような m を求めるプログラムを作れ。
0186デフォルトの名無しさん垢版2016/12/21(水) 19:41:25.65ID:UR5SKYPV
早くも降参宣言か。
0188デフォルトの名無しさん垢版2016/12/21(水) 20:06:55.96ID:UR5SKYPV
>>187

一意的です。そこがちょっと面白いところです。

反例を作ろうと思ってもできないはずです。
0191デフォルトの名無しさん垢版2016/12/21(水) 20:16:47.08ID:UR5SKYPV
>>190

{a_n} の任意の*連続する*有限部分列を a_k, a_(k+1), …, a_l(k ≦ l)とする。
0192デフォルトの名無しさん垢版2016/12/21(水) 20:18:48.11ID:UR5SKYPV
k=1, l=2で、{m}={2,4,6,8,...}
k=l=1で、{m}=自然数の集合
じゃないの?

a_1, a_2 = 1, 2

なので、 b_1, b_2 = 0, 1

です。

なので、 {m} = {2} です。
0193デフォルトの名無しさん垢版2016/12/21(水) 20:19:15.67ID:UR5SKYPV
>>191
は勘違いです。
0194デフォルトの名無しさん垢版2016/12/21(水) 20:20:14.23ID:UR5SKYPV
a_1 = 1

なので、

b_1 = 0

です。

なので、

{m} = {1}

です。
0198デフォルトの名無しさん垢版2016/12/21(水) 20:32:03.58ID:UR5SKYPV
b_m は b_i の最大値です。

その最大値となる b_m の m が一意的であるということです。
0200デフォルトの名無しさん垢版2016/12/21(水) 20:34:06.08ID:UR5SKYPV
テレンス・タオ ルベーグ積分入門
テレンス タオ
固定リンク: http://amzn.asia/8KaL6NK

「日本の理工系学部ではルベーグ積分は3年次程度の必修相当科目なので、」

↑これっておかしくないですか?

普通、ルベーグ積分なんてやるのは数学科かせいぜい物理学科くらいじゃないですか?
0201デフォルトの名無しさん垢版2016/12/21(水) 20:34:58.70ID:UR5SKYPV
>>199

各 i(k ≦ i ≦ l)に対して、0以上の整数 b_i を以下で定義する:
0203デフォルトの名無しさん垢版2016/12/21(水) 20:41:22.47ID:UR5SKYPV
>>202

不完全なところはありません。
よく問題文を読んでください。
0207デフォルトの名無しさん垢版2016/12/21(水) 20:47:08.96ID:UR5SKYPV
>>206

>>183
各 i(k ≦ i ≦ l)に対して、0以上の整数 b_i を以下で定義する
0208デフォルトの名無しさん垢版2016/12/21(水) 20:52:23.64ID:RIWp4Ngq
そうだとして、わざと誤読を誘おうとしている悪問だね
でO(log k)のアルゴリズム思いついたから俺は降りるね
0210デフォルトの名無しさん垢版2016/12/21(水) 20:55:14.58ID:UR5SKYPV
>>183

の解答は以下です。

http://imgur.com/rAnp3Ga.jpg

赤線を引いたところは「odd」が正しいですね。
0211デフォルトの名無しさん垢版2016/12/21(水) 21:27:34.73ID:UR5SKYPV
実は、この問題には続きがあります。

m, n を m < n を満たす正の整数とします。

このとき、

1/m + 1/(m+1) + … + 1/n

は整数にはならないことを証明せよ。
0212デフォルトの名無しさん垢版2016/12/21(水) 21:29:28.61ID:UR5SKYPV
ちょっとアルゴリズム的な問題からは離れますが。
0216デフォルトの名無しさん垢版2016/12/23(金) 00:59:54.04ID:gOElNe3R
>>183
そのような m が 2 個ある
m1 < m2
とする

m1 の下位ビット 0 〜 n-1 までは 0で、 ビット n が 1 とする
m2 も同様になる(すなわち b_m1 = b_m2 = n )

m3 = m1 + ( 2 の n 乗 )

と定義すると
m1 < m3 <= m2 であるが、b_m3 > n となって矛盾
0217デフォルトの名無しさん垢版2016/12/23(金) 01:37:11.09ID:gOElNe3R
>>211
1/m + 1/(m+1) + … + 1/n = P = 整数
だとする

L = ∏ r ; r = m…n
を両辺に掛ける

L/m + L/(m+1) + … + L/n = LP

すべての項は整数。

b_LP ( LP の連続する下位ビット 0 の個数 ) >= Σ b_r ; r = m…n

m <= x <= n は b_x を最大にするもの
左辺の L/x だけ連続する下位ビット 0 の個数は他より少ない
よって b_左辺 = b_x で矛盾
0218デフォルトの名無しさん垢版2017/01/01(日) 00:15:18.27ID:VtFWW7J2
ダイクストラのアルゴリズムの正しさの証明が載っている本で
一番分かりやすい本を教えてください。
0219デフォルトの名無しさん垢版2017/01/02(月) 07:40:19.35ID:03PPbeGI
『アルゴリズムイントロダクション』について質問です。

この本での実数の集合には、 ∞, -∞ が含まれるのでしょうか?

最短路問題の説明で、

実数 a が a≠∞のとき、 a + -∞ = -∞
実数 a が a≠-∞のとき、 a + ∞ = ∞

という記述があるために質問します。
0220デフォルトの名無しさん垢版2017/01/02(月) 08:09:15.65ID:03PPbeGI
実数 a が a≠∞のとき、 a + -∞ = -∞
実数 a が a≠-∞のとき、 a + ∞ = ∞

-∞ + -∞ = -∞
∞ + ∞ = ∞

という等式を含めたいからこのような書き方になったのでしょうか?
0221デフォルトの名無しさん垢版2017/01/02(月) 09:29:22.45ID:J77W/v0L
それは実無限派の書き方だが,世の趨勢は可能無限
ほどほどに相手をするだけでいいよ
0222デフォルトの名無しさん垢版2017/01/02(月) 11:22:57.42ID:03PPbeGI
>>221

ということは、『アルゴリズムイントロダクション』での実数の集合の定義には、
∞、-∞ が含まれるというk十ですね。
0223デフォルトの名無しさん垢版2017/01/02(月) 11:23:39.72ID:03PPbeGI
頂点の数が n のグラフで、任意の頂点間に辺が存在するようなものを考える。

ある任意の頂点から別の任意の頂点への閉路をふくまない経路の数を求めよ。
0224デフォルトの名無しさん垢版2017/01/02(月) 11:26:14.49ID:03PPbeGI
頂点の数が n(≧2) のグラフで、任意の頂点間に辺が存在するようなものを考える。

ある任意の頂点から別の任意の頂点への閉路をふくまない経路の数を a_n とする。

このとき、

(n-1)! ≧ a_n ≧ (n-2)!

が成り立つことを示せ。
0227デフォルトの名無しさん垢版2017/01/02(月) 12:22:39.27ID:03PPbeGI
宿題ではないのです。

ある本に、頂点 s から t への最短経路を計算する方法として、
s から t へのあらゆる経路の長さを考えて、最小の経路を選ぶとすると、
経路の数が O(n!) だから現実的ではない

という話が書いてあります。

ところが、計算してみると、 O(n!) は荒い評価であって、 O((n-1)!) とできますね。
0228デフォルトの名無しさん垢版2017/01/02(月) 12:24:22.04ID:03PPbeGI
もっといい評価はありますでしょうか?
0230デフォルトの名無しさん垢版2017/01/02(月) 14:08:15.59ID:03PPbeGI
ダイクストラ法の正しさの証明で分かりやすい証明を思いつきました。

発表しましょうか?
0232デフォルトの名無しさん垢版2017/01/02(月) 14:27:23.53ID:yIXUnWg3
>>227
オーダーについてあんま良くわかってないんだろうけどO((n-1)!) なんて書き方はないよ
もし書いたとして、それはO(n!)と同じもの
0233デフォルトの名無しさん垢版2017/01/02(月) 17:55:38.72ID:J77W/v0L
>>222
実無限はいろいろ破綻するから可能無限にしておいたほうがいいよ
実数の定義に∞, -∞は入らない
というか,そもそも -∞ というのがおかしい存在

つリーマン球面
0234デフォルトの名無しさん垢版2017/01/02(月) 19:04:30.86ID:03PPbeGI
なんか正しさの証明を書いてみると簡単なことなのに長くなりますね。
もし、間違っていたら指摘してください。

http://imgur.com/PDx2vmZ.jpg
http://imgur.com/DbMiSz5.jpg

ダイクストラのアルゴリズムは↑のものとします。
0235デフォルトの名無しさん垢版2017/01/02(月) 19:05:18.10ID:03PPbeGI
節点 s から、ある節点 i への最短経路が存在するとき、その長さを td(i) で表わすことにする。
i への経路、したがって最短経路が存在しないときには、 td(i) = ∞ とする。

ステップ(1)で選ばれる節点 v ∈ V - S に対して、 d(v) = td(v) が成り立つことを数学的帰納法により、以下で証明する。

最初にステップ(1)が実行されるときを考える。
明らかに、 d(s) = td(s) = 0 が成り立つ。

k ≧ 1 とする。
第 1 回目から第 k 回目にステップ(1)が実行されるときに、いつもステップ(1)で選ばれる節点 v ∈ V - S に対して、
d(v) = td(v) が成り立つと仮定する。
0236デフォルトの名無しさん垢版2017/01/02(月) 19:05:35.40ID:03PPbeGI
第 (k+1) 回目にステップ(1)が実行されるときを考える。
このとき、明らかに #S = k であり、 ∀i ∈ S に対して、 d(i) = td(i) が成り立つ。
第 (k+1) 回目にステップ(1)が実行されるときに選ばれる節点を v ∈ V - S とする。
d(v) = ∞ である場合と d(v) ≠ ∞ である場合で場合分けして考える。

(1) d(v) = ∞ である場合。
td(v) ≠ d(v) = ∞ と仮定して矛盾を導く。
td(v) ≠ ∞ であるから、節点 s から節点 v への経路 s = v_0 → v_1 → … → v_(l-1) → v_l = v が存在する。
明らかに、 td(v_0), td(v_1), …, td(v_(l-1)), td(v_l) ≠ ∞ である。
v_0 ∈ S, v_l ∈ V - S であるから、 v_i ∈ S, v_(i+1) ∈ V - S となるような i が存在する。
∀j ∈ V - S に対して、 d(j) = ∞ であるから、 d(v_(i+1)) = ∞ である。また、 v_i ∈ S であるから、
d(v_i) = td(v_i) ≠ ∞ が成り立つ。
v_i がステップ(2)で S に追加されたときのことを考えれば分かるように、 (v_i, v_(i+1)) ∈ E かつ v_(i+1) ∈ V - S であるから、
d(v_(i+1)) = ∞ ということはない。これは矛盾である。
よって、 d(v) = td(v) = ∞ が成り立つ。
0237デフォルトの名無しさん垢版2017/01/02(月) 19:05:51.66ID:03PPbeGI
(2) d(v) ≠ ∞ である場合。
td(v) ≠ d(v) と仮定して矛盾を導く。
ステップ(2)を考えれば明らかなように、 d(v) ≠ ∞ であるから、節点 s から節点 v への
最短経路 s = v_0 → v_1 → … → v_(l-1) → v_l = v が存在する。
よって、 td(v) ≠ ∞ である。
仮定により、 td(v) ≠ d(v) であるから、 td(v) < d(v) が成り立つ。
v_0 ∈ S, v_l ∈ V - S であるから、 v_i ∈ S, v_(i+1) ∈ V - S となるような i が存在する。
td(v_(i+1)) < d(v_(i+1)) である。なぜなら、もし、そうでないと仮定すると、 d(v_(i+1)) = td(v_(i+1)) であるが、
td(v_(i+1)) ≦ td(v) < d(v) であるから、 d(v_(i+1)) < d(v) となってしまい、ステップ(1)での v の
選ばれ方に矛盾するからである。
v_i ∈ S であるから、 d(v_i) = td(v_i) である。
v_i がステップ(2)で S に追加されたときのことを考えれば分かるように、 (v_i, v_(i+1)) ∈ E かつ v_(i+1) ∈ V - S であるから、
d(v_i) + a_(v_i v_(i+1)) ≧ d(v_(i+1)) である。
一方、明らかに、 td(v_i) + a_(v_i v_(i+1)) = td(v_(i+1)) であるから、
td(v_(i+1)) = td(v_i) + a_(v_i v_(i+1)) = d(v_i) + a_(v_i v_(i+1)) ≧ d(v_(i+1)) となるが、これは矛盾である。
よって、 td(v) = d(v) が成り立つ。
0238デフォルトの名無しさん垢版2017/01/02(月) 19:06:08.41ID:03PPbeGI
以上より、第 (k+1) 回目にステップ(1)が実行されるときにも、ステップ(1)で選ばれる節点 v ∈ V - S に対して、
d(v) = td(v) が成り立つ。

S に追加される節点はすべて、ステップ(1)で選ばれた 節点 v ∈ V - S であり、一度 S に追加された節点 v の d(v) はそれ以後、
変更されないから、ステップ(1)でアルゴリズムが終了したとき、 ∀i ∈ S = V に対して、 d(i) = td(i) が成り立つ。
0239デフォルトの名無しさん垢版2017/01/02(月) 19:26:36.14ID:03PPbeGI
>>232

ある本では、

正定数 c, n0 が存在して、 n ≧ n0 のとき、 T(n) ≦ c*f(n) であるなら、
T(n) は O(f(n)) であるという

と定義されています。

T(n) = n!
f(n) = n!
g(n) = (n-1)!

とします。

このとき、明らかに、
T(n) は O(f(n)) ですが、
T(n) は O(g(n)) ではありません。
0240デフォルトの名無しさん垢版2017/01/02(月) 19:29:54.44ID:03PPbeGI
したがって、

O(f(n)) と O(g(n)) は異なります。
0242デフォルトの名無しさん垢版2017/01/03(火) 08:50:16.82ID:hCDXc7Qp
>>224
>>227

閉路を含まないから、各点を高々1回しか通らない。(端点も)

直通の経路が 1
途中でk個所を通過する経路が
 (n-2)(n-3)・・・・・(n-k-1) = (n-2)!/(n-k-2)!
だけある。ただし、k≦n-2
よって
a_n = (n-2)!{1 + 1/1! + 1/2! + … + 1/(n-2)!},

n ≧ 2 のとき、

(n-2)! ≦ (n-2)! * (1 + 1/1! + 1/2! + … + 1/(n-2)!) ≦ e * (n-2)!

したがって、

a_n = Θ((n-2)!)

である。
0243デフォルトの名無しさん垢版2017/01/03(火) 08:52:54.04ID:hCDXc7Qp
>>234-238

のダイクストラのアルゴリズムの正しさの証明に間違いはないという
ことでOKですか?
0244デフォルトの名無しさん垢版2017/01/03(火) 11:39:58.60ID:hCDXc7Qp
Erik DemaineはMITの歴史上最年少で教授になったという天才だそうですね。

今、そのErik Demaineの2005年のダイクストラのアルゴリズムについての講義を見ています。

見終わったら、講義の要約について書きます。
0245デフォルトの名無しさん垢版2017/01/03(火) 13:47:58.01ID:hCDXc7Qp
ダイクストラのアルゴリズム:

01: d[s] ← 0
02: for each v ∈ V - {s}:
03: ■■d[v] ← ∞
04: S ← Φ
05: Q ← V
06: while Q ≠ Φ:
07: ■■u ← ExtractMin(Q)
08: S ← S ∪ {u}
09: for each v ∈ Adj[u]:
10: ■■if d[v] > d[u] + w(u, v):
11: ■■■■d[v] ← d[u] + w(u, v)
0246デフォルトの名無しさん垢版2017/01/03(火) 13:49:29.21ID:hCDXc7Qp
Correctness I:

d[v] の初期化の直後、およびLine 11の直後において、
すべての v ∈ V に対して、 d[v] ≧ δ(s, v) が
成り立つ。

証明:
d[v] の初期化の直後には、
d[s] = 0 かつすべての v ∈ S - {v} に対して、d[v] = ∞
が成り立っている。
δ(s, s) = 0 かつすべての v ∈ S に対して、 δ(s, v) ≦ ∞
であるから、d[v] の初期化の直後には、
すべての v ∈ V に対して、 d[v] ≧ δ(s, v) が確かに
成り立っている。
0247デフォルトの名無しさん垢版2017/01/03(火) 13:49:56.08ID:hCDXc7Qp
Line 11の直後において、すべての v ∈ V に対して、
d[v] ≧ δ(s, v) が成り立つことを背理法により示す。

Line 11の直後において、 d[v] ≧ δ(s, v) が
成り立たないような v ∈ V が存在するとする。
v をそのような点の中で、最初の点とする。

d[v] < δ(s, v)

d[v] < δ(s, v) ≦ ∞ であるから、
ダイクストラのアルゴリズムのLine 11は少なくとも1回は
実行されているはずである。そのような最後の実行を

d[v] ← d[u] + w(u, v)

とすると、

d[u] + w(u, v) = d[v] < δ(s, v)

が成り立つ。

一方、 d[u] ≧ δ(s, u) であるから、

d[u] + w(u, v) ≧ δ(s, u) + w(u, v)
≧ δ(s, u) + δ(u, v)
≧ δ(s, v)

が成り立つが、これは矛盾である。
0248デフォルトの名無しさん垢版2017/01/03(火) 13:51:21.27ID:hCDXc7Qp
Correctness Lemma:
s → … → u → v を s から v への一つの最短路とする。
d[u] = δ(s, u) であるとする。

このとき、Line10-11を実行すると、

d[v] = δ(s, v)

が成り立つ。

証明:
δ(s, v) = w(s → … → u) + w(u, v)
= δ(s, u) + w(u, v)
Correctness Iより、 d[v] ≧ δ(s, v)

(1)Line10-11の実行前に、 d[v] = δ(s, v) である場合。
Line10-11の実行後も d[v] = δ(s, v) である。

(2)Line10-11の実行前に、 d[v] > δ(s, v) である場合。
d[v] > δ(s, v) = δ(s, u) + w(u, v) = d[u] + w(u, v)
Line10-11の実行後は、 d[v] = d[u] + w(u, v) = δ(s, v)
となる。
0249デフォルトの名無しさん垢版2017/01/03(火) 13:52:06.64ID:hCDXc7Qp
Correctness II:
ダイクストラのアルゴリズムが終了したとき、
すべての v ∈ V に対して、 d[v] = δ(s, v) が成り立つ。

証明:
d[v] は v が S に追加された後は、不変である。
よって、 v が S に追加されたときに、
d[v] = δ(s, v) であることを示せばよい。

背理法で示す。
v が S に追加されたときに、 d[v] ≠ δ(s, v) であるような
v ∈ V が存在すると仮定する。
u をそのような点の中で、最初に S に追加された点とする:
d[u] ≠ δ(s, u)
Correctness Iより、
d[u] > δ(s, u)
0250デフォルトの名無しさん垢版2017/01/03(火) 13:52:49.71ID:hCDXc7Qp
今、 u が S に追加される直前の状況を考えることにする。
u はまだ S に追加されていないから、 u ∈ Q である。
p を s から u への一つの最短路とすると、 w(p) = δ(s, u) である。
s ∈ S, u ∈ Q であるから、 p 上の辺 (x, y) で x ∈ S, y ∈ Q となる
ような辺が存在する。そのような辺の一つを (x, y) とする。
すると、 p は以下のようになる。
p : s → … → x → y → … → u
x ∈ S であるから、 u に関する仮定より、
d[x] = δ(s, x) が成り立つ。また、明らかに、
s → … → x → y は s から y への一つの最短路であるから、
Correctness Lemmaより、 d[y] = δ(s, y) が成り立つ。
明らかに、 δ(s, y) ≦ δ(s, u) であるから、
d[y] ≦ δ(s, y)
また、Line07を見れば分かるように、
d[u] ≦ d[y] である。
よって、

d[u] ≦ δ(s, u) となるが、これは矛盾である。
0251デフォルトの名無しさん垢版2017/01/03(火) 13:55:46.21ID:hCDXc7Qp
Lec 17 | MIT 6.046J / 18.410J Introduction to Algorithms (SMA 5503), Fall 2005
https://youtu.be/xhG2DyCX3uA
0252デフォルトの名無しさん垢版2017/01/05(木) 09:16:14.40ID:4i7P3+nF
アルゴリズムイントロダクションって自明なことをわざわざループ不変量を使ったりして、
証明していて、うざすぎますね。
0253デフォルトの名無しさん垢版2017/01/05(木) 09:16:52.73ID:4i7P3+nF
通常の数学の本なら自明で済ませるようなことをわざわざ証明している。
0255デフォルトの名無しさん垢版2017/01/05(木) 10:02:39.43ID:OZq8Y/OW
http://hissi.org/read.php/tech/20160422/cGVtVmVaYUg.html
http://hissi.org/read.php/tech/20160612/YkttemlBQ3Y.html
こいつだ。

> って当たり前のことをループ不変とかを使って説明しているよね。はっきりいってくどい。
> ループ不変式とかいうのが出てくるけど、当たり前のことを形式的に証明しているだけで、つまらなすぎる。
> 馬鹿の一つ覚えみたいにループ不変式をつかって証明しようとしている。

これぞ「馬鹿の一つ覚え」である。
0257デフォルトの名無しさん垢版2017/01/05(木) 11:01:45.09ID:4i7P3+nF
クヌースの本なんかだと妙なくどさはない。

アルゴリズムイントロダクションはメリハリが全くない。
Trivialなこともそうでないことも平等に扱いすぎている。

要するに本を書くセンスがない。
0258デフォルトの名無しさん垢版2017/01/05(木) 11:02:52.69ID:4i7P3+nF
セジウィックとウエインの本のほうがずっとよい。
0259デフォルトの名無しさん垢版2017/01/05(木) 11:07:44.54ID:4i7P3+nF
日本語の本について言及しておく。
例えば、評判のよい茨木俊秀の本。

こんな薄いスカスカの本をよくも恥ずかしげもなく出版するものだとあきれる。
0260デフォルトの名無しさん垢版2017/01/05(木) 11:19:31.17ID:4i7P3+nF
アルゴリズムイントロダクションの悪口を書いたがいいところもある。

例えば、第29章線形計画法。

線形計画法に対しては、Trivialなこともそうでないことも平等に扱うという方針が
向いているように思う。

ただ、アルゴリズムの本に線形計画法を入れる理由が分からない。

整数論的アルゴリズムの章はあまりにも簡単すぎる。
高木貞治の本でも読んだ方がよい。
0261デフォルトの名無しさん垢版2017/01/05(木) 11:28:06.54ID:4i7P3+nF
結論として、ベストな本はクヌースが予定しているTAOCPの要約本ということになる。
0265デフォルトの名無しさん垢版2017/01/05(木) 11:44:36.30ID:4i7P3+nF
>>263

では、なぜ、一般に、コンピュータ科学者よりも頭が良いとされる数学者が
自明で済ませることが多いのでしょうか?

もし危ういのなら頭のよい数学者は自明などと書かないはずです。
0269デフォルトの名無しさん垢版2017/01/05(木) 13:18:34.40ID:c6xYhHVb
>一般に、コンピュータ科学者よりも頭が良いとされる数学者が
根拠は?
>自明で済ませることが多いのでしょうか?
数学のコンテキストの話

そもそも証明の意味もコンピュータ科学と数学では違うだろ
0272デフォルトの名無しさん垢版2017/01/05(木) 19:46:02.51ID:4i7P3+nF
アルゴリズムイントロダクションについて、数学が出来る人向けの本だという人がいる。
そして、数学ができない人はセジウィック&ウエインの本を読めという人がいる。

アルゴリズムイントロダクションが数学的な本だとは全く思わない。数学的な内容については
主に結果だけを書いている。

ただネチネチとアルゴリズムの正しさの証明が書かれているだけのこと。

クヌースの本のように、楽しい本ではない。
0275デフォルトの名無しさん垢版2017/01/06(金) 17:19:30.91ID:TSHa+AxL
再帰の除去についてやり方が詳しく書いてある本を教えてください。
0276デフォルトの名無しさん垢版2017/01/06(金) 17:43:03.36ID:TSHa+AxL
プログラミングコンテストチャレンジブック第2版のp.35
Lake Counting(POJ No.2386)

の解答として、以下のプログラムはあっていますか?

void dfs(i, j, n){
if(i < 0 || i >= N || j < 0 || j >= M){
return;
}
if(field[i][j] != 'W'){
return;
}
if(visit[i][j] == true){
return;
}
visit[i][j] = true;
dfs(i-1, j-1, n+1);
dfs(i-1, j, n+1);
dfs(i-1, j+1, n+1);
dfs(i, j-1, n+1);
dfs(i, j+1, n+1);
dfs(i+1, j-1, n+1);
dfs(i+1, j, n+1);
dfs(i+1, j+1, n+1);

if(n == 0){
count++;
}
return;
}
0278デフォルトの名無しさん垢版2017/01/06(金) 18:36:23.48ID:TSHa+AxL
Wrong Answerになっちゃうんだけど。
0279デフォルトの名無しさん垢版2017/01/06(金) 18:38:07.31ID:TSHa+AxL
例題については正しい答えが計算されるんだけど。
0281デフォルトの名無しさん垢版2017/01/06(金) 20:15:02.80ID:TSHa+AxL
>>277

ソースレベルで再帰を除去する方法が知りたいんですが。
0282デフォルトの名無しさん垢版2017/01/06(金) 20:22:33.43ID:TSHa+AxL
秋葉らのプログラムでもWrong Answerになっていまします。

入出力の問題のようですね。
0283デフォルトの名無しさん垢版2017/01/06(金) 20:27:59.50ID:TSHa+AxL
入出力の問題ってやっかいですね。
出力がどうなっているかとかPOJでは調べられないんですか?
0284デフォルトの名無しさん垢版2017/01/06(金) 20:41:27.59ID:TSHa+AxL
なんなんだろう?

scanf,printfを使っていたらダメだったのが、cinとcoutにしたらOKになった。
0285デフォルトの名無しさん垢版2017/01/08(日) 12:26:37.82ID:E98VLsZL
F(p, n, r) の計算量を教えてください。

n: 整数
p, r: 整数配列(インデックス0からn-1)

F(p, n, r):
■■if r[n] ≧ 0:
■■■■return r[n]
■■if n == 0:
■■■■q = 0
■■else:
■■■■q = -∞
■■■■for i = 1 to n:
■■■■■■q = max(q, p[i] + F(p, n-i, r))
■■r[n] = q
■■return q
0288デフォルトの名無しさん垢版2017/01/08(日) 13:51:15.22ID:E98VLsZL
>>286-287

ありがとうございます。

でも解説されていませんね。
0289デフォルトの名無しさん垢版2017/01/08(日) 13:57:19.77ID:E98VLsZL
どうやって計算量を見積もるんですか?

何を単位にするんですか?
0290デフォルトの名無しさん垢版2017/01/08(日) 14:06:13.08ID:E98VLsZL
T(n)
=
c1 + c2 * n + T(n-1) + … + T(0)
=
c1 + c2 * n + T(n-1) + c3*(n-1)

と解けばいいんですかね?
0291デフォルトの名無しさん垢版2017/01/08(日) 14:07:36.75ID:E98VLsZL
T(n) = c1 + c2*n + T(n-1)
T(0) = c3

この漸化式の解を求めればいいんですかね?
0292デフォルトの名無しさん垢版2017/01/08(日) 14:12:15.21ID:E98VLsZL
T(n)
=
[T(n) - T(n-1)] + [T(n-2) - T(n-3)] + … + [T(1) - T(0)] + T(0)
=
[c1 + c2*n] + [c1 + c2*(n-1)] + … + [c1 + c2*1] + c3
=
c1*n + c2*(1/2)*n*(n+1) + c3
=
Θ(n^2)

おお、あってるっぽいですね。
0293デフォルトの名無しさん垢版2017/01/08(日) 14:20:56.92ID:E98VLsZL
>>290-292
は我ながら明解な解答ですが、

教科書では、以下のように導出しています。
この導出がよく分からないのですが。

「以前に解かれている部分問題を解くための再帰は直ちに戻るので、Fは
各部分問題をただ1度だけ解く。この手続きはサイズが0,1,....,nの部分問題
を解く。サイズがnの部分問題を解くために、for文がn回繰り返される。したがって、
Fの再帰呼び出し全体における、このfor文の繰り返し回数は等差数列を形成し、
総繰り返し回数はΘ(n^2)となる。」
0294デフォルトの名無しさん垢版2017/01/08(日) 14:26:56.39ID:E98VLsZL
あーあ、分かりました。

T(n)
=
c1 + c2 * n + T(n-1) + … + T(0)
=
c1 + c2 * n + T(n-1) + c3*(n-1)

このあたりのことを言っているんですね。
0296デフォルトの名無しさん垢版2017/01/08(日) 14:28:32.97ID:E98VLsZL
>>289

for文の繰り返し回数=計算量ですね。
0297デフォルトの名無しさん垢版2017/01/08(日) 14:29:42.72ID:E98VLsZL
結局自分ですべて解決してしまいました。
0300デフォルトの名無しさん垢版2017/01/08(日) 20:55:21.87ID:E98VLsZL
プログラミングコンテストチャレンジブック

p.45 Best Cow Lineっていう問題の解答のプログラムって無駄がありますよね。

この本を難しいという人がいますが、そんなに難しいですかね?
0301デフォルトの名無しさん垢版2017/01/08(日) 22:46:42.12ID:E98VLsZL
プログラミングコンテストチャレンジブック
プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
最強最速アルゴリズマー養成講座

この3冊に共通していることですが、日本語が下手ですよね。

一番ひどいのが

最強最速アルゴリズマー養成講座

ですね。
0302デフォルトの名無しさん垢版2017/01/08(日) 22:50:51.06ID:E98VLsZL
一番面白いのは、

プログラミングコンテストチャレンジブック

だと思いますけど、例えば、貪欲法でなぜうまくいくのかの証明が書いてないですね。
0304デフォルトの名無しさん垢版2017/01/09(月) 06:08:00.57ID:JOAqSyBk
>>301
うむ
日本語下手なのはもちろん英語も下手みたいだな
0306デフォルトの名無しさん垢版2017/01/09(月) 10:59:50.63ID:TqLncjlX
アルゴリズムイントロダクションの練習問題15.1-3の解答って以下であっていますか?

BOTTOM-UP-CUT-ROD(p, c, n)
1 r[0..n] を新しい配列とする
2 r[0] = 0
3 for j = 1 to n
4 ■■q = -∞
5 ■■for i = 1 to j-1
6 ■■■■q = maxx(q, p[i] + r[j-i] - c)
7 ■■q = max(q, p[j])
8 ■■r[j] = q
9 return r[n]
0307デフォルトの名無しさん垢版2017/01/09(月) 11:02:45.57ID:TqLncjlX
15.1-2

反例

p[1] = 1
p[2] = 5
p[3] = 7
0308デフォルトの名無しさん垢版2017/01/09(月) 13:21:16.77ID:TqLncjlX
F_0 = 0
F_1 = 1
F_i = F_(i-1) + F_(i-2) (i≧2)

F_n を O(n) 時間で計算する動的計画アルゴリズムを設計せよ。
対応する部分問題グラフを描け。
このグラフにはいくつの頂点と辺が存在するか?


↑はアルゴリズムイントロダクションの練習問題15.1-5なんですけど、
なんか簡単すぎるようにみえるんですけど、落とし穴があるんですかね?

なんでΘ(n)じゃなくてO(n)と書いてあるんですかね?
0309デフォルトの名無しさん垢版2017/01/09(月) 13:34:48.26ID:TqLncjlX
配列を使わないとDPとは言えないですか?
配列いらないですよね。
でもi = 0〜nに対して、F[i]が求まるという意味はありますね。


F[0] = 0
F[1] = 1
for i = 2 to n
■■F[n] = F[n-1] + F[n-2]

明らかにΘ(n)ですよね。

部分問題グラフは以下ですよね:

http://imgur.com/WUQMG8R.jpg

#V = n + 1
#E = 2*(n - 1)

ですね。
0310デフォルトの名無しさん垢版2017/01/09(月) 13:37:23.94ID:TqLncjlX
あ、ひっかけがありましたね。
訂正します:

n > 0 のとき、

#V = n + 1
#E = 2*(n - 1)

n = 0 のとき

#V = n + 1
#E = 0

ですね。
0311デフォルトの名無しさん垢版2017/01/09(月) 15:27:31.58ID:TqLncjlX
アルゴリズムイントロダクションに、以下の事実を1955年にRobbinsが発見したと書いてあります。

--------------------------------------------
すべての n ≧ 1 に対して

n! = sqrt(2*π*n) * (n/e)^n * exp(α_n)

と書ける。

ただし、 1/(12*n+1) < α_n < 1/(12*n)
--------------------------------------------

本当にこんな比較的簡単にみえる結果が1955年という比較的最近になって発見された
のでしょうか?
0312デフォルトの名無しさん垢版2017/01/09(月) 15:37:47.20ID:4OeNzyzM
>>308
フィボナッチだろ
√5が出て来る公式
O(1)になるかも試練が
0313デフォルトの名無しさん垢版2017/01/09(月) 15:46:27.18ID:FSSb8O2Z
>>311
      r ‐、
      | ○ |         r‐‐、
     _,;ト - イ、      ∧l☆│∧  良い子の諸君!
    (⌒`    ⌒ヽ   /,、,,ト.-イ/,、 l  
    |ヽ   ~~⌒γ ⌒ ) r'⌒ `!´ `⌒) よく頭のおかしい数学者気取りのバカが
   │ ヽー―'^ー-'  ( ⌒γ ⌒~~ / 「誰も気付かなかった事を発見したことを発表」とほざくが
   │  〉    |│  |`ー^ー― r' | 大抵それは「先人が思いついたけどあえて発表しなかった」ことだ
   │ /───| |  |/ |  l  ト、 |  王道が何故面白いか理解できない人間に面白い話は
   |  irー-、 ー ,} |    /     i 作れないぞ!
   | /   `X´ ヽ    /   入  |
0314デフォルトの名無しさん垢版2017/01/10(火) 20:16:10.65ID:Zd0v4023
アルゴリズムイントロダクションが難しいという人がいますけど、
この本は馬鹿丁寧に書かれていますよね。

いわゆる「書きすぎ」ですね。

「書きすぎ」れば分かりやすくなると思い込んでいますね、著者らは。
0316デフォルトの名無しさん垢版2017/01/13(金) 21:58:42.65ID:wiy2qrIv
プログラミング言語のパーサーってどういう仕組みで動いてるんですか?
文字列をトークンの配列に分ける
特定のパターンにマッチするトークンの部分集合をひとまとめにして新しいトークンに置き換える
再帰的に同じ事を繰り返す
こんな感じ?
0321デフォルトの名無しさん垢版2017/05/14(日) 13:16:07.97ID:SQILU9sh
類似スレ検索とかのアルゴリズムって何がいいのかな?
編集距離とか数字部分のマスキングくらいしか浮かばない
形態素解析して要素の一致率とかもあるみたいだけど、スレタイみたいな短い文字じゃ弱そう
0322デフォルトの名無しさん垢版2017/05/14(日) 13:20:48.12ID:SQILU9sh
むしろ短くて重要な単語が多いスレタイこそ一致率うまく働きそうか
毎回評価してたら検索速度悪そうだけど
0324デフォルトの名無しさん垢版2017/05/26(金) 14:08:00.89ID:fOPo0M5r
アルゴリズムイントロダクション

当たり前のことを定理などとよんで回りくどく証明していますね。

なんなんですか?この本。

例えば、p.506定理22.9とか。
0325デフォルトの名無しさん垢版2017/05/26(金) 19:39:06.33ID:GnitEmTF
当たり前のことを2chで指摘して回りくどくdisっていますね。
なんなんですか?あなた。
例えば、 >>324 とか。
0327デフォルトの名無しさん垢版2017/05/26(金) 22:50:21.07ID:fOPo0M5r
>>324

しかも「証明」が長い。当たり前のことを長々と書いている。
その「証明」自体も意外性ゼロ。
0328デフォルトの名無しさん垢版2017/05/26(金) 22:52:14.04ID:fOPo0M5r
しかも徹底していない。

ある命題は明らかで済ませている。
その一方である命題には長々と「証明」をつけている。

基準がさっぱりわからない。
0329デフォルトの名無しさん垢版2017/05/26(金) 22:52:58.46ID:ovKX6RUR
初級アルゴリズム本持ち出して何なんですか言われてもねぇ。。。
物足りなかったら上のクラスの本買えば?
0330デフォルトの名無しさん垢版2017/05/26(金) 23:04:15.09ID:fOPo0M5r
とにかくしつこい本。

この著者らの感性は、おかしいと思う。

丁寧というよりしつこい。

クヌースの本は丁寧という感じ。

結局、教科書の書き手として優れていない。
0331デフォルトの名無しさん垢版2017/05/27(土) 03:04:18.64ID:V3ffhZkY
きっとアスペなんだろう
0332デフォルトの名無しさん垢版2017/05/27(土) 03:30:20.38ID:6GQ16ypm
アルゴリズムでは、セジウィックが有名。他に、

入門 データ構造とアルゴリズム、2013、オライリー
Narasimha Karumanchi(インド人) 著

プログラミング・コンテスト・チャレンジブック、第2版、2012
0334デフォルトの名無しさん垢版2017/05/27(土) 08:08:34.68ID:tcRpjIho
浅野孝夫の新しく出た2冊の本はどうですか?
0335デフォルトの名無しさん垢版2017/05/27(土) 11:29:04.28ID:tcRpjIho
アルゴリズムイントロダクションは訳もひどいね。

意味不明だと思って原著を調べるといつも誤訳。

今読んでいるところにも誤訳を見つけた。

本当に理解して訳しているか?
0336デフォルトの名無しさん垢版2017/05/27(土) 11:54:19.85ID:tcRpjIho
Let v be the first vertex to be discovered in c, and let (u, v) be the preceding edge in c.

の訳が、

c の中で最初に発見される頂点を v, c において v に向かう辺を (u, v) とする。
(したがって、 u は c における v の先行点である。)

日本語としてまずおかしいし、 u は v の先行点では、もちろんない。
0339デフォルトの名無しさん垢版2017/05/31(水) 19:10:09.21ID:uNlt1YRD
今扱ってるライブラリのコンストラクタとか生成系のメソッドとかの引数が多すぎるんで何とかしたいんだがビルダーパターンぐらいしかないのかな
今は引数用の構造体を用意して成のメソッドの呼び出し時に構造体を参照させるようにしてるんだが、お前らどう思う?
0342デフォルトの名無しさん垢版2017/06/01(木) 07:33:57.31ID:9lL7NugS
まあ、ファクトリかビルダだろうな

引数をオーバーライドメソッドでなるべく少なくなる工夫しつつ
0343デフォルトの名無しさん垢版2017/06/01(木) 07:40:31.13ID:PJoLYMb9
グラフ理論のアルゴリズムを実装したときに、正しいかどうか
チェックするのって、グラフを用意しなきゃならなくて大変だけど
サンプルのグラフってどこかに公開されていないの?
0347デフォルトの名無しさん垢版2017/06/05(月) 16:05:46.39ID:gPC56aZq
2つのグラフが同型かどうか判定するアルゴリズムを教えてください。
0348デフォルトの名無しさん垢版2017/06/05(月) 18:35:40.61ID:Vm0ObO74
ちょっと手間を減らすなら、次数でソートしたりゴニョゴニョできるけど、NPだからあとは力技
0350デフォルトの名無しさん垢版2017/06/05(月) 20:28:56.86ID:gPC56aZq
>>348-349

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

基本的で重要な問題なのにアルゴリズムの本で見かけなかったのは効率的な
アルゴリズムが存在しないからだったんですね。

効率的なアルゴリズムが存在しない場合でも、小さい問題は解けるわけですから、
それなりの工夫でもいいから、教科書に載せてほしいです。
0351デフォルトの名無しさん垢版2017/06/05(月) 20:36:06.74ID:gPC56aZq
>>348-349

グラフが同型かどうかくらいならプログラムを誰でも作れると思います。

効率的なアルゴリズムが存在しない問題の場合、教科書にはアルゴリズムが
載っていないことが多いと思います。自分で力任せのプログラムを書ける場合
はいいですが、力不足で力任せのプログラムすら書けない場合って困りますね。
0352デフォルトの名無しさん垢版2017/06/05(月) 21:01:13.00ID:sad0uPoZ
>347
networkXっていうPythonのグラフアルゴリズムのライブラリに、グラフ同型判定の関数があるよ。
is_isomorphic()
ソースコードも見れるから、実装の参考にしては。
VF2アルゴリズムというのを使っているらしい。どういうのかは、知らない。。
0353デフォルトの名無しさん垢版2017/06/05(月) 21:17:56.80ID:gPC56aZq
>>352

今、グラフ理論の本を読んでいるのですが、その演習問題の
答えを計算機で計算したいと思いプログラムを作っています。

手計算でできる問題なので計算量とかは無問題です。

情報、ありがとうございました。
0355デフォルトの名無しさん垢版2017/06/10(土) 01:09:12.89ID:yRjB/26o
セジウィックのアルゴリズムCはコルメン他の本とは対極にあるような本だね。
どっちもどっち。
0356デフォルトの名無しさん垢版2017/06/10(土) 22:49:54.03ID:bkNNwNFI
セジウィックのアルゴリズムCは言葉足らず。
0357デフォルトの名無しさん垢版2017/06/11(日) 08:24:40.56ID:7PvmoOJK
セジウィックのアルゴリズムCは定義がダメダメ。

例:
連結グラフの極大木とは、すべての頂点を含む部分グラフであって、
木である限りできるだけ多くの辺をもつものをいう。

この定義だと連結グラフに極大木が常に存在するというのが定理になってしまう。
が、証明せずに、この事実を以下で使っている。
0358デフォルトの名無しさん垢版2017/06/11(日) 11:00:58.83ID:7PvmoOJK
セジウィックのアルゴリズムCは、訳も最低。
0359デフォルトの名無しさん垢版2017/06/16(金) 18:04:24.35ID:ixzzoI9b
浅野孝夫著『アルゴリズムの基礎とデータ構造 数理とCプログラム』(近代科学社)

ポインタを使えるCでアルゴリズムを実装しておきながらポインタを使わず、
配列を使ってポインタの機能を実現するという面倒なことをしています。

著者は何を考えているのでしょうか?
0360デフォルトの名無しさん垢版2017/06/16(金) 18:08:47.36ID:1eQLQexT
javaの逆ポートだろう
0361デフォルトの名無しさん垢版2017/06/16(金) 18:30:17.58ID:ixzzoI9b
浅野孝夫著『アルゴリズムの基礎とデータ構造 数理とCプログラム』(近代科学社)

の公式ページからソースコードをダウンロードできます。

たくさんのソースコードがあるのですが、こういうのを実行するときってみなさんは
どうしていますか?

Visual Studio を使っているのですが、一つのソースファイルに対して、いちいち
プロジェクトを作っていると面倒なんですが、どうすればいいですか?
0362デフォルトの名無しさん垢版2017/06/16(金) 18:31:46.91ID:ixzzoI9b
コマンドプロンプトからコマンドを実行してコンパイルをしたりする原始的なやり方
は避けたいです。
0363デフォルトの名無しさん垢版2017/06/16(金) 18:47:18.97ID:1eQLQexT
なんだ
ステマか
0367デフォルトの名無しさん垢版2017/06/16(金) 21:42:24.80ID:SNTjPZEm
そもそも何でファイルごとにわざわざプロジェクト作るような原始的なことやってるの
0370デフォルトの名無しさん垢版2017/06/17(土) 18:14:18.11ID:DtePX3I4
アルゴリズムとデータ構造の本のソースコードを見ると、よくグローバル変数を
多用していて非常に分かりにくいことが多いです。

グローバル変数を使うのは良くないというのをよく目にしますが、なぜ、
コンピュータサイエンスのプロであるはずのアルゴリズムとデータ構造の本の
著者がそんなプログラムを書くのでしょうか?
0371デフォルトの名無しさん垢版2017/06/17(土) 18:18:02.53ID:DtePX3I4
例えば、

浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

という本のソースプログラムが分かりにくいです。

拡張子が「.h」のファイルにグローバル変数を定義して使いまわしています。

さらに、その拡張子が「.h」のファイル内で「emaxsize」というのがありますが
それが何なのかが書いてありません。

その拡張子が「.h」のファイルを利用するファイル内で、「emaxsize」を設定しています。

こういうのはありなんでしょうか?

あちこちいろいろなファイルを見ないと、全体が分かりません。
0374デフォルトの名無しさん垢版2017/06/17(土) 18:19:49.58ID:DtePX3I4
全然、プログラム作りの参考になりません。

ただ、例外もあります。

セジウィックの『Algorithms』という赤い本は、参考になります。
0375デフォルトの名無しさん垢版2017/06/17(土) 18:21:15.46ID:DtePX3I4
>>373

でも、コード自体は非常に巧妙で優れています。
0376デフォルトの名無しさん垢版2017/06/17(土) 20:50:11.36ID:DtePX3I4
そういえば、茨木俊秀の本のプログラムもひどかったような。
0377デフォルトの名無しさん垢版2017/06/17(土) 22:37:25.92ID:tNCJKlzg
グローバル変数を避けようとかはソフトウェア工学の話で、コンピューター科学とは別の分野なんだよ。
0378デフォルトの名無しさん垢版2017/06/17(土) 23:06:32.77ID:L9yKSdqC
ソフトウェア工学の基本すら知らないんですかね?
0379デフォルトの名無しさん垢版2017/06/18(日) 00:34:44.62ID:o43mtcr6
グローバル変数を使った方が、説明しやすいとか、
ソースコードがわかりやすいとか

本の目的が、アルゴリズムの説明だから、
グローバル変数を使って、わかりやすく説明するのも、OK

物事には強弱・重要度があるから、
重要な事を説明する際、重要でない事は無視してもよい

これを、TPO と言って、強弱を付けられる人は、空気を読める

ちょっとしたプログラミングに、型チェックする、Javaなどを使わず、
Rubyで書くのもそう。
ラフな会合に、盛装して行かないのもそう
0381デフォルトの名無しさん垢版2017/06/18(日) 12:39:15.20ID:4GAQ5Lgy
グローバル変数を明らかに、分かりにくいやり方で使っています。

何の利点もないと思います。
0382デフォルトの名無しさん垢版2017/06/18(日) 13:30:23.31ID:4GAQ5Lgy
もしかして、理論ばかりに興味があり、プログラムを作ったことがないんですかね?
0383デフォルトの名無しさん垢版2017/06/18(日) 14:37:44.92ID:7v+ppDWb
プログラム教本ではなくアルゴリズム解説本だからでしょ
擬似言語で書いている場合のが多いと思うけど
0384デフォルトの名無しさん垢版2017/06/18(日) 15:37:30.01ID:xPH4G83l
最初から完成してたらおまいらの仕事無くなっちゃうだろ
0385デフォルトの名無しさん垢版2017/06/18(日) 18:10:10.06ID:L/LJrXI/
楽器やってるひとがいってたよ。自分がつかえる技術を全部つかうわけじゃない
0386デフォルトの名無しさん垢版2017/06/18(日) 20:13:26.60ID:4GAQ5Lgy
浅野孝夫の本。

ちょっと説明が足りないところがある。
完成度がやや低い。
他の日本人の本よりはまし。

プログラムは巧妙。
0390デフォルトの名無しさん垢版2017/06/19(月) 12:02:27.97ID:0IiK5rsw
浅野孝夫の本。

深さ優先探索とか幅優先探索の説明を言葉で長々としています。
そんなことするより、コードを見せたほうがいいと思うんですよね。
コードを見れば一目で分かりますよね。
0393デフォルトの名無しさん垢版2017/06/21(水) 10:56:36.24ID:CsbvaOkp
http://imgur.com/9QGwvmM.jpg
http://imgur.com/j3Dp32V.jpg
http://imgur.com/iJhKoqM.jpg

↑は浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)です。

重大な誤りを発見しました。

G が二部グラフであるための必要十分条件は、G を幅優先探索したときに同じ深さの補木辺がないことであると書かれていますが、
完全な誤りです。

具体的に言うと、「同じ深さの点を結ぶ補木辺がないときは、この色の割当てが実際に2彩色になっている。」と書かれていますが、
間違っています。

反例は3枚目の画像を参照してください。
0394デフォルトの名無しさん垢版2017/06/21(水) 11:00:57.46ID:CsbvaOkp
訂正します:

http://imgur.com/9QGwvmM.jpg
http://imgur.com/j3Dp32V.jpg
http://imgur.com/iJhKoqM.jpg

↑は浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)です。

重大な誤りを発見しました。

G が二部グラフであるための必要十分条件は、G を幅優先探索したときに同じ深さの点を結ぶ補木辺がないことであると書かれていますが、完全な誤りです。

具体的に言うと、「同じ深さの点を結ぶ補木辺がないときは、この色の割当てが実際に2彩色になっている。」と書かれていますが、
間違っています。

反例は3枚目の画像を参照してください。
0395デフォルトの名無しさん垢版2017/06/21(水) 11:11:21.29ID:CsbvaOkp
商品の説明
内容紹介
ネットワーク・人工知能の基礎となるグラフ・ネットワークを学ぶ

アマゾンに商品説明として、↑のように書かれています。

人工知能とグラフ・ネットワーク理論に何の関係があるのでしょうか?

この出版社は、「世界標準MIT教科書」などとタイトルに書いたり、売るためには
手段を選ばない出版社ですね。
0397デフォルトの名無しさん垢版2017/06/21(水) 12:37:14.26ID:L1LFWazB
外国には「たのしいRuby」が無い

日本人が20時間で勉強できることを、何十時間も掛けて勉強して、なおかつ理解できない。
だから、MIT に頼る

外人でも知っている人は、Ruby でツールを作る。
Chef, Vagrant, SASS とか

Homebrew もRubyで作られているのだから、
Apple は、もっとRubyに力を入れるべき
0400デフォルトの名無しさん垢版2017/06/21(水) 13:14:54.71ID:CsbvaOkp
>>399

「同じ深さの点を結ぶ補木辺がないときは、この色の割当てが実際に2彩色になっている。」

3枚目の画像には同じ深さの点を結ぶ補木辺がありません。
ですが、2彩色ではありません。
0402デフォルトの名無しさん垢版2017/06/21(水) 13:33:59.73ID:CsbvaOkp
要するに、↓が間違っているわけです。

「補木辺は、同じ深さの点を結んでいるか、あるいは深さが 1 異なる点を結んでいることに注意しよう。」
0403デフォルトの名無しさん垢版2017/06/21(水) 13:55:32.90ID:BP6mUhEj
ここじゃなくて著者なり出版社なりに連絡しなよ
その方がちゃんと議論できるだろうし修正されればあとから読む人の為になるよ
0405デフォルトの名無しさん垢版2017/06/21(水) 16:12:29.38ID:e3wPbus7
>394
三枚目の図は、反例になっていない。
あなたが幅優先探索を理解できていないだけで、書籍の記述は間違っていないよ。
根でない2つの頂点は、どちらも、根から辺が張られていて、根と隣接しているのだから、同じ深さの位置にある。
0406デフォルトの名無しさん垢版2017/06/21(水) 18:57:35.69ID:CsbvaOkp
あ、勘違いしました。

無向グラフでしたね。
0407デフォルトの名無しさん垢版2017/06/21(水) 19:28:34.24ID:TkpRSZSL
教科書だって間違いはいくらでもある。
だからといって、間違いらしきものを見つけて喜々としてあげつらうのではなく、
自分の解釈ではこうだが違うのだろうかという態度で質問しておけばよかったね。
0409デフォルトの名無しさん垢版2017/06/23(金) 09:05:15.05ID:0OdP20aK
>>393-394
他人の誤りを指摘するときに
自分でも誤るとか恥ずかしくないか
0412デフォルトの名無しさん垢版2017/06/23(金) 19:23:07.84ID:vbPiU/7d
KIZLA7]]]

%≒72%,M,L,TO"JYOJA"
0413デフォルトの名無しさん垢版2017/06/26(月) 15:07:57.81ID:wjem+ipT
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)ですが、この
本には強連結成分分解のアルゴリズムは書いてあるのですが、その正しさについて
の説明がありません。

「アルゴリズムの正当性については演習問題とする。」などと書かれているだけです。
そして、解答がありません。

解答をつけないほど簡単な問題でしょうか?

エイホ、ホップクロフト、ウルマン著『データ構造とアルゴリズム』に分かりやすい説明がありました。
0414デフォルトの名無しさん垢版2017/06/26(月) 15:09:29.86ID:wjem+ipT
あ、よくみたら解答がありました。
0415デフォルトの名無しさん垢版2017/06/26(月) 15:14:33.33ID:wjem+ipT
強連結成分分解のアルゴリズムはグラフ理論的な観点からは興味深いですが、
応用についてはあまりないようですね。

浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)の「はじめに」に
「強連結成分分解はシステムの故障診断や効率的解析への応用があると言われている。」
などと書かれいます。浅野さん自身は応用について具体的な詳細を知らないと宣言して
いるようなものですね。
0416デフォルトの名無しさん垢版2017/06/26(月) 15:27:14.29ID:H+izVTcm
ステマ乙としか
0417デフォルトの名無しさん垢版2017/06/26(月) 15:32:39.93ID:wjem+ipT
ところで、LEDAというライブラリはお勧めですか?
0419デフォルトの名無しさん垢版2017/06/27(火) 13:16:02.75ID:NGLAHv1W
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)を読んでいます。

G のトポロジカルラベリングについては説明があるのですが、トポロジカルソートの応用例が
全く書かれていません。

勉強するモチベーションが全くありません。

著者は一体何を考えているのでしょうか?
0424デフォルトの名無しさん垢版2017/06/27(火) 19:32:13.18ID:NGLAHv1W
あ、その後の有向無閉路ネットワークの最長パスを求めるアルゴリズムで
トポロジカルラベリングが使われていました。

なかなか面白い応用ですね。

この本、説明にちょっと粗雑なところもありますが、見せ場があって楽しいですね。
0425デフォルトの名無しさん垢版2017/06/27(火) 19:34:40.25ID:NGLAHv1W
有向無閉路ネットワークという制限が強すぎますね。

でもこの制限のおかげでちょっと面白いトポロジカルラベリングの応用例が見れたわけですね。
0426デフォルトの名無しさん垢版2017/06/27(火) 21:47:11.43ID:i+35CN1y
プログラミング・コンテスト・チャレンジブック、第2版、2012

ほとんど全てのアルゴリズムを網羅。
問題数も多く、パズル感覚で楽しめる。
AIやシミュレーションゲームの参考になる
0427デフォルトの名無しさん垢版2017/06/27(火) 21:55:21.79ID:NGLAHv1W
>>426

網羅からはほど遠いと思います。
0428デフォルトの名無しさん垢版2017/06/27(火) 21:58:43.82ID:NGLAHv1W
>>426

それとアルゴリズムの正当性のまともな説明がありません。

計算量の評価についてもまともな説明はありません。
0430デフォルトの名無しさん垢版2017/06/28(水) 02:20:53.63ID:W36D2Opo
入門 データ構造とアルゴリズム、2013、オライリー
Narasimha Karumanchi(インド人) 著

アルゴリズムなら、セジウィックでも読めば?

プログラミング・コンテスト・チャレンジブックは、
コンテストの問題を集めた本だから、便利

一々、ウェブサイトの問題を見なくても良いから、楽
0431デフォルトの名無しさん垢版2017/06/28(水) 05:10:12.09ID:6P8PW2pA
>>430

そのインド人の本は、アルゴリズムの正当性のまともな説明がありません。

計算量の評価についてもまともな説明がありmせん。

セジウィックのAlgorithms 4th Editionはいい本ですが、計算量の評価については
まともな説明がないように思います。
0432デフォルトの名無しさん垢版2017/06/28(水) 05:17:01.98ID:6P8PW2pA
D40

T をグラフ G の全域木とする。
C を G のサイクルとする。
AB を C および T に含まれる辺とする。

このとき、 T から AB を除去し、辺 UV を追加したときに、
依然として G の全域木であるような辺 UV が C の中に
含まれることを示せ。
0433デフォルトの名無しさん垢版2017/06/28(水) 06:24:05.46ID:6P8PW2pA
>>432


T は木であるからサイクルを含まない。
よって、 C には T に含まれないような辺が少なくとも一つは存在する。
T は全域木であるから、そのような辺の両端点を結ぶ T の辺のみからなる(一意的な)パスが存在する。

仮に、 T に含まれないような C の辺たちの両端点を結ぶ T の辺のみからなるパスたちがすべて AB を含まない
と仮定すると、 A から B への T の辺のみからなるパスで辺 AB を含まないようなものが存在することになる。
A, B という A から B へのパスは、辺 AB を含み T の辺のみからなる。よって、 A から B への T の辺のみから
なるパスが2つ以上存在することになるが、これは木の性質に反する。

よって、 T に含まれないような C の辺たちの両端点を結ぶ T の辺のみからなるパスたちの中には、 AB を含む
ようなものが存在する。そのようなパスを U, …, A, B, …, V とする。 T から AB を除去し、辺 UV を追加し
たときにできる部分グラフは明らかに T と同じ数の辺をもち、依然として連結なままである。点の数が v で
辺の数が v - 1 であるような連結なグラフは木であるから、そうような部分グラフは木である。
0434デフォルトの名無しさん垢版2017/06/28(水) 06:52:24.02ID:6P8PW2pA
>>432

ヒントとして、 「T - AB は2成分からなる森である」と書いてあるのですが、
このヒントを利用した解答はどうなるのでしょうか?
0435デフォルトの名無しさん垢版2017/06/28(水) 10:22:23.33ID:6P8PW2pA
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)を読んでいます。

↓は、ある点から各点への最長パスを求めるプログラムのメイン関数です。
「出発点を入力してください」などと出力していますが、出発点は 1 でないとダメです。
なぜかというと depth_first() 関数がかならず 1 から深さ優先探索を開始するからです。
↓を見ると、あたかも、出発点に選択の余地があるかのようです。なぜ、こんなことを
しているのか意味不明です。

int main(void){
■■■■directed_network_input();
■■■■// 有向ネットワークの辺数m,点数n,各辺の始点,終点,長さが決定される
■■■■dicomp_incidence_list_construct(); // 接続辺リストが構成される
■■■■printf("出発点を入力してください\n");
■■■■scanf("%d", &s);
■■■■printf("出発点 = %d \n", s); // sからすべての点が到達可能であることを仮定
■■■■depth_first(); // 深さ優先探索をして後行順ラベルを求める
■■■■tpsort(); // トポロジカルソートを行う(tporder[1]==sとなることを仮定)
■■■■longestpath_from(s);// sからの到達可能な点への最長パスが計算される
■■■■longestpath_output();// sからの到達可能な点への最長パスが出力される
■■■■return 0;
}
0436デフォルトの名無しさん垢版2017/06/28(水) 10:54:52.65ID:6P8PW2pA
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)を読んでいます。

ひどいバグを発見しました。

void longestpath_from(int s){// sからの到達可能な点への最長パスを計算する関数
■■■■int a, j, v, w;
■■■■dmax[s]=0; // sからsへの最長パスの長さは0である
■■■■path[s]=0; // sからの到達可能な点への最長パス木の根がsである
■■■■for (j = 1; j <= n; j++) {// トポロジカルソートに基づいて
■■■■■■■■v= tporder[j];
■■■■■■■■// sからvまでの最長パスの長さdmax[v]とパス上でvの直前の点path[v]の計算
■■■■■■■■a=revedgefirst[v]; // vを終点とする辺のリストの先頭の辺がaである
■■■■■■■■w=tail[a]; // wはaの始点
■■■■■■■■if(j == 1) printf("v = %2d, a = %2d, w = %2d", v, a, w); //debug
■■■■■■■■dmax[v]=dmax[w]+length[a]; // 式(4.2)に基づくdmax[v]の初期設定
■■■■■■■■path[v]=w; // 式(4.2)に基づくpath[v]の初期設定
■■■■■■■■a=revedgenext[a]; // aの次の辺をaとする
■■■■■■■■while (a != 0) {// vを終点とする辺のリストの末尾の辺になるまで繰り返す
■■■■■■■■■■■■w=tail[a]; // wはaの始点
■■■■■■■■■■■■if (dmax[v] < dmax[w]+length[a]){// wを経由したほうがより長いとき
■■■■■■■■■■■■■■■■dmax[v] = dmax[w]+length[a]; // wを経由するほうに更新する
■■■■■■■■■■■■■■■■path[v]=a; // aに更新する
■■■■■■■■■■■■}
■■■■■■■■■■■■a=revedgenext[a]; // aの次の辺をaとする
■■■■■■■■}
■■■■}
}
0437デフォルトの名無しさん垢版2017/06/28(水) 10:57:07.89ID:+O8L6XqQ
366 :nobodyさん 2017/05/29(月) 16:07:39.16 ID:6v4UcGhE
今回の民法改正、ソフトウェア受託開発の場合、(検収後ではなく)バグ発見後1年瑕疵担保責任があるということで、地獄かよ、と思ったが、
元々問題が起きがちな受託案件がビジネス的に成立しなくなることで強制的に業界再編につながるなら良いことかもと思うようになった。
一部で地獄を見ても。
https://twitter.com/yukihiro_matz/status/869061879389343744

367 :nobodyさん 2017/05/29(月) 16:28:06.55 ID:6v4UcGhE
ニュース - 改正民法が成立、「瑕疵担保責任」などシステム開発契約に影響大:ITpro
http://b.hatena.ne.jp/entry/itpro.nikkeibp.co.jp/atcl/news/17/052601508/

372 :nobodyさん2017/05/29(月) 19:10:37.12 ID:???
Railsでシステム作って納品する

Railsはマイナー、メジャーのアップデートが半年以内に必ずある

客がアップデートする。アップデートによるエラーやバグ、動作の不具合に気づく

気づいてから1年以内に通知すれば、5年間無料保証ゲット

つまりRailsがアップデートするたびに、無償の修正作業を発生するということかな

376 :nobodyさん2017/05/30(火) 09:20:20.09 ID:L5po86sS
>>378>>379>>375
客が瑕疵担保責任法の法改正を知ってくると思うから、今後5年無償保証をお願いされるだろう
営業がそれでも仕事を取ってこれるか?たぶん無理だろう。無限の直していたら赤字になる。
こういう保守に弱い言語、ころころ仕様が変わる言語は仕事として発生しなくなってくる。
これは変わり目だ。お前らも早く逃げたほうがいいぞ。RubyやPHPなど動的言語は確実に廃れる。
保守に強い言語のみ生き残れる。
0438デフォルトの名無しさん垢版2017/06/28(水) 11:02:48.67ID:6P8PW2pA
↑の for 文は j = 1 から始まっています。

v == tporder[1] == 1 です。
a == revedgefirst[1] == 0 です。

ところが、この本では配列のインデックスは 1 からしか利用していません。
インデックスが 0 の要素は初期化すらしていません。
どうも配列を初期化しないと値は不定だそうですが、実際には 0 で初期化されることが
多いようです。

仕様では不定であるはずの

tail[0]
dmax[0]
length[0]

がたまたま 0 で初期化されるため、偶然、問題なく動作しています。

正しくは、

for 文は j = 2 から始めなくては駄目です。
0439デフォルトの名無しさん垢版2017/06/28(水) 11:19:51.44ID:6P8PW2pA
あ、もう一つバグがありました↑

path[v]=w; // 式(4.2)に基づくpath[v]の初期設定

となっていますが、

path[v]=a; // 式(4.2)に基づくpath[v]の初期設定

でなければなりません。
0440デフォルトの名無しさん垢版2017/06/28(水) 12:31:24.06ID:W36D2Opo
>>438
>インデックスが 0 の要素は初期化すらしていません

配列[0] を使わないのなら、初期化する必要はない
0441デフォルトの名無しさん垢版2017/06/28(水) 12:34:24.00ID:6P8PW2pA
>>440

そうですが、

for(j = 1;

とすると

意図せず配列[0]を使うことになってしまいます。

この値がたまたま 0 で初期化されていて、かつ 0 であれば正しく動くため、
問題が表面化していないだけです。
0442デフォルトの名無しさん垢版2017/06/28(水) 12:37:24.37ID:6P8PW2pA
有向無閉路ネットワークの最長パスをトポロジカルラベリングを利用して、
求めるアルゴリズムって他の本に載っていますか?

あまりにも特殊すぎて載っていないのではないかと推測しますが。

この本は、鮮やかに解けるように問題を特殊化して見せ場を作っていますね。
0443デフォルトの名無しさん垢版2017/06/28(水) 13:17:27.40ID:6P8PW2pA
>>426

その本を読むのでしたら、

浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

のほうがCプログラムも載っていますし、面白いと思いますよ。

オイラーグラフの一筆書きのプログラムがあったりします。
0447デフォルトの名無しさん垢版2017/06/28(水) 18:29:25.09ID:6P8PW2pA
>>444

このプログラムだけ見てももちろん分からないと思います。

a == revedgefirst[1] == 0 なので、 tail[a] == tail[0] です。
0448デフォルトの名無しさん垢版2017/06/28(水) 18:29:51.34ID:6P8PW2pA
訂正します:

>>445

このプログラムだけ見てももちろん分からないと思います。

a == revedgefirst[1] == 0 なので、 tail[a] == tail[0] です。
0449デフォルトの名無しさん垢版2017/06/28(水) 18:33:38.48ID:6P8PW2pA
さらに、

v == tporder[1] == 1 です。
0450デフォルトの名無しさん垢版2017/06/29(木) 11:58:28.12ID:df4uIsIb
http://imgur.com/A84Qz1i.jpg
http://imgur.com/NsXCsS1.jpg
http://imgur.com/Bm7ANHm.jpg
http://imgur.com/iSqMNes.jpg

↑は浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)です。
1枚目と2枚目の画像が連結な有向オイラーグラフの一筆書きを求めるアルゴリズムです。
3枚目と4枚目の画像がそのアルゴリズムの正しさの証明です。


「連結グラフ G が一筆書きできるための必要十分条件は、 G がオイラーであることである。」

という定理の証明において、十分性は、↑の3枚目と4枚目の画像の定理5.3により分かるということが書いてあります。

↑の3枚目と4枚目の画像を読めば分かりますが、十分性について証明されていないように思います。

どうでしょうか?
0451デフォルトの名無しさん垢版2017/06/29(木) 12:19:34.40ID:df4uIsIb
むしろ、十分性が成り立つことを前提にしてアルゴリズムの正しさを証明しているように思います。
0453デフォルトの名無しさん垢版2017/06/30(金) 13:39:18.75ID:8CLI6C9V
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

ホップクロフト - カープのアルゴリズムのところを読んでいます。

段々、面白いアルゴリズムが登場してきていますね。

日本語のアルゴリズムの本は本当に初歩的な本が多いですが、なぜなのでしょうか?

例えば、ホップクロフト - カープのアルゴリズムが載っている本はあるでしょうか?

日本語の本に載っているのは、

リスト、ハッシュ、ヒープ、2分探索木、平衡木、ソート、最短経路、文字列

とかそんなもんだけですよね。
0455デフォルトの名無しさん垢版2017/06/30(金) 20:21:27.99ID:QJcLAte5
それ以上の難解アルゴリズムに挑戦する頭脳があれば英語の習得は容易いので、結果すでにある英語本を買うようになると予想
0456デフォルトの名無しさん垢版2017/07/01(土) 09:37:54.54ID:OLSj8alI
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)
ホップクロフト - カープのアルゴリズムのところを読んでいます。


do {// マッチされていない左端点からマッチされていない右端点へのパスがある限り
■■■■levelgraph(); // レベルグラフの構成
■■■■if (t_found != n+2) augmentation(); // パスがあるときにはマッチングの更新
} while (t_found != n+2);

などというコードがあります。

do {// マッチされていない左端点からマッチされていない右端点へのパスがある限り
■■■■levelgraph(); // レベルグラフの構成
■■■■if (t_found == n+2) break;
■■■■else augmentation(); // パスがあるときにはマッチングの更新
} while (1);

と書いた方が分かりやすいですよね。

augmentation() 内では、グローバル変数 t_found の値は変更されません。
なので、以下のように書くのが標準的だと思います。

levelgraph();
while(t_found != n + 2){
■■■■augmentation();
■■■■levelgraph();
}
0457デフォルトの名無しさん垢版2017/07/01(土) 09:42:20.68ID:OLSj8alI
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)を読んでいます。

a = edgefirst[v1];
while(a != 0){
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
a = edgenext[a];
}

などというコードが本書のソースコードのいたるところで使われています。

↓のように書くべきですよね。

for(a = edgefirst[v1]; a != 0; a = edgenext[a]){
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
■■■■
}
0458デフォルトの名無しさん垢版2017/07/01(土) 09:46:11.85ID:OLSj8alI
茨木俊秀さんの本でも感じましたが、ひどいコードを書く人が多いですよね。

一番、驚いたのが野崎昭弘さんの本です。

goto 文を使わなくていいところで常用しています。
0460デフォルトの名無しさん垢版2017/07/01(土) 09:55:39.01ID:PrUYVLVg
伏字かと思ったらインデントかよ。
これが見やすいと思ったんだろうか?ここに辿り着くまでの思考過程を見てみたいわ。
0461デフォルトの名無しさん垢版2017/07/01(土) 09:59:03.29ID:OLSj8alI
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)
ホップクロフト - カープのアルゴリズムのところを読んでいます。

for (v = 1; v <= n; v++) parent[v] = unvisited;

というコードがあります。

点 v の親の処理ですが、深さ優先探索で使う定数である unvisited == -1 を流用しています。
親は訪問するものではないにもかかわらずです。
単に -1 という値が使いたいだけです。

ひどいコードです。
0463デフォルトの名無しさん垢版2017/07/01(土) 12:35:14.71ID:OLSj8alI
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)
ホップクロフト - カープのアルゴリズムのところを読んでいます。

このプログラムですが、意味不明に冗長なところがあるので超分かりにくいです。

もし、この本を読む人は、注意した方がいいです。

分かりやすい等価なコードにすこしずつ変えながら読んでいます。
0464デフォルトの名無しさん垢版2017/07/01(土) 20:40:17.40ID:OLSj8alI
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)
ホップクロフト - カープのアルゴリズムのところを読んでいます。

プログラムに、非常に非効率な部分を発見しました。

深さ優先探索で最短パスを探す部分があるのですが、一つの最短パスを
発見した後も、うろうろと探索を続けています。 return 文で呼び出し元へと
遡って戻るべき箇所です。

具体的にいうと、p.95の void bipartite_dfs(int) 関数内の

bipartite_dfs(w1);

は、

bipartite_dfs(w1);
if(pathfound) return;

とすべきです。
0466デフォルトの名無しさん垢版2017/07/01(土) 23:27:45.18ID:OLSj8alI
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

のHopcroft-Karpのアルゴリズムのプログラムを一切変更を加えずに使用して、
Aizu Online Judgeの2部グラフのマッチングの問題を解かせてみたら、
1問目から正しい結果が得られませんでした。

浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

では一つの例に対して、プログラムをチェックしているだけです。
その例に対しては正しい結果が得られます。

著者はおそらく他の例についてはチェックしていないと思われます。

これから原因を究明しようと思います。

ちなみに

浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

での例ですが、この著者の旧著でも全く同じ例を使っています。

使いまわしですね。他の例は一度もチェックしていないようです。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0467デフォルトの名無しさん垢版2017/07/01(土) 23:59:37.67ID:OLSj8alI
あ、勘違いでした。

入力のフォーマットが会津と浅野の本で違いました。
0468デフォルトの名無しさん垢版2017/07/02(日) 12:42:08.55ID:KDfMECXZ
マッチングといっても、いろいろな問題があるんですね。

安定マッチングと最大マッチングは互いに何の関係もない全く異なる問題ですね。

↓の講義は、安定マッチングについてですが、簡単ですね。

https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/video-lectures/lecture-7-matching-problems/#vid_related

MITの微分積分の講義を見ると学生のレベルが低いという印象ですが、この講義を見ると
そうでもないような印象です。
0469デフォルトの名無しさん垢版2017/07/02(日) 13:22:29.16ID:KDfMECXZ
>>468

なんか明らかなことをダラダラと証明していますね。
0470デフォルトの名無しさん垢版2017/07/03(月) 08:45:45.65ID:b174092u
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

を読んでいます。

定理:
G のマッチング M に対して、 M が最大マッチングであるための必要十分条件は M に
関する増加パスが存在しないことである。

という定理が書いてあります。

十分性の証明が長すぎます。見た目はちょっとすっきりとしていていいのですが、長くて
素朴な証明法ではありません。
0471デフォルトの名無しさん垢版2017/07/03(月) 08:46:22.05ID:b174092u
以下のような証明が素朴なよい証明だと思います。

G のマッチング M に対して、 M が最大マッチングであるための必要十分条件は M に関する増加パスが存在しないことである。

必要性は明らかである。

十分性について証明する。

G は連結である場合に証明できれば、 G が連結でない場合にも、明らかに定理は成り立つ。
そのため、 G は連結であると仮定する。

G には、 M に関する増加パスが存在しないと仮定する。
M の辺に接続されていない点をFreeな点と呼ぶことにする。

G にFreeな点が2点以上存在することはないことを背理法によって証明しよう。
a, b を G の任意のFreeな2点とする。 G は連結だから、 a, b を結ぶ単純なパスが存在する。
a = a_1, …, a_k = b をその単純なパスとする。
このとき、 a_1, …, a_i に含まれるFreeな点の数が 2 であるような i ≧ 2 が存在することは明らかである。
単純なパス a_1, …, a_i は明らかに増加パスである。
これは、 G には、 M に関する増加パスが存在しないという仮定に反する。

よって、 G にFreeな点が2点以上存在することはない

G にFreeな点が1点存在する場合には、 G の点の数は、奇数であり、明らかに M は最大マッチングである。
G にFreeな点が1点も存在しない場合には、 G の点の数は、偶数であり、明らかに M は最大マッチングである。
0472デフォルトの名無しさん垢版2017/07/03(月) 08:55:27.46ID:b174092u
なんか他の本を調べてみても、

>>471

のような素朴な証明法が載っていませんね。

ソートするアルゴリズムが存在することを示せ

という問題があったとして、答えとして、バブルソートをあげれば十分であるにもかかわらず、
ヒープソートをあげるようなもんですね。
0473デフォルトの名無しさん垢版2017/07/03(月) 12:01:19.36ID:2KgtUC+G
>471

頂点a b c d eがあって、
辺が、
a b
a c
a d のとき、
Mとして
a bを選べば、増加パスはないけど、
cとdはFreeな頂点になるのでは?
0474デフォルトの名無しさん垢版2017/07/03(月) 12:17:16.61ID:b174092u
>>473

ありがとうございます。

>>471
は間違いですね。
0476デフォルトの名無しさん垢版2017/07/03(月) 23:57:03.23ID:kWtGcdOg
>>474

ヽ(・ω・)/ズコー
0478デフォルトの名無しさん垢版2017/07/07(金) 10:19:21.25ID:LuN3QDVY
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)を読んでいます。

ネットワークフローについてですが、
ソースから流出する総フローが、
シンクに流入する総フローに
等しいということを自明のこととして、
証明していません。

これはOKなのでしょうか?
0480デフォルトの名無しさん垢版2017/07/07(金) 11:03:27.05ID:LuN3QDVY
やはり証明は必要なんですね。
↓の本に証明が載っていました。

組合せ数学入門 II (共立全書)
C.L.リウ
https://www.amazon.co.jp/dp/4320005422
0481デフォルトの名無しさん垢版2017/07/07(金) 11:04:16.11ID:LuN3QDVY
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)

は、計算量の評価の説明がひどすぎます。

ほとんど結果しか書いていません。
0482デフォルトの名無しさん垢版2017/07/07(金) 11:53:23.95ID:LuN3QDVY
>>478

少し後のところで、
ソースから流出する総フローが、
シンクに流入する総フローに
等しいという結果を特別な場合として
含むような結果を示していました。

ソースから流出する総フローが、
シンクに流入する総フローに
等しいということが自明なことならば、
そのより一般化された結果も自明です。

著者の態度は矛盾していますね。
0484デフォルトの名無しさん垢版2017/07/07(金) 17:37:48.39ID:LuN3QDVY
今、ウィルソンのグラフ理論の本を見てみたのですが、内容がスカスカですね。

アルゴリズム的なグラフ理論の本のほうが分かりやすいし、面白いですね。
0485デフォルトの名無しさん垢版2017/07/07(金) 19:30:12.19ID:LchmZiK1
「29歳既婚、2年前に会社を辞めた。ボードゲーム作りを始めて3700万円を
売り上げたけど何か聞きたいことはある?」回答いろいろ
http://labaq.com/archives/51880196.html
日本ボードゲーム界の異端児に聞く!ボードゲームデザイナーとして生きていくには?
https://bodoge.hoobby.net/columns/00013
カードゲームを自作する1 【自宅でカード印刷】
http://tanishi.org/?p=801
100円ショップでボードゲームを自作しよう
https://sites.google.com/site/jun1sboardgames/blog/makeyourbg
ノーアイデアでボードゲームを作ろう第1回「100円ショップで物を買う」
http://boardgamelove.com/archives/boardgame-make-1/
ボードゲーム市場がクラウドファンディングの出現で急成長を遂げ市場規模を拡大中
http://gigazine.net/news/20150820-board-game-crowdfunding/
自作ゲーム即売会「ゲームマーケット」に1万人超
http://www.nikkansports.com/general/nikkan/news/1750500.html
ボードゲームの展示イベント「ゲームマーケット」の成長記録からこれからの
市場に必要なことを妄想してみた。6年間の来場者数推移(2016年4月時点調べ)
https://bodoge.hoobby.net/columns/00001
0487デフォルトの名無しさん垢版2017/07/08(土) 09:51:52.03ID:bx7kaphQ
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)の
Ford - Fulkerson のアルゴリズムのプログラムを読んでいます。

ひどいプログラムです。

たとえば、深さ優先探索を行う関数を見てください↓

void dfs(int v, int path[]){// vからの深さ優先探索
■■■■int afwd, abk, w;
■■■■afwd = edgefirst[v];
■■■■while (afwd != 0 && rescap[afwd] == 0) afwd = edgenext[afwd];
■■■■while (t_found == false && afwd != 0) {// 増加パスはまだ発見されいない限り
■■■■■■■■w = head[afwd];
■■■■■■■■if (path[w] == unvisited) {// wが未訪問であったらwへ前進
■■■■■■■■■■■■abk = afwd+1; // abkはafwdの逆向きの辺
■■■■■■■■■■■■if (afwd % 2 ==0) abk = afwd-1;
■■■■■■■■■■■■path[w] = abk; // afwdの逆向きの辺abkをpath[w]に記憶する
■■■■■■■■■■■■if (w != t) dfs(w,path); // wからの深さ優先探索へ進む
■■■■■■■■■■■■else {// w == t なので増加パスPが見つかった
■■■■■■■■■■■■■■■■t_found=true; // dfs(v,path)の強制終了へ
■■■■■■■■■■■■}
■■■■■■■■}
■■■■■■■■if (t_found == false) { // dfs(v,path)が強制終了になっていないときのみ
■■■■■■■■■■■■ afwd = edgenext[afwd]; //次の辺に移る
■■■■■■■■■■■■ while (afwd != 0 && rescap[afwd] == 0) afwd = edgenext[afwd];
■■■■■■■■}
■■■■}
}
0489デフォルトの名無しさん垢版2017/07/08(土) 10:07:07.69ID:bx7kaphQ
↓は、↑と等価なプログラムです。

すっきりとしていて分かりやすいですね。↓

void dfs(int v, int path[]){
■■■■int afwd, abk, w;
■■■■afwd = edgefirst[v];
■■■■for(afwd = edgefirst[v]; afwd != 0; afwd = edgenext[afwd]){
■■■■■■■■if(rescap[afwd] == 0) continue;
■■■■■■■■w = head[afwd];
■■■■■■■■if(path[w] == unvisited){
■■■■■■■■■■■■if(afwd % 2 == 0){
■■■■■■■■■■■■■■■■abk = afwd - 1;
■■■■■■■■■■■■}else{
■■■■■■■■■■■■■■■■abk = afwd + 1;
■■■■■■■■■■■■}■■■■■■■■
■■■■■■■■■■■■path[w] = abk;
■■■■■■■■■■■■if(w != t){
■■■■■■■■■■■■■■■■dfs(w, path);
■■■■■■■■■■■■}else{
■■■■■■■■■■■■■■■■t_found = true;
■■■■■■■■■■■■■■■■return;
■■■■■■■■■■■■}
■■■■■■■■}
■■■■}
}
0490デフォルトの名無しさん垢版2017/07/08(土) 10:10:00.82ID:bx7kaphQ
浅野孝夫著『グラフ・ネットワークアルゴリズムの基礎』(近代科学社)のプログラムは
すべて↑こんな感じなので、いちいち自分でまともな等価なプログラムに改善してから
読む必要に迫られます。
0493デフォルトの名無しさん垢版2017/07/08(土) 14:20:34.28ID:bx7kaphQ
for-2ch-codes/FlowLibrary.h

↓こちらが浅野さんの Ford - Fulkerson のアルゴリズムのソースコードです:
for-2ch-codes/asano_fordfulkerson.c

↑なぜ、こんな分かりにくいコードを書けるのか不思議です。
アルゴリズムの研究者なのに、プログラミングをしたことがないのでしょうか?

↓こちらが浅野さんのコードを読みやすくした等価なコードです:
for-2ch-codes/my_fordfulkerson.c
0494デフォルトの名無しさん垢版2017/07/08(土) 14:21:50.45ID:bx7kaphQ
https://github.com/for-2ch/for-2ch-codes/blob/master/FlowLibrary.h

↓こちらが浅野さんのソースコードです:
https://github.com/for-2ch/for-2ch-codes/blob/master/asano_fordfulkerson.c

↑なぜ、こんな分かりにくいコードを書けるのか不思議です。
アルゴリズムの研究者なのに、プログラミングをしたことがないのでしょうか?

↓こちらが浅野さんのコードを読みやすくした等価なコードです:
https://github.com/for-2ch/for-2ch-codes/blob/master/my_fordfulkerson.c
0495デフォルトの名無しさん垢版2017/07/08(土) 14:46:01.89ID:shVOEDs/
■■■■■■■■■■■■■
■■このスレ闇が深すぎ■■
■■■■■■■■■■■■■
0498 ◆QZaw55cn4c 垢版2017/07/08(土) 18:49:23.91ID:/o9ObF5e
>>497
高等な趣味だと思うよ,よく頑張っているね
0500デフォルトの名無しさん垢版2017/07/09(日) 17:28:01.51ID:X4hx0gz3
お前ら、ちゃんと次スレ立ててやれよ?
隔離スレさえあればこっちに被害は及ばないからな
0503デフォルトの名無しさん垢版2017/07/10(月) 10:06:36.48ID:BQfNYjN8
比較によるソートの比較回数の下限についての議論で決定木が登場します。

決定木の葉の数が n! 以上だという記述があるのですが、ちょうど n! ではないのでしょうか?

意味不明です。
0504デフォルトの名無しさん垢版2017/07/10(月) 13:49:55.16ID:BQfNYjN8
そもそも決定木って何ですか?
0505デフォルトの名無しさん垢版2017/07/10(月) 14:01:08.40ID:BQfNYjN8
例えば、決定木の内部ノードに 1: 2 というのノードにおいて、
a_1 ≧ a_2 であるか a_1 < a_2 であるかを計算しますが、
その計算結果を捨ててしまってもいいんですよね?
0506デフォルトの名無しさん垢版2017/07/10(月) 14:02:15.57ID:BQfNYjN8
例えば、決定木の内部ノードに 1: 2 というノードがあったとすると、そのノードにおいて、
a_1 ≧ a_2 であるか a_1 < a_2 であるかを計算しますが、その計算結果を捨ててしまっ
て以後利用しなくてもいいんですよね?
0510デフォルトの名無しさん垢版2017/07/10(月) 18:34:52.99ID:BQfNYjN8
段々、言いたいことが分かってきました。

a1, a2, a3, a4 を比較によってソートするあるアルゴリズムがあるとします。

そのアルゴリズムには対応する決定木 T が存在します。

深さ k の決定木の葉の数の最大値は明らかに 2^k です。(深さ k の完全2分木の場合)

a1, a2, a3, a4 の大小関係の可能性は、以下の 4! = 24 通りあります。

a1 < a2 < a3 < a4
a1 < a2 < a4 < a3

a4 < a3 < a2 < a1

そのすべての可能性に対してそのアルゴリズムはソートしなければならないので、
T の葉の数はちょうど 24 であるはずです。

深さ 1 の決定木はただ一つ存在し、葉の数は 2 です。
24 ≠ 2 なので、 T の深さは 1 ではありません。

深さ 2 の決定木の葉の数の最大値は 2^2 = 4 です。

24 ≦ 4 ではないため深さ 2 の決定木では、 24 個の葉を収容できません。

深さ 3 の決定木の葉の数の最大値は 2^3 = 8 です。

24 ≦ 8 ではないため深さ 3 の決定木では、 24 個の葉を収容できません。
0511デフォルトの名無しさん垢版2017/07/10(月) 18:37:08.78ID:BQfNYjN8
深さ 4 の決定木の葉の数の最大値は 2^4 = 16 です。

24 ≦ 16 ではないため深さ 4 の決定木では、 24 個の葉を収容できません。

深さ 5 の決定木の葉の数の最大値は 2^5 = 32 です。

24 ≦ 32 であるため深さ 5 の決定木には、 24 個の葉を収容可能です。

以上から、決定木 T の葉の深さは最低でも 5 である必要があります。
0512デフォルトの名無しさん垢版2017/07/10(月) 18:52:50.18ID:BQfNYjN8
a_1, a_2, …, a_n を比較によってソートするあるアルゴリズムがあるとします。

そのアルゴリズムには対応する決定木 T が存在します。

深さ k の決定木の葉の数の最大値は明らかに 2^k です。(深さ k の完全2分木の場合)

a_1, a_2, …, a_n の大小関係の可能性は、以下の n! 通りあります。

a_1 < a_2 < … a_(n-1) < a_n
a_1 < a_2 < … a_n < a_(n-1)

a_n < a_(n-1) < … < a_1

そのすべての可能性に対してそのアルゴリズムはソートしなければならないので、
T の葉の数はちょうど n! であるはずです。

n! 個の葉を収容するためには、 T の深さを k とすると、

n! ≦ 2^k

が成り立たなければなりません。

よって、

lg(n!) ≦ lg(2^k) = k*lg(2) = k

が成り立たなければなりません。
0513デフォルトの名無しさん垢版2017/07/10(月) 18:53:05.24ID:BQfNYjN8
lg(n!) = Θ(n*lg(n)) ですので、

Θ(n*lg(n)) ≦ k

が成り立ちます。

以上より、比較によってソートする最高速度のアルゴリズムでも、その決定木の深さは
少なくとも Θ(n*lg(n)) の深さがあります。

よって、その最高速度のアルゴリズムにとって最悪のデータ a_1, a_2, …, a_n を与えた場合、
少なくとも Θ(n*lg(n)) 回の比較が必要です。
0514デフォルトの名無しさん垢版2017/07/10(月) 18:57:08.74ID:BQfNYjN8
訂正します:

lg(n!) = Ω(n*lg(n)) ですので、

Ω(n*lg(n)) ≦ k

が成り立ちます。

以上より、比較によってソートする最高速度のアルゴリズムでも、その決定木の深さは
少なくとも Ω(n*lg(n)) の深さがあります。

よって、その最高速度のアルゴリズムにとって最悪のデータ a_1, a_2, …, a_n を与えた場合、
少なくとも Ω(n*lg(n)) 回の比較が必要です。
0515デフォルトの名無しさん垢版2017/07/10(月) 19:00:21.22ID:BQfNYjN8
なんか非常に大雑把な議論で Ω(n*lg(n)) という評価を得ているのに、
ヒープソートやマージソートのような O(n*lg(n)) のアルゴリズムが存在する
というところが不思議ですね。
0518デフォルトの名無しさん垢版2017/07/10(月) 20:08:22.69ID:BQfNYjN8
アマゾンってダメダメですね。

【全品10%ポイント還元】マンガ・雑誌など本全品がお買い得
7/10 18:00〜7/11 23:59のプライムデー限定で全ての商品が10%ポイント還元中! >今すぐチェック

ヤフーショッピングとかで買えば実質30%引きくらいで買えるときもありますよね。
0520デフォルトの名無しさん垢版2017/07/11(火) 02:13:19.92ID:kTultHtx
URLとかファイルパスとかコマンドとかをクッソ汚い文字列として
文字列処理で結合したり変数埋込みしたり正規表現使ったり
するコードとか、
エンコードされたり、エスケープ混じりのぐちゃぐちゃな文字列とか
とにかく汚くて長くて改行されてない文字列処理にも
データ構造やデザインパターンて適用できるの?
またはデータ構造やデザインパターンでソースをきれいに
整形できたりする?
0521デフォルトの名無しさん垢版2017/07/11(火) 10:51:23.09ID:GFhKOZAg
文字列処理っつってもいろいろあんだろ
どういう処理がしたいのかもわからんのにデザパタ適用もクソもあるかよ
0526デフォルトの名無しさん垢版2017/07/12(水) 18:59:57.68ID:BkmceXb8
繁野麻衣子著『ネットワーク最適化とアルゴリズム』を読んでいます。

http://imgur.com/RI1TvXi.jpg

部分グラフの定義がおかしいです。

こんな基礎的なところで間違いを犯しているというのが信じられません。
0527デフォルトの名無しさん垢版2017/07/12(水) 19:25:04.11ID:BkmceXb8
あ、グラフになっていないと部分グラフとは言わないからOKなんですね。

でも分かりにくい表現ですね。
0528デフォルトの名無しさん垢版2017/07/12(水) 19:35:27.04ID:BkmceXb8
A' が空集合の場合はどうするんですかね?
0529デフォルトの名無しさん垢版2017/07/12(水) 19:40:24.94ID:BkmceXb8
空写像って何ですか?
0532デフォルトの名無しさん垢版2017/07/16(日) 19:13:54.39ID:jm8THNZB
D40
http://imgur.com/i8hq9mG.jpg

↑この問題に対する解答ですが、

https://github.com/for-2ch/for-2ch/blob/master/Chapter_D.ipynb

の解答であっていますか?

2週間くらい前に書いたものですが、理解ができません。

仮に、 T に含まれないような C の辺たちの両端点を結ぶ T の辺のみからなる
パスたちがすべて辺 AB を含まないと仮定すると、 A から B への T の辺のみ
からなるパスで辺 AB を含まないようなものが存在することになる。

↑ここが理解できません。
0533デフォルトの名無しさん垢版2017/07/16(日) 19:22:48.15ID:jm8THNZB
あー理解できました。

ここは分かりやすく書き直したほうがいいですね。
0534デフォルトの名無しさん垢版2017/07/16(日) 19:35:47.89ID:jm8THNZB
仮に、 T に含まれないような C の辺たちの両端点を結ぶ T の辺のみからなる
パスたちがすべて辺 AB を含まないと仮定します。

A_1 := A
A_n ;= B

とします。

サイクル C が以下であるとします:

A_1 → … → A_n → A_1

もしも、

辺 A_i → A_(i+1) が T に含まれないときには、

サイクル C の A_i → A_(i+1) の部分を A_i から A_(i+1) への(一意的な) T の辺のみから
なるパスに置き換えます。

すると、 A から B への T の辺のみからなるパスで辺 AB を含まないようなパスが構成できます。

これは A から B への T の辺のみからなるパスが一意的であるという木の性質に反します。
(ほかに A → B という T の辺のみからなる長さ 1 のパスが存在することに注意。)
0536デフォルトの名無しさん垢版2017/07/19(水) 22:52:51.73ID:W3gBCwo8
データ構造とアルゴリズムを勉強するときに、プログラム作成の言語は何がおすすめでしょうか?

なぜ、いまだにC++が幅を利かせているのでしょうか?
0541デフォルトの名無しさん垢版2017/07/21(金) 05:47:07.66ID:oNTvtqyo
Foo foo; と
Foo foo = new Foo();
は何が違うの?

あるクラス内で
private String field; のとき

public String method(String field){
return field;
}
と、
public String method(){
return this.field;
}
は何が違うの?
0542 ◆QZaw55cn4c 垢版2017/07/21(金) 08:00:44.54ID:DB0JoB9N
>>541
>Foo foo; と
>Foo foo = new Foo();
C/C++ か、それとも C#/Java か、はっきりさせよ
0544デフォルトの名無しさん垢版2017/07/21(金) 10:31:24.26ID:AAWIl0Xa
>>541
Foo foo; // 参照型変数fooを宣言
Foo foo = new Foo(); // さらに、メモリのヒープ領域ってとこにFoo型のインスタンスを作成し、その場所を代入

コンストラクタとかでよく見ることになると思うけど
Foo(String name) {
this.name = name;
}
これは想像どおりの挙動をしてくれる
引数とフィールドに同じ名前があったとき
フィールドのものを使いたいときあえてthisつける
Foo() {
String name = "bar";
this.name = name;
}
みたいなときも同じ
名前が被ったとき、フィールド側の変数を選ぶのがthis
0547デフォルトの名無しさん垢版2017/07/22(土) 13:37:57.58ID:S+qzOSdo
本当はGoやRuby Python JavaScript Kotlinあたりやりたいのに、
本格的なプログラミングとか設計勉強しようとすると
必ずJava, C, C++ あたりで解説されるから覚えざるを得ないというジレンマ。
0549デフォルトの名無しさん垢版2017/07/22(土) 18:31:48.46ID:Yr9CVNZl
>>547
インプレイス、という概念を植えつけられない言語でアルゴリズムをやるのは問題
でも Java が使われるのは疑問
0550デフォルトの名無しさん垢版2017/07/22(土) 19:09:29.77ID:3d/mUXex
Javaだと問題があるのでしょうか?

セジウィックの本の第4版がJavaですが。
0551デフォルトの名無しさん垢版2017/07/22(土) 19:10:22.08ID:fXxiASxC
>>547
GoやRuby Python JavaScript Kotlinあたりに入門ちゃんと済ませて、これから本格的なプログラミングとか設計を勉強していくぞって人なら
具体例の説明に使われる程度のJavaやCなんて、無勉でもある程度は読めるでしょ
0552デフォルトの名無しさん垢版2017/07/22(土) 19:12:56.74ID:3d/mUXex
例えば、Pythonだとソートとかハッシュとかリストとかが用意されていますが、
データ構造を学ぶ上では高級すぎるのではないでしょうか?
0553デフォルトの名無しさん垢版2017/07/22(土) 19:21:52.44ID:fJRG67nz
Sedgwick のアルゴリズムの教科書は、C++版やJava版があるよね。
C++版はちょっと古くて、C++11以降のモダンな書き方で改訂版を出してほしい。

自分は、アルゴリズムの教科書は疑似コードのみを示すの(MITのCormenの)で勉強したんだけど、失敗だったと思っている。
疑似コードを真似してそのまま実装してたから、一文字変数あまりまえ、クラスや構造体を定義することはなく、何でもかんでも配列で済ませるというクセがついてしまった。
もうちょっと、オブジェクト指向とかを勉強してからにすればよかったのかも。
0554デフォルトの名無しさん垢版2017/07/23(日) 11:49:40.37ID:cZonGhlD
Javaとか連想配列使うだけでもいちいちnewとかキャストとか
鬱陶しい。
0555デフォルトの名無しさん垢版2017/07/23(日) 14:58:46.77ID:CNTwKpOF
アルゴリズムは抽象的で、言語仕様とは切り離されたものであるべきなのだ。
そうは言っても手続き型を意識したものになりがちで、これを関数型に書き直せと言われても一目難しいものがままある
0556デフォルトの名無しさん垢版2017/07/23(日) 15:44:19.76ID:G5QCCj7S
アルゴリズムイントロダクションを読んでいます。

http://imgur.com/xbuAPtJ.jpg

↑は、 ω 記法についてです。

「if the limit exists」

と書かれていますが、なぜこんなことを書いているのでしょうか?

意味不明です。
0557デフォルトの名無しさん垢版2017/07/23(日) 15:46:31.20ID:G5QCCj7S
g(n) が漸近的に正であるような関数であれば、

f(n) = ω(g(n))



lim f(n) / g(n) = ∞

ではないでしょうか?

「if the limit exists」などと書いてある理由が分かりません。
0558デフォルトの名無しさん垢版2017/07/23(日) 15:51:14.63ID:G5QCCj7S
アルゴリズムイントロダクションって結構いい加減ですよね。

やっぱりクヌースの本を読んだ方がいいのかもしれませんね。
0559デフォルトの名無しさん垢版2017/07/23(日) 15:54:26.92ID:G5QCCj7S
漸近的に正である関数
漸近的に非負である関数

について説明がありますが、

なぜ、漸近的に正である関数だけを考えないのでしょうか?

漸近的に非負である関数などこの本で登場する機会はあるのでしょうか?
0562デフォルトの名無しさん垢版2017/07/23(日) 16:05:04.45ID:7bD+iXj9
>>555
現実問題、アルゴリズムを書くコードはC、C++に限られる。
Fortran、Java、Python、C#など他の言語はそれで書かれたライブラリを呼ぶだけだ。
0563デフォルトの名無しさん垢版2017/07/23(日) 16:09:19.74ID:cZonGhlD
機械のパフォーマンスを追求するあまりに
人間時間のパフォーマンスを際限なく犠牲にする池沼
0565デフォルトの名無しさん垢版2017/07/23(日) 19:06:54.73ID:cZonGhlD
>>564
何だよ業務プログラマって
俺は人に使役されてないし、インフラも構築できるし、
人工知能や数学もやってるんだぞ。
お前みたいなパフォーマンスオタクのほうが頭おかしいから。
0567デフォルトの名無しさん垢版2017/07/23(日) 20:46:56.02ID:LRxsFVvF
>>565
なんでそんなに必死なの?
0569デフォルトの名無しさん垢版2017/07/23(日) 23:45:48.25ID:G5QCCj7S
アルゴリズムイントロダクションを読んでいます。

「関数 n^(1 + sin(n)) の指数部の値は 0 と 2 の間で振動し、その中間にあるすべての値をとる」

などと書かれていますが、明らかに間違っていますよね。

sin(n) = 1/sqrt(2) となるような自然数 n は存在しません。

何を考えているのでしょうか?
0570デフォルトの名無しさん垢版2017/07/23(日) 23:54:11.92ID:G5QCCj7S
n と書いておきながら n が R を動くと仮定しているとかそんなことはないですよね?
0572デフォルトの名無しさん垢版2017/07/24(月) 00:10:01.69ID:dw4Kx5PQ
オリジナルのほうにも、

p.52
the value of the exponent in n^(1 + sin(n)) oscillates between 0 and 2, taking on all values in between

と書いてあります。
0573デフォルトの名無しさん垢版2017/07/24(月) 00:21:28.79ID:BT4s6Lxv
>557
0<=c g(n) < f(n)

って書いてあるのだから、(0 < c g(n) でなく、0 <= c g(n) であることに注意)
g(n) = 0, if n > 3
1, if n <= 3
とかなら、
f(n)/g(n) の極限は存在しないよ。
だから、もし極限が存在すれば、という限定をつけたのだと思うよ。
0574デフォルトの名無しさん垢版2017/07/24(月) 00:25:53.48ID:dw4Kx5PQ
>>573

それだと、

極限が存在するかしないか以前に、

f(n) / g(n) は n ≦ 3 に対してしか定義されませんよね。

lim f(n) / g(n) と書いた以上は

∃n0 s.t. n ≧ n0 ⇒ g(n) ≠ 0

でないといけないと思います。
0575デフォルトの名無しさん垢版2017/07/24(月) 00:27:22.94ID:dw4Kx5PQ
たとえば、

関数 h(n) の定義域が {0, 1, 2, 3} のときに、

lim h(n) などそもそも考えられないわけです。
0576デフォルトの名無しさん垢版2017/07/24(月) 00:31:02.81ID:dw4Kx5PQ
>>573

まず、

0 <= c g(n)

となっているのが問題だと考えます。

g(n) は漸近的に正であるような関数でなければならないはずです。
0577デフォルトの名無しさん垢版2017/07/24(月) 00:32:17.21ID:dw4Kx5PQ
このあたりのところを4人の著者のうち誰が書いたのか知りませんが、
非常に出来が悪いですね。

世界標準とはとてもいえないと思います。
0578デフォルトの名無しさん垢版2017/07/24(月) 00:33:52.43ID:1mGhcU0l
書いてあるとおりにしか取れない。キミの解釈がむしろ分らない。
the value of the exponent って(1 + sin(n)) だよな。それは between 0 and 2で、taking on all values in betweenだよな。

nが自然数なのかは知らんけど、sin(n) = 1/sqrt(2) という解釈はどこから?
0579デフォルトの名無しさん垢版2017/07/24(月) 00:36:55.54ID:dw4Kx5PQ
「if the limit exists」と書いてある理由について考えられる唯一の可能性があります。

それは以下の可能性です。

f(n) = ω(g(n)) の定義では、 n は N を動くと考えている。

一方、

lim f(n) / g(n) = ∞

という式の n は R を動くと考えている。
0580デフォルトの名無しさん垢版2017/07/24(月) 00:41:44.60ID:dw4Kx5PQ
>>578

例としてそのような値を考えたということです。

0 < 1 + 1/sqrt(2) < 2

ですが、

1 + sin(n) = 1 + 1/sqrt(2) となるような n ∈ N は明らかに存在しません。

1 + sin(n) = 0
1 + sin(n) = 2

となるような n ∈ N も明らかに存在しませんが、 in between というのが

0 と 2 を含まない可能性を考えて、↑のような例にしました。
0581デフォルトの名無しさん垢版2017/07/24(月) 00:51:03.16ID:dw4Kx5PQ
やっぱりクヌースの本の完成度は群を抜いていますね。
0582デフォルトの名無しさん垢版2017/07/24(月) 01:21:19.59ID:1mGhcU0l
> the value of the exponent in n^(1 + sin(n)) oscillates between 0 and 2, taking on all values in between

書いてあるそのままの意味で、これは数学的に真で、
1 + sin(n) = 1 + 1/sqrt(2) を満たす自然数nが存在するなんてどこにも書いてないし、言ってない。
直前にnは自然数と定義してるならそれも引用してもらわないと判断のしようがない。おそらくnumberの略だろう。変数n。
0583デフォルトの名無しさん垢版2017/07/24(月) 01:46:14.40ID:1mGhcU0l
もっと本質的な勘違いか。
AならばBはA=Bではないし、AならばBは、BならばAでもないぞ。
言ってるのはthe value, taking on all values in between だけだからな。
0584デフォルトの名無しさん垢版2017/07/24(月) 03:48:35.95ID:qy6/mYOI
>>582

n については何も記述がありません。

そもそも、普通なら関数について書くときには、定義域を書くはずですが、
書いてありません。

習慣として、 n と書けば自然数の集合を動く変数ということになりますので、
そう解釈するのが妥当です。

1 + sin(n) が 0 と 2 の間のすべての値をとるのであれば、当然、

0 < 1 + 1/sqrt(2) < 2 ですので、値 1 + 1/sqrt(2) もとります。
0585デフォルトの名無しさん垢版2017/07/24(月) 03:58:43.71ID:qy6/mYOI
念のため、公式ページの正誤表を見てみましたが、書いてありませんでした。

かなり売れている本だと思いますが、飛ばし読みしている人ばかりなのでしょうか?
0586デフォルトの名無しさん垢版2017/07/24(月) 04:32:03.26ID:1mGhcU0l
数学の世界ならそうだろうが、数学本じゃなくてプログラミングの本なんだろ?
sin(n) と書いてあればプログラマはたいてい n をfloat型かdouble型の変数だと解釈する。
= 一つとっても大抵のプログラミング言語は等式ではなく、代入演算子と定義している。
分野が違うのだから論理的におかしいと思ったらまずは定義を疑う。数学だってブール代数で1+1=1って書く場合もあるだろう。
今のプログラミング言語は+や-の演算子すら再定義できるのだ。

仮に自然数だとしても、次に本質的な論理問題。>>583 これ。

> 0 と 2 の間のすべての値をとる

これも怪しい。take on All Value なので、on 〜の上にという意味で、日本語にするならば結果がその範囲内に収まるだろう。
All values in between take the valueではないのだ。AはBのとき、BはAか?もちろん偽。
つまり1 + sin(n) = 1 + 1/sqrt(2)を保証する記述ではない。
0588デフォルトの名無しさん垢版2017/07/24(月) 15:13:09.34ID:BdqEvISL
>>569
>「関数 n^(1 + sin(n)) の指数部の値は 0 と 2 の間で振動し、その中間にあるすべての値をとる」


指数部の値は 0 と 2 の間で振動し、その中間にあるすべての値をとるんじゃね?
0589デフォルトの名無しさん垢版2017/07/25(火) 00:02:25.50ID:6PSqyxlH
nが自然数か何かも書いてないのに勝手に自然数だと勘違いして発狂するとか何考えてんでしょうね
0595デフォルトの名無しさん垢版2017/07/28(金) 14:53:29.74ID:+gMyuDZP
凄いことにきずいたぜ!
「ポリモーフィズム」と「ラッパー」は反対の関係にあるんだ。
これによって「メソッド名」と「中身」が 多対多の関係にできるってことだぜ。
0597デフォルトの名無しさん垢版2017/08/06(日) 03:45:40.20ID:tlOocLRL
シーケンス図とかスタックトレースって都庁なんだな。
おれの言いたいことが分かるか?「東京都庁」なんだよ。
0598デフォルトの名無しさん垢版2017/08/06(日) 03:55:13.24ID:tlOocLRL
待てよ・・・ピラミッドやサクラダファミリアも同じ形をしてるじゃないか!
この世界の真実を見たぞ・・・
0600デフォルトの名無しさん垢版2017/08/08(火) 23:50:20.23ID:/cPMGZTq
つかオブジェクト名繋げないでいきなり関数とは変数とか
呼ぶやつまじでやめて。
継承した変数や関数なのか、このクラスで定義した変数や関数
のかわからないじゃん。
このクラスで定義したものだったら thisつけろよ。
0604デフォルトの名無しさん垢版2017/08/11(金) 13:57:12.96ID:Vbqo8hQM
デザパタは覚えたし、クラス図やシーケンス図も読める、クラス図の通り
にコーディングもできるし、だいたい何らかのパターンに当てはめ
ればなんとか動く。
命名規則も全部決めてるからその規則通りに書けば自動的に動く
でも「なんでそうなるの?」って質問されるとさっぱりわからないんだよなぁ…
デザパタに則っていないコードとか、俺と違う命名規則の人が書いた
コードも一切理解不能(無能)。
0610デフォルトの名無しさん垢版2017/08/11(金) 17:20:22.56ID:4bbWTV9L
372仕様書無しさん2017/08/11(金) 10:31:43.41
フリーランスで検索すると引っかかる零細ITがやっているサイトはだめだ。
高額に見せているけど実際は50万前後
JIET加入した方がいいよ。案件は毎日千件以上末端価格は60万円 平凡な稼働時間の80万円の案件もある。
ユー子が求人をだしてる。名刺も渡せる。ユー子に名刺が渡せるんだぞ。夢のようだ

それらの案件まさぐってHPで転売していたのが零細ITがやるフリーランスサイト

自称エージェントはJIETから流れてくる案件を転売してるだけだった。
JIETに加入すれば誰でも案件に応募することができた。収入が40万50万台にならなくて済む

473非決定性名無しさん2017/08/03(木) 15:21:30.71

JIETに加入すれば誰でも3次60万からスタートだ。フリーランスのサイトをやってる
自称エージェントもそこから案件情報を取得しきてる。サイトで60万で釣って40万から55万の
間でやらしている。
0612デフォルトの名無しさん垢版2017/08/11(金) 23:53:53.43ID:VT8Bdzbq
>>604
いまどきデザインパターン?
0614デフォルトの名無しさん垢版2017/08/12(土) 11:21:25.45ID:2oFLTBe8
ちょww俺煽られすぎwww
でも、モノは完成するようになったぜ。
要求、仕様から動作原理すっ飛ばして、命名規則だけで
モノが完成するから結構職場では役立ってるぜ。
他のプログラマはフレームワークの使い方がやっとだし
一人だけ技術力があるゴリラ野郎は人望がなくて自分の技術力が
人に盗まれるのを極力恐れているから基本的に部下に意地悪して
教えてあげれば済むことも何も教えてくれない。
社長はどんどん仕事取ってきて、だいたい半数のプロジェクトが進まずに凍結状態に
なり、ブチ切れた客をなんとかかわし続ける日々だ。
そんな状況で俺の場合動くモノを比較的完成する方だからゴリラには結構
気に入られて給料は上がったよ。会社がいつまで持つかは分からんが。
0615デフォルトの名無しさん垢版2017/08/12(土) 11:28:43.73ID:WyVA8Sgg
このスレは初心者スレだったな。
0621デフォルトの名無しさん垢版2017/09/03(日) 14:32:35.28ID:8cpPGlhh
>>620
概念と用語だけマスターすれば良い。

あとは実務に合わせて使えるところは利用するし、合わない部分は気にしない。
0623デフォルトの名無しさん垢版2017/09/03(日) 17:00:04.12ID:VeRuY65E
>>622
>>621みたいに、わかったような口を叩くけど実際にやらせてみたら手が動かないカスになったらダメ
自分でどんどん適用してみて、メリットもデメリットも自分の体験として語れるようになった方がいい
0627デフォルトの名無しさん垢版2017/09/04(月) 23:07:19.92ID:NGSv2EGo
>>625
さらっと読んで写経したぐらいで理解できると思わない方がいい
そのうちわかってくるから、とにかく手を動かしコードを動かす経験を積み重ね続けるんだ
0629デフォルトの名無しさん垢版2017/09/15(金) 07:54:04.88ID:gy747Xnp
>>618
>汎用的に使える技術
良い質問だなこれ
遅レスだけど考えたい

地味だけど基礎的なデータ構造が
一番汎用的なんじゃないか?
連結リストとか二分木とかそういうの
0633デフォルトの名無しさん垢版2017/09/17(日) 17:09:50.02ID:7slIJ8sy
Kleinberg & Tardosの本に以下のような内容の記述があります。
でも、 n > 1 のとき、 H が universal になることは決してないですよね。
u = v のとき、常に、 h(u) = h(v) なので、問題の確率は 1 ですから。



--------------------------------------------------
U を要素数の非常に多い有限集合とする。

H を U から {0, 1, ..., n-1} へのすべての写像の集合のある部分集合とする。

u, v ∈ U に対して、ランダムに選んだ h ∈ H が h(u) = h(v) を満たす確率はたかだか 1/n であるとき、
H は universal であるという。
0634デフォルトの名無しさん垢版2017/09/17(日) 17:30:37.45ID:7slIJ8sy
S を #S ≦ n であるような任意の U の部分集合とする。
u を U の任意の要素とする。
X を ランダムな選択 h ∈ H に対して、値 #{s ∈ S | h(s) = h(u)} をとるようなランダム変数とする。

このとき、

E[X] ≦ 1

である。

証明:

s ∈ S に対し、
h(s) = h(u) であるならば、 1
h(s) ≠ h(u) であるならば、 0
となるようなランダム変数を X_s とする。

仮定により、 H は universal であるから、
E[X_s] = Pr[Xs = 1] ≦ 1/n

X = Σ X_s だから期待値の線形性により、

E[X] = ΣE[X_s] ≦ #S * (1/n) ≦ 1
0635デフォルトの名無しさん垢版2017/09/17(日) 17:32:48.13ID:7slIJ8sy
この証明は、

u ∈ S であるとき、破綻しますよね。
0636デフォルトの名無しさん垢版2017/09/17(日) 17:37:20.77ID:7slIJ8sy
Kleinbergはネヴァンリンナ賞を受賞した人だそうですが、大丈夫な人なのでしょうか?
0639デフォルトの名無しさん垢版2017/10/06(金) 23:28:50.73ID:5xvc7oH2
T(n) = Ω(g(n))



T(n) ≧ c*g(n) となる n が無限に多く存在するような定数 c が存在する。


という定義がありますが、なぜ、ほとんどすべての n ではないのでしょうか?
0641デフォルトの名無しさん垢版2017/10/07(土) 08:55:33.93ID:uFxBTiFA
>>639

Knuthは、

T(n) = Ω(g(n))



ほとんどすべての n に対して、 T(n) ≧ c*g(n) が成り立つ。

と定義するのがいいと書いていますが。
0642デフォルトの名無しさん垢版2017/10/07(土) 10:32:49.92ID:yM1og+Z2
Binary(嘘)
Balance(へ?)
0643デフォルトの名無しさん垢版2017/10/07(土) 14:37:48.61ID:a6QcCG6E
Boeing
0648デフォルトの名無しさん垢版2017/10/08(日) 12:52:27.73ID:u+rv4D7i
Θ(f(n)) を使うべきところで、 O(f(n)) を使っているという批判をする人がいますが、
具体的にはどういう状況でしょうか?
0652デフォルトの名無しさん垢版2017/10/09(月) 18:34:06.40ID:vbK8I5kP
浅野孝夫著『アルゴリズムの基礎とデータ構造』を読んでいます。

「上の挿入ソートの例のように、基本演算回数(比較回数)は入力サイズ n にのみ
依存するとは言えない。そこで、入力サイズ n の入力のうちでアルゴリズムが最も
多くの基本演算を必要とする入力を考えて、それに対する基本演算回数を、本書ではん、
サイズ n の入力に対するアルゴリズムの計算量(time complexity of an algorithm)と
呼ぶ。すなわち、最悪の場合を想定してアルゴリズムの計算量を定めていることになる。
このようにして定められたアルゴリズムの計算量 T はもちろん n にのみ依存する関数で
あるので T(n) と書ける。上の挿入ソートの例では T(n) = n*(n-1)/2 である。」

と書いてあります。

その後、マージソートのところには、

「マージソートの計算量は T(n) = O(n*log(n)) である」

と書いてあります。

T(n) は最悪の場合の計算量ですから、

T(n) = Θ(n*log(n)) が正しいのではないでしょうか?

ちなみに、浅野さんは、この本の最初のほうで O, Ω, Θ を定義しています。
0653デフォルトの名無しさん垢版2017/10/09(月) 18:35:57.26ID:vbK8I5kP
もちろん、 f(n) ∈ Θ(n*log(n)) ⇒ f(n) ∈ O(n*log(n)) ですが。
0654デフォルトの名無しさん垢版2017/10/09(月) 18:51:59.25ID:vbK8I5kP
浅野さんは、挿入ソートの計算量を

O(n^2)

と書いています。

これも

Θ(n^2)

と書くべきですよね。

>>652

に引用したように、

「上の挿入ソートの例では T(n) = n*(n-1)/2」

ですから。
0657デフォルトの名無しさん垢版2017/10/15(日) 10:39:26.70ID:Cy7I/MU1
ソートの決定木についてですが、葉の数が「少なくとも」 n! 個あると説明されることが多いですが、
ちょうど n! 個と書かない理由は何ですか?
0658デフォルトの名無しさん垢版2017/10/15(日) 10:46:56.72ID:Cy7I/MU1
既に順序が決定されているにもかかわらず、さらに無駄な比較をするようなプログラムの
ことを想定しているのでしょうか?
0659デフォルトの名無しさん垢版2017/10/15(日) 10:48:49.83ID:Cy7I/MU1
そうだとすると、決定木のある部分木で、その葉がすべて同じ順序に対応するようなものが
存在することになります。
0660デフォルトの名無しさん垢版2017/10/15(日) 10:49:46.78ID:Cy7I/MU1
ソートの決定木について厳密に論じている本はありますか?
0661デフォルトの名無しさん垢版2017/10/15(日) 11:09:38.82ID:Cy7I/MU1
This result serves as a guide for us to know, when designing a sorting algorithm, how
well we can expect to do. For example, without such a result, one might set out to try
to design a compare-based sorting algorithm that uses half as many compares as does
mergesort, in the worst case. The lower bound in Proposition I says that such an effort
is futile?no such algorithm exists
0662デフォルトの名無しさん垢版2017/10/15(日) 11:10:24.51ID:Cy7I/MU1
>>661

この説明は間違っていますよね?
0663デフォルトの名無しさん垢版2017/10/15(日) 11:13:29.73ID:Cy7I/MU1
最悪時にマージソートの半分の比較しか必要でないソートのアルゴリズムが存在しないこと
は証明できるのでしょうか?
0664デフォルトの名無しさん垢版2017/10/15(日) 11:54:45.59ID:Cy7I/MU1
あ、勘違いしました。

>>661

合っていますね。明らかに。
0666デフォルトの名無しさん垢版2017/10/21(土) 16:32:10.02ID:edOw+XtB
浅野孝夫著『アルゴリズムの基礎とデータ構造』を読んでいます。

以下の問題に対する浅野さんの解答が↓です。

「このとき根は葉ではないので左の子 v および右の子 w をもつ。」などと書いていますが、
深さ d > 0 の二分木で左の子もしくは右の子を持たないものも当然存在します。
おかしな解答ですね。

二分木において、深さ d までの葉の総数は 2^d 以下であることを示せ。

d に関する帰納法で証明できる。 d = 0 のときは根は葉になるので明らかに成立する。 d > 0 未満で
成立すると仮定し d のときを考える。このとき根は葉ではないので左の子 v および右の子 w をもつ。
v を根とする部分木の深さ d - 1 までの葉が元々の二分木の深さ d までの葉になるがそのような葉の
総数は帰納法の仮定より、 2^(d-1) 以下である。同様に w を根とする部分木の深さ d - 1 までの葉の
総数も 2^(d-1) 以下であり、したがって、元々の二分木の深さ d までの葉の総数は 2^d 以下であることが
言えた。

この問題文自体もおかしいです。

この問題の結果が本文中で使われていてそこを読めばわかるのですが、問題文の意味は、
「深さ d の二分木の葉の総数は 2^d 以下であることを示せ」です。以下のような解答が模範解答ですね。

深さ d の二分木でその葉の総数が 2^d + 1 個以上であるような二分木が存在すると仮定する。
そのような二分木のうち葉の総数が最多であるような二分木を T とする。
すべての葉の深さが d であるような二分木の葉の総数は明らかに 2^d 個である。
よって T の葉にはその深さが d 未満であるような葉が存在する。この葉に子ノードを持たせれば
深さ d の二分木で葉の総数が T の葉の総数よりも多い二分木を作ることができるがこれは矛盾である。
よって、深さ d の二分木の葉の総数は 2^d 個以下である。
0667デフォルトの名無しさん垢版2017/10/21(土) 16:38:07.00ID:FeyeuQ+N
>すべての葉の深さが d であるような二分木の葉の総数は明らかに 2^d 個である。

これ出しちゃったらそれで証明おしまいのような気がするが。
0668デフォルトの名無しさん垢版2017/10/21(土) 16:43:21.60ID:edOw+XtB
あ、問題文はおかしくないようです。

二分木において、深さ d までの葉の総数は 2^d 以下であることを示せ。

という問題でOKです。
0669デフォルトの名無しさん垢版2017/10/21(土) 16:51:58.42ID:edOw+XtB
二分木において、深さ d までの葉の総数が 2^d + 1 個以上である二分木が存在すると仮定する。
深さ d までの葉の総数が最多である二分木を T とする。

このとき、 T には深さ d 未満の葉が少なくとも一つ存在する。もしそうでないと仮定すると、 T の
すべての葉の深さは d 以上であるから、明らかに深さ d までの葉の総数は 2^d 個以下に
なってしまうが、これは矛盾である。

T の深さ d 未満の葉に子ノードを持たせれば、深さ d までの葉の総数が T よりも多い二分木が存在する
ことになってしまい矛盾が発生する。

よって、において、深さ d までの葉の総数は 2^d 個以下である。
0671デフォルトの名無しさん垢版2017/10/21(土) 18:51:41.34ID:FeyeuQ+N
二分木じゃなくて三分木なら2^d以下ではないわけだけど、>>669の証明を二分木から三分木に変えても
論理展開に違いが出ないから明らかにおかしいだろう。
0672デフォルトの名無しさん垢版2017/10/21(土) 19:21:45.75ID:edOw+XtB
三分木では、

「もしそうでないと仮定すると、 T のすべての葉の深さは d 以上であるから、明らかに深さ d までの葉の総数は 2^d 個以下に
なってしまう」

が成り立ちません。
0673デフォルトの名無しさん垢版2017/10/21(土) 19:24:01.05ID:edOw+XtB
三分木の場合の証明は以下のようになりますね。


三分木において、深さ d までの葉の総数が 3^d + 1 個以上である三分木が存在すると仮定する。
深さ d までの葉の総数が最多である三分木を T とする。

このとき、 T には深さ d 未満の葉が少なくとも一つ存在する。もしそうでないと仮定すると、 T の
すべての葉の深さは d 以上であるから、明らかに深さ d までの葉の総数は 3^d 個以下に
なってしまうが、これは矛盾である。

T の深さ d 未満の葉に子ノードを持たせれば、深さ d までの葉の総数が T よりも多い三分木が存在する
ことになってしまい矛盾が発生する。

よって、において、深さ d までの葉の総数は 3^d 個以下である。
0674デフォルトの名無しさん垢版2017/10/21(土) 19:33:58.53ID:FeyeuQ+N
>が成り立ちません。

成り立たないことがわかっているなら証明いらんだろうw
逆に言うと、それが成り立たないことが証明されていない。

>>673
3^dってどこから出てきたわけ?
0675名無しさん@そうだ選挙に行こう! Go to vote!垢版2017/10/22(日) 15:43:58.38ID:PJF1xk0l
2分ヒープは完全二分木を使ったデータ構造ですが。

この完全二分木のことを半順序のついた木というのはなぜでしょうか?
0676デフォルトの名無しさん垢版2017/10/23(月) 05:47:03.23ID:iFI38Dlw
%%%%1000%%%%

000-[HUM%58*73.1\%]/2I/3NM/61.3SNMK%?%3%51.22222222222221%
001-[[[%6/4$17.6135412α3]]]]+DOM+SIL+7%
002-UML7%[61.2[31.5[!%32∂LM17.36%!16.3!%<<<%!HSTOL7%!Q!S!=3m=<2TOL<3Q9A<2.1GHz%,DOK,HAOARA,
003-[[[HEMLOT47[<\41.2%Q,===>[MLS<DPNO<\2.3>#ESOLA!5%!3MLA!>LTOSA>7TONSA>%>%end
0677デフォルトの名無しさん垢版2017/10/24(火) 00:30:44.81ID:jO+jDbIG
バッチ処理, ジョブ制御に有効なデザインパターンって何?
0680デフォルトの名無しさん垢版2017/11/05(日) 13:49:09.49ID:kyKiHR5g
>>675
再帰的に、親は両方の子以下の数値をもつ。
左右の子の大小関係は考慮しない

ここでは説明しやすいように、配列の[0]は使わない。
[1]から始めると計算が楽。
親1, 左右の子は2, 3で、法則は、親n, 子2n, 2n+1

もし[0]から始めると、
親0, 左右の子は1, 2で、親1, 左右の子は3, 4で、
法則は、親n, 子2n+1, 2n+2、となり複雑

親[1] → 子[2, 3]
[1]3, [2]10, [3]30

[2] → [4, 5]
[4]100, [5]20

[3] → [6, 7]
[6]70, [7]200

JavaScript で、漏れが作った、2分ヒープ
http://jsdo.it/michihito/bGH5
0681デフォルトの名無しさん垢版2017/11/05(日) 13:58:55.54ID:lcYDevpf
で、半順序はどこに登場するんですか?
0683デフォルトの名無しさん垢版2017/11/06(月) 23:54:10.39ID:Xbh99dPN
シングルトンがいけないとかたまに聞くんだけど
シングルトンなしでどうやるのか誰か教えて

シングルトン使わないで済むならシングルトン辞めることには吝かではないんだが
どうやるのかが分からない

HolderとかRepository作るとどうしてもシングルトンになっちゃう
誰か助けて
0684デフォルトの名無しさん垢版2017/11/07(火) 08:06:23.75ID:FkpvBRAi
シングルトンの何がいけないのかをわかっていれば別に使ってもいいんじゃないか?
と思うんだが
0685デフォルトの名無しさん垢版2017/11/08(水) 03:27:16.05ID:pi2d/ZnM
staticでおk
0686デフォルトの名無しさん垢版2017/11/10(金) 09:56:08.91ID:O+5a47Rv
内部ノード数 n の 2色木の Black Height を h であらわすと以下の不等式が成り立つ。

2^(h-1) - 1 ≦ n ≦ 2^(2*h-1) - 1

よって、 h = O(log(n))


とある本に書いてあります。

これっておかしいですよね?

h は n の関数ではありません。内部ノード数から2色木の Black Height は一意的にはきまらないからです。

もちろん、 O(log(n)) の左辺には n の関数が来るきまりです。

ですので、 h = O(log(n)) と書くのはおかしいのではないでしょうか?
0687デフォルトの名無しさん垢版2017/11/10(金) 12:02:03.17ID:WtBM3Wp4
メッセージキューイングって
Commandパターンで実装するで合ってる?
0688デフォルトの名無しさん垢版2017/11/12(日) 17:56:18.04ID:5J9eZD00
>>686
>>2^(h-1) - 1 ≦ n ≦ 2^(2*h-1) - 1 ・・・(1)
>>よって、 h = O(log(n)) ・・・(2)

一見すると正しそうに見えるけど、どっちがどうおかしいと?
0689デフォルトの名無しさん垢版2017/11/12(日) 19:28:20.81ID:2NYvmr0h
h が n の関数ではないにもかかわらず

h ∈ O(log(n))

と書いているのがナンセンスです。
0690デフォルトの名無しさん垢版2017/11/12(日) 19:46:50.82ID:wWQbf7ET
>>689
nとhの関係は(1)で示されているんじゃね?
不等式を変形すれば良いのでは?
0691デフォルトの名無しさん垢版2017/11/12(日) 20:23:32.92ID:2NYvmr0h
n から h は一意的に決まりません。

よって、

h は n の関数ではありません。
0693デフォルトの名無しさん垢版2017/11/13(月) 18:01:47.14ID:O+WFbO9G
>もちろん、 O(log(n)) の左辺には n の関数が来るきまりです。
ここの時点でおかしい
0694デフォルトの名無しさん垢版2017/11/13(月) 18:49:03.12ID:TURt7nwr
>>693

何がおかしいのでしょうか?
0695デフォルトの名無しさん垢版2017/11/14(火) 16:22:50.14ID:kwaLWx7P
抽象メソッドしか定義されない型のことを
「インタフェース」ってネーミングセンスは頭おかしいんじゃないの?
インタフェースって言ったら通常「UI」とか外部の窓口になったり、
外部デバイスとの接続ポイントになるコネクタのことを言うじゃん。
オブジェクトの型のことを「インタフェース」なんて言ったら誤解を招くだろ。
0696デフォルトの名無しさん垢版2017/11/14(火) 16:49:12.95ID:dN7NjwRx
>>695
interfaceには境界面とか接点の意味がある

クラスが持つ他との接点の意味で合ってる
0697デフォルトの名無しさん垢版2017/11/14(火) 18:46:26.43ID:9XknVuf7
外部の窓口になったり、外部デバイスとの接続ポイントになるのが抽象メソッドだから。
つまりそれしか定義されてないということは、インターフェースそのものと言っていいだろう。
0698デフォルトの名無しさん垢版2017/11/14(火) 20:12:16.44ID:R1CE9PkA
デザパタスキル、エンベッデイドスキルなんやかや言うが、みんな大事な部分は閃きなんだがなぁ・・・
作曲と同じ。 閃き・・・ とどのつまり、神が書かせているという事。
そこを理解できない限り、そのプログラマーは聖職では無い。
0700デフォルトの名無しさん垢版2017/11/18(土) 18:23:02.44ID:SgBQyEr/
神「共通化せよ――」
僕「はい」
神「ごめん間違えた――」
僕「うわぁぁああぁああ!!!」
0702デフォルトの名無しさん垢版2017/11/19(日) 23:12:44.83ID:opsy6abA
以下で定義される写像 A : N × N → N を Ackermann 関数という。

A(1, j) = 2^j for j = 1, 2, 3, …
A(i, 1) = A(i-1, 2) for i = 2, 3, 4, …
A(i, j) = A(i-1, A(i, j-1)) for i = 2, 3, 4, … for j = 2, 3, 4, …

α(m, n) = min {i ≧ 1 | A(i, floor(m/n)) > log_2(n)}

で定義される写像 α : {(m, n) | m, n ∈ N, m ≧ n} → N を Ackermann 逆関数という。



なぜ、この α を Ackermann 関数の逆関数と呼ぶのでしょうか?
0703デフォルトの名無しさん垢版2017/11/20(月) 20:37:12.88ID:Sdx1OtwZ
courseraのセジウィックとウエインの講義を受講しています。

プログラミングの課題のチェックが超厳しいですね。

'if' is not followed by whitespace.

「if」の後ろにスペースを入れないといけないなんて初めて聞きました。
そんなことまで強制されたらたまりませんね。
0704デフォルトの名無しさん垢版2017/11/20(月) 20:40:14.03ID:uYx1UAMq
大概のプロジェクトで採用されてるスタイルだから従っとけ
スペース軽視するやつ多すぎ
0707デフォルトの名無しさん垢版2017/11/20(月) 23:10:14.23ID:ohy70QIE
一般的なコーディングルールには従ったほうがよい
最近の言語環境では放っておいてもツッコミ入れてくれたりもするが
0708デフォルトの名無しさん垢版2017/11/21(火) 07:03:23.42ID:G6ETZwfO
業務システムでオブジェクト指向不要って意見はどう思いますか
大抵スパゲティークエリになってる印象ですが
0709デフォルトの名無しさん垢版2017/11/21(火) 07:13:27.16ID:OOffmQFA
途中からオブジェクト指向混ぜられても困るだろ
実行効率や記述効率は悪くたって別に構わないのだから(ここわかってない人多し)、プロジェクトに来た全員が理解利用できる書き方が最優先

無論技術的にも業務的にもうんこだが、そこを追求すべき場所ではないところで勝手に追及を始めるのはそれこそうんこのやること
ゼロからオーバーホールを提案してもよいが最後まで自己責任で看取れ
0710デフォルトの名無しさん垢版2017/11/21(火) 17:43:16.86ID:M9cr/U+S
>>709
サブクエリ五重の塔を見て上長にキツいと報告したら世界にはバベルの塔がいっぱいあるのに根をあげるなと叱られました

せめて何をしたいのかドキュメント欲しいと言ったらコードが全てだとも言われました

IT業界の厳しさを知りました
0712デフォルトの名無しさん垢版2017/11/22(水) 09:23:31.55ID:milfaijK
courseraのセジウィックとウエインの講義の最初の課題であるパーコレーションだけど
backwashを防ぐにはどうすればいいんですか?
0713デフォルトの名無しさん垢版2017/11/22(水) 10:42:20.23ID:milfaijK
あ、分かりました。

virtual topにはつなぐがvirtual bottomにはつながないUF
virtual topにもvirtual bottomにもつなぐUF

を使えばいいんですね。
0714デフォルトの名無しさん垢版2017/11/22(水) 10:51:20.09ID:milfaijK
成績が100点満点中97点になりました。
0715デフォルトの名無しさん垢版2017/11/22(水) 10:52:40.54ID:milfaijK
成績が100点満点中98点になりました。
0717デフォルトの名無しさん垢版2017/11/22(水) 15:34:31.81ID:milfaijK
ついに、成績が100点満点中100点になりました。

https://imgur.com/apwKZnf.jpg
0718デフォルトの名無しさん垢版2017/11/22(水) 15:35:42.67ID:milfaijK
快挙ですね。
0719デフォルトの名無しさん垢版2017/11/23(木) 12:04:48.38ID:Le5wB72/
デザインパターンで規定されるいろいろなクラスがあるけど
これらのクラスはそれぞれレイヤー化アーキテクチャのどこに
属すのか知りたい。
たとえばStateパターンがあった場合に、
・<<interface>>State
・ConcreteState x n
・Context
があったとき、

これらは、クラスを配置する場所的に
・プレゼンテーション層(UI層)
・App層
・サービス層
・ビジネスロジック層
・パーシステンス層
のどこの層として配置すればいいのか
0720デフォルトの名無しさん垢版2017/11/23(木) 12:18:16.35ID:DeXlBicR
> デザインパターンで規定されるいろいろなクラスがあるけど
> これらのクラスはそれぞれレイヤー化アーキテクチャのどこに
> 属すのか知りたい。

デザパタはレイヤ化アーキテクチャに属すものだという考え方が謎なんだけど
0721デフォルトの名無しさん垢版2017/11/23(木) 12:18:26.01ID:fJlhhdGs
>>719
どの層にも配置していいんじゃね

その層の機能とかを実現するのにそのデザインパターンが必要なら使えばいいのではないか

レイヤーとデザインパターンは独立に組み合わせ可能と思う
0724デフォルトの名無しさん垢版2017/11/27(月) 07:16:56.92ID:DtvpiAcr
デザパタを適用したクラスがどのレイヤにあっても構わんのじゃ無いか
定石があってもフレームワークごと違うから説明無理だと思う
0725デフォルトの名無しさん垢版2017/11/28(火) 09:02:37.93ID:VA+yl+li
1以上1000以下の整数からなる集合の部分集合で、
その任意の異なる2元 x, y をとったとき、
「x は y を割り切らず、 y も x を割り切らない」
という性質をもつものを考える。

そのような部分集合の中で元の数が最大になるような
集合の元の数を求めよ。
0727デフォルトの名無しさん垢版2017/11/28(火) 11:34:19.17ID:VA+yl+li
答えは500以下です。



1 から 1000 までの整数を 2^n * (2*m + 1) の形で表す。

2*m + 1 の部分は、

2*0 + 1, 2*1 + 1, …, 2*499 + 1

の500個のパターンのいずれかに一致する。

よって、1 から 1000 までの整数の中から501個以上の異なる整数を選び出せば、
その中には、かならず、

2^n1 * (2*m + 1), 2^n2 * (2*m + 1)

という二つの整数が含まれる。

この二つの整数は一方が他方を割り切る。
0731デフォルトの名無しさん垢版2017/11/28(火) 17:12:15.85ID:g+QmVGb1
>>730
n=0 にして、m=0, 1, 2 ...
n=1 にして、m=0, 1, 2 ...
...
とやって確かめたら、なんとなく自然数を網羅できそうなのは確認できました。

ただ、本当に網羅できるのか証明はまだできてません。

これ以上はスレチも甚だしいので、独りで頑張ってみます。

流れぶった切ってすみません。
>>725 さん、どうぞ続けてください。
0732デフォルトの名無しさん垢版2017/11/28(火) 17:15:22.43ID:VA+yl+li
>>729

整数を 2 で割れるだけ割ると 2^n * (2*m + 1) の形になります。

例:

120 = 2^3 * 15 = 2^3 * (2*7 + 1)

この場合、 n = 3, m = 7 です。
0733デフォルトの名無しさん垢版2017/11/28(火) 17:16:45.10ID:VA+yl+li
2^n * 奇数

です。
0734デフォルトの名無しさん垢版2017/11/28(火) 17:26:27.93ID:VA+yl+li
1 = 2^0 * (2*0 + 1)
2 = 2^1 * (2*0 + 1)
3 = 2^0 * (2*1 + 1)



999 = 2^0 * (2*499 + 1)
1000 = 2^3 * (2*62 + 1)

となります。

1, 2, …, 1000 をすべて

2^n * (2*m + 1)

という形に表します。

m は 0 から 499 までの 500 個の整数のどれかになります。

ですので、 1, 2, …, 1000 の中から 501 個以上の整数を取ってきて、それらすべてを

2^n * (2*m + 1)

という形に表すと、

2*m + 1

の部分が同じになるような異なる2つの整数があります。
2*m + 1 の部分は同じで、 2^n の部分が異なります。それら2つの整数は
2^n1 * (2*m + 1), 2^n2 * (2*m + 1) のようにあらわされます。 n1 < n2 と仮定して一般性を失いません。
2^n2 * (2*m + 1) は 2^n1 * (2*m + 1) で割り切れます。 2^n2 * (2*m + 1) ÷ 2^n1 * (2*m + 1) = 2^(n2-n1)
0736デフォルトの名無しさん垢版2017/11/28(火) 19:31:53.85ID:VA+yl+li
>>726

{501, 502, …, 1000} でもOKですね。
0737デフォルトの名無しさん垢版2017/11/28(火) 19:37:23.97ID:VA+yl+li
>>735

ceiling(n/2)

ではないでしょうか?
0739デフォルトの名無しさん垢版2017/11/30(木) 18:59:28.31ID:A1E/mSxW
セジウィックとウエインのcourseraのオンライン講義を聴講しています。

java.util.List
java.util.Stack
java.util.Queue

は最低だそうですね。

Best practices: Use our implementations of Stack, Queue, and Bag.

だそうです。
0740デフォルトの名無しさん垢版2017/12/02(土) 11:57:41.11ID:6Ds5e+ud
最近傍探索で、最も近いものが複数個あった場合、どうするのが自然ですか?

また、k近傍探索でも、クエリからk番目に近いものが複数あった場合、どうするのが自然ですか?
0741デフォルトの名無しさん垢版2017/12/02(土) 12:30:23.76ID:LweVlrmz
セジウィックとウエインのcourseraのオンライン講義を聴講しています。

なんかやけに課題が厳しくないですか?
0742デフォルトの名無しさん垢版2017/12/02(土) 13:12:04.17ID:LweVlrmz
セジウィックとウエインのcourseraのオンライン講義Algorithms Part 1のWeek 2の課題、できた人いますか?
0744デフォルトの名無しさん垢版2017/12/02(土) 20:12:18.77ID:LweVlrmz
courseraのセジウィックとウエインの講義を聴講している人はいますか?
0749デフォルトの名無しさん垢版2017/12/05(火) 12:21:40.49ID:bL4Z2L1G
あ、仕様Memory量の見積を勘違いしていました。

できそうですね。

Item 型のデータを格納する Linked List

Linked List の各要素への参照を格納する Item[] 型の
配列を用意すれば実現できますね。
0750デフォルトの名無しさん垢版2017/12/05(火) 12:25:30.33ID:bL4Z2L1G
あ、でも Item[] 型の配列を ResizingArray で実現したとしても、
常に、Memoryの制限である 48*n + 192 bytes というのを満たすのは
無理ですね。

どうすればいいんですかね?

もう少しだけメモリの制限が緩ければ実現可能ですが。
0751デフォルトの名無しさん垢版2017/12/05(火) 12:30:24.08ID:bL4Z2L1G
Performance requirements.

Your randomized queue implementation must support each randomized queue
operation (besides creating an iterator) in constant amortized time.

That is, any sequence of m randomized queue operations (starting from an empty
queue) must take at most cm steps in the worst case, for some constant c.

↑これと↓を両立させることはできるのでしょうか?

A randomized queue containing n items must use at most 48n + 192 bytes of
memory.
0752デフォルトの名無しさん垢版2017/12/05(火) 13:24:03.96ID:bL4Z2L1G
あ、なんだ

簡単でしたね。

Item[] 型の Resizing Array を使えば、

メモリ使用量 〜 8*n

だから、4倍くらいメモリを無駄に使っても

48*n を超えませんね。
0753デフォルトの名無しさん垢版2017/12/05(火) 13:25:09.16ID:bL4Z2L1G
あ、なんだ

簡単でしたね。

Item[] 型の Resizing Array を使えば、

無駄が全くないときのメモリ使用量 〜 8*n

だから、4倍くらいメモリを無駄に使っても

48*n を超えませんね。
0754デフォルトの名無しさん垢版2017/12/05(火) 13:27:33.45ID:bL4Z2L1G
これから実装しますが、また100点満点中100点になりそうです。
0755デフォルトの名無しさん垢版2017/12/05(火) 13:43:27.58ID:bL4Z2L1G
あ、やっぱりだめですね。

dequeue の計算量がネックになりますね。
0756デフォルトの名無しさん垢版2017/12/05(火) 13:45:25.54ID:bL4Z2L1G
あ、分かりました。
一様ランダムに選択された a[i] に a[N] を移せばいいんですね。
0758デフォルトの名無しさん垢版2017/12/05(火) 21:20:28.14ID:YaGuI/6t
経路探査でray cast algorithmというのがあるらしいんだが、わかりやすいサイトない?
0759遊園垢版2017/12/07(木) 01:30:59.64ID:AoT+leNM
おちんちん に ベロが届くアルゴリズムを教えて下さい。
0767デフォルトの名無しさん垢版2017/12/24(日) 12:09:02.25ID:croU9pw3
ちょっと質問させてください。
状況: トータル1000行くらいある巨大メソッドの改修
言語; PHPだがどの言語でもそう関係のない内容

・まずコントローラのアクションメソッドがあって

public function action(引数){

/* 500行くらいの既存コード */

/*今回改修を加えたい50行位のコード */

/* 500行位の既存コード */
}
となっている。
0768デフォルトの名無しさん垢版2017/12/24(日) 12:16:40.00ID:croU9pw3
・ここで、改修要件は、中間にある「/* 50行くらいの既存コード */」を
  if文で分岐させて分岐次第で違う処理を入れる。というもの。
  したがって、

public function action(引数){

  /* 500行くらいの既存コード */

  if(条件1){
    /* 新規追加コード */
    if(条件1-1){
      /* 新規追加コード */
    }else{
      /* 既存コード */
    }
  }else if(条件2){
    /* 新規追加コード */
  }else{
    /* 既存コード */
  }

  /* 500行位の既存コード */
}

みたいにひたすら条件分岐して既存コードと新規追加コード
が何回も実行されるようにしたい。
0769デフォルトの名無しさん垢版2017/12/24(日) 12:22:57.90ID:croU9pw3
・ここで、俺は「/* 既存コード */」の中身を知っている必要は
 ないと思った。だから、このコードの詳細を読まずに「func()」
 として「action()メソッド内部」に切り出した。
・外部に切り出したのではなく、内部に切り出したのはその処理が
 他のアクションメソッドでは共有されるような汎用的なものではないだろうと
 判断したのと、そのメソッド内で処理を追いやすいようにというのを
 優先させたため。何より、その処理内で使っている関数内ローカル変数の
 依存性の関係上そうせざるを得ないと思った。

public function action(引数){

  /* 500行くらいの既存コード */

  private function __legacy(){
    /* 50行くらいの既存コード */    
  }

  if(条件1){
    /* 新規追加コード */
    if(条件1-1){
      /* 新規追加コード */
    }else{
      __legacy();
    }
  }else if(条件2){
    /* 新規追加コード */
  }else{
    __legacy();
  }

  /* 500行位の既存コード */
}
0770デフォルトの名無しさん垢版2017/12/24(日) 12:31:59.59ID:croU9pw3
・【訂正】上記で「func()」として切り出したと言っているが、
  「__legacy()」に変更しました。すみません。
・上記のように改修した所、レビューを受けたときに怒られた。
・まず、「この__legacy()の中身ちゃんと読んだ? 把握して書いている?」
 という指摘。
・そして「ここメソッド内だけどどうして関数定義しているの?
 他の人そんなことしてないでしょ。どうして変わったことするの?」
 という指摘。

・まず1つめの指摘に対して異議がある。
 ブラックボックス化しなければ大規模なコードは書けないんじゃない?
 ということが言いたい。ライブラリとかフレームワークの機能も全部
 先に中身をよくよく読んでおかなければ使ってはいけないことになるじゃん。

・2つの指摘に対して、
 「周りの人がやっていること」が正しいとは思えない。
 処理を切り出していないから1000行もある巨大なメソッドになっていて、
 汚いコメントで汚しながら機能追加しまくっているんじゃないのかと。
 ローカル変数を使いまくりの同じ処理を何回も実行するのに
 他に良い手段があるとしたら皆さんに教えて頂きたい。
0771デフォルトの名無しさん垢版2017/12/24(日) 13:24:11.47ID:d+M5RyEv
汎用的でない50行のコードをコピペしてるんなら関数化してもインライン化してもどっちもどっちだな
DRYを意識したのかもしれんがKISSが抜けてる
それにブラックボックスが許されるのは有名なライブラリやフレームワークのようなテストにテストを重ね、かつ多くの利用者による実績があるものだけだよ
社内コードなんて大概クソコードだしブラックボックスにしても後で痛い目を見るのは自分や他の開発者
何なら単に今把握するだけじゃなくて、未来の自分や開発者のためにわかりにくいところをコメントで説明書きしてもいいくらいだ

あと関数内関数より無名関数を変数に代入した方がいいんじゃね
そもそも新規追加したif文も詳細はわからないがデータよりもロジックに寄っててわかりにくそうな匂いがプンプンする

それに上司には理由を聞かれてるんだから同じローカル変数に別の値を入れて使い回すことの危険性、関数化による参照透明の確保や保守性、メンテナンス性の向上を論理的に答えればいいだけ
0772デフォルトの名無しさん垢版2017/12/24(日) 13:31:29.00ID:ZUclbhk1
>>770
レビュアーが言ってることを正しいと仮定すれば
・1つ目の指摘は既存のコードがカプセル化されてないからだ
・2つ目の指摘はリファクタリングするだけの時間やお金や技術がないからだ
という前提が必要になるから、まあそういうことなんじゃなかろうかと

残念なコードっていうのはあるからね
それを修正する費用と修正して得られる効果を比較対照して
これだけの効果があるんだからこうするべきだと提案をまとめて
説得するのがいいのだろうけど、技術に理解のある人がいないとなかなか難しいね

レビュアーの立場で考えると以下の作業があるんじゃないかと
・改修要件を満たす改修
・既存のコードをカプセル化する
・リファクタリングする

レビュアーは既存のコードとの一貫性を維持しつつ
改修要件を満たす最小の改修をやって欲しいのだろうね

たとえ汚らしいコードであってもいままで動いてきた実績があると
変更に対しては既存のコードをできるだけ変えないようにと保守的になるものだよ

レビュアーがそれをきちんと説明できればいんだけど
コードはクソ、レビュアーもクソなんてことはザラにあるんですよこれが
0773デフォルトの名無しさん垢版2017/12/24(日) 13:35:53.06ID:croU9pw3
>>771 なるほど勉強になります。
少し質問したいが、
・「KISSが抜けている」と言うのはどこらへんでしょうか?
・関数内関数と無名関数の変数化の違いがわからないので教えてください。
 (面倒なら調べます。)
・あなたならどう対応する?
・「理由を聞かれてるんだから答えればいいだけ。」
 →多分論理的に説明したら「じゃあもう何も教えないよ。好きにやって」
  が返って来ると思われる。
  そう言われると、必要な情報も来なくなるし聞けなくなる。
0774デフォルトの名無しさん垢版2017/12/24(日) 13:38:47.27ID:croU9pw3
>>772
なるほど、俺自身が「既存コードのカプセル化」と
「改修要件」という概念と「改修要件を最小に満たす」という
ことについて詳しくないことに問題がありそうだね。
ありがとう、ここらへんをキーワードにして調べてみます。
0775デフォルトの名無しさん垢版2017/12/24(日) 13:55:23.50ID:d+M5RyEv
>>773
多分もっと細かく汎用的な(publicにできる)関数の集まりに分解して、汎用的でない部分は最小限に出来るんじゃないかなーって思った
実際のコード見てないから予想だけど

関数内関数だとわざわざprivateかけないと外からアクセス出来ちゃうし、元の親関数抜けても子関数が死なない

そもそも上司とあんまり仲良くないの?
論理的にメリットを売り込んだときに感情論で否定されるくらいの関係性だと下っ端プログラマーはしんどいよ?
まぁ俺ならその段階なら折れて普通にコピペして、もっと実績残して仲良くなってから似たような案件のときに改めて売り込むかな
0777デフォルトの名無しさん垢版2017/12/24(日) 16:57:23.08ID:croU9pw3
>>775
なるほど、「まるまる関数化」というのが
ちゃんと機能を意識してカプセル化していないってことか。
一応privateは欠けているけど、関数オブジェクトと
関数定義の違いはあまり詳しくないね。そうか、親関数が抜けたとき
子関数が死ぬか否かの違いがあるわけね。
入りたてだから人間関係はいいも悪いもない。
ただ、本来責任ある人はバタバタしていて、経験ある人が自分の意志で
新人のレビューをバラバラに行っている感じ。

>>776
会社がそうさせているというよりはそれぞれの人員が
これまでの追加の仕方を真似て機能追加した結果メソッドがブクブクと太っている
という状況に見える。
メソッド内で各追加機能がコメントで区画されていてそれなら
別関数にすりゃいいのにって思っている。
俺をレビューした人も、別に会社の工程でそうなっているわけでなく、
進捗を見たかったからだと思うが、書き直しを要求してきて困惑している。
ただ彼は業務要件については圧倒的に俺より詳しいから無視すべきではないと
思っている。
0778デフォルトの名無しさん垢版2017/12/24(日) 17:21:20.21ID:d+M5RyEv
>>777
カプセル化はオブジェクト指向において関連するものをまとめる作業だから、ちょっと違うかな?
どちらかというと今回の話は関数型プログラミングの考え方に近い
まぁぶっちゃけ職場のコードなんて割り切らんとやってけんよ
出世してコーディングスタイルに口を出せるようになる日を待つしかない
0780デフォルトの名無しさん垢版2017/12/26(火) 20:02:37.53ID:IVX+3dWv
名前だらけのコードってどうやって解読すればいいんだ?
変数化するとそのデータの型が何なのか物量的にどれだけの
規模が格納されているかが見えない。
もちろんログに吐けば見えるが、吐き出さなければパッと見で
何をどう処理しているのか分からない。
0782デフォルトの名無しさん垢版2017/12/27(水) 07:26:44.87ID:uxDwhrz8
関数型言語の仕様書ってUMLで良いの?

データと振る舞い分離してるからクラス図使って良いのかなと
0784デフォルトの名無しさん垢版2017/12/28(木) 07:02:18.99ID:THqyhi+6
>>783
英語敷居たけえ

まあデータと振る舞いを書いたクラス設計は関数型言語でも同じように使えるし問題ないか
0787デフォルトの名無しさん垢版2018/02/03(土) 08:08:45.43
今どきデザインパターンって死語なの?
ちょっと参照したいことがあって書店でデザインパターンの本を探したけど見つからなかった。
リファクタリングの本はあって多少はデザインパターンの話も出てきたけど。
結局は家に帰ってから10年前に買ったデザインパターンの本を参照するしかなかった。
0790デフォルトの名無しさん垢版2018/02/03(土) 12:22:10.78ID:ROxRBp/z
デザパタは元々バカの為にまとめられたものだったけどバカには無理だった代物
一方リファクタリングはバカ程好むからなかなか廃れない
0791デフォルトの名無しさん垢版2018/02/03(土) 19:53:28.27ID:4eWkMwg8
21世紀最新のデザインパターン本て誰か書かないかね
Singleton→大抵はstaticでOK
みたいなの
0793デフォルトの名無しさん垢版2018/02/04(日) 00:33:23.10ID:P/Ibpspu
デザインパターンて結局何だったんだ?
高い本まで買ったがほとんど身に付かなかったな
0794 ◆QZaw55cn4c 垢版2018/02/04(日) 00:43:54.12ID:p5zvJFKF
>>793
もともと C++ 界隈で発生したテーマですので、C++ をやっているとデザパタの意義がよくわかります
C++ は細かしいことまで自分で記述しなければならないので、こういう大枠思考がもてはやされたのだと思います
0795 ◆QZaw55cn4c 垢版2018/02/04(日) 00:44:42.44ID:p5zvJFKF
ああ、でも C++ はテンプレートの世界観に移行してしまったので、デザパタ、今はあんまり使いません!
0796デフォルトの名無しさん垢版2018/02/25(日) 14:54:54.10ID:LHXgrTbX
>>793
アルゴリズムの話するときの共通語が必要になって
ついでに良し悪しもまとめておこうという話になった
0798デフォルトの名無しさん垢版2018/02/25(日) 18:39:48.45ID:hAg+nb3o
デザインパターンそこに至る考え方を身につけないと
というわけで、オブジェクト指向のこころをオススメしとく
0800デフォルトの名無しさん垢版2018/03/05(月) 21:38:39.67ID:aiLdZy6r
『アルゴリズムイントロダクション』を読んでいます。

ヒープソートのところに、

「サイズ n のヒープ上の MAX-HEAPIFY の最悪実行時間が Ω(lg n) であることを示せ。」

という問題があります。

最悪実行時間が Θ(lg n) であることはすぐに分かります。
なぜ、 Ω(lg n) であることを示せという問題なのでしょうか?

最悪実行時間や最良実行時間については、 Θ 記法で書くのが自然だと思います。
0801デフォルトの名無しさん垢版2018/03/06(火) 01:54:34.90ID:bDrXTt4P
まるちんこ
0802デフォルトの名無しさん垢版2018/03/07(水) 21:29:45.52ID:ukyKg6LA
セジウィックさんはいい加減ですね。

近代科学社から出ている『アルゴリズムC』の最小全域木のところを読んでいますが、
同じ重みの辺が2つ以上あると議論が破綻するところがありますね。

Wayneさんと共著の『Algorithms』では、すべての重みが異なるという仮定をおいていますね。

いずれにしてもひどい本です。
0803デフォルトの名無しさん垢版2018/03/07(水) 21:31:54.51ID:MzP8rhu8
キミはまだアルゴリズムの勉強していたのか。

人には向き不向きというのがあってだな。
0804デフォルトの名無しさん垢版2018/03/07(水) 21:33:49.91ID:ukyKg6LA
すべての重みが異なるというのは異常な仮定ですよね。
0805デフォルトの名無しさん垢版2018/03/07(水) 22:27:03.62ID:ukyKg6LA
茨木俊秀著『アルゴリズムとデータ構造』を読んでいます。

この本のクラスカルのアルゴリズムの正しさの証明に使われる補題の証明ですが、
読んでも分からなかったのですが、やはりおかしかったんですね。

同じ著者の『Cによるアルゴリズムとデータ構造』を読むと補題の証明が修正されています。

この分野っていい加減な本が多いですよね。
0806デフォルトの名無しさん垢版2018/03/08(木) 19:38:26.94ID:NHHLXFak
任意の連結無向グラフ G = (V, E) は |E| ≧ |V| - 1 を満たすことを示せ。
0807デフォルトの名無しさん垢版2018/05/12(土) 10:59:28.10ID:pDgCeBjY
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり

共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/

共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
ttp://photoshopvip.net/103903

ttps://goodpatch.com/blog/sketch-plugins/
0808デフォルトの名無しさん垢版2018/05/23(水) 20:11:35.70ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

BU06O
0809デフォルトの名無しさん垢版2018/06/24(日) 11:32:17.25ID:cbD8du/l
AVL木について詳しく載っている本は何ですか?
0810デフォルトの名無しさん垢版2018/06/24(日) 14:42:02.78ID:/GtGgmfo
詳しいと言えるかどうかは別にしてAVL木に関する説明が分かりやすいと思ったのは次の本の該当箇所(§6.3)だ

浅野哲夫『データ構造』、アルゴリズムシリーズ1、近代科学社 (1992)
0811デフォルトの名無しさん垢版2018/06/24(日) 15:07:06.81ID:F1zD07yq
ステマ
0812デフォルトの名無しさん垢版2018/07/04(水) 22:09:33.44ID:gFgZc5FG
C5O
0814デフォルトの名無しさん垢版2018/07/21(土) 20:42:50.98ID:4Q935nRZ
1つ言えるのはオブジェクト指向のなんかよりも
データ構造とアルゴリズムの方がよっぽど重要だということ。
昔はオブジェクト指向の勉強を頑張っていたけどそのときは
全然プログラミングがうまくならなかった。
現代の世の中はガチガチに設計されたライブラリを使って
コードを書くだけだから生半可なオブジェクト指向の知識なんて
ゴミ同然だよ。80年代90年代に考えられた思想とか、もうゴミに
なってしまった思想が多くて有害だよ。
結局現場でやることは「メソッドの使い方を求めてQiitaやStack OverFlowを
漁って成功するコードを見つけるまで疲れ果てる」ことに変わりはない。
せっかく勉強した内容が時代遅れで「裏切られる」ことのほうが多い。
0815デフォルトの名無しさん垢版2018/07/21(土) 20:51:29.70ID:4Q935nRZ
一方、データ構造とアルゴリズムをガッツリと勉強してから
様々なデータ構造の使い方、問題の解決がうまくなった。
ブロックチェーンのアルゴリズムの理解や
データ分析の数学的演算がコーディング
できるようになってプログラミングが格段に楽しくなった。
スマートにオブジェクト指向で設計する力なんかより
「ゴリゴリとアルゴリズムを書く力」の方がよっぽど重要。
「再利用性」?「変更の影響」だって?そんなものゴミだね。
それは自分以外の人間のメリットのための技術であって、
自分へ還元されるためのメリットではない。
再利用性は自分の書いたコードなら信頼できるしコピペして使えばいい。
自分の書いたコードのコピペは全然ありだと思う。
適したメソッドが見つからなかったらQiitaを漁ったりせずに
自分でゼロから実装したほうが速い。
その場で手っ取り早くコードを生成しているから、
どんな既存コードにも頼っていないから俺の実装したコードは
依存性は低い。
0817 ◆QZaw55cn4c 垢版2018/07/21(土) 21:58:56.02ID:vWALYQin
>>815
一つ重要な視点を提供しましょうか
自分の記憶などあてになりません、3ヶ月前自分が書いたコードは、もはや他人が書いたコードとなんら変わりありません
0818デフォルトの名無しさん垢版2018/07/21(土) 22:06:10.19ID:BkDv2dG7
>>814-815はすでに解いたことのある問題なら
忘れたとしても、少し時間をかければ解けると考えている

つまり誰かが出した出題を解くという作業をしている
0819デフォルトの名無しさん垢版2018/07/21(土) 22:34:33.64ID:4Q935nRZ
>>>817, 818
自分のいつも使うアルゴリズムのパターンが身についていれば
そのパターンや命名規則から何をやっているかは解読できる。
読みにくくなるのは外部から取り込んだ機能の実行や
継承している部分。
0820デフォルトの名無しさん垢版2018/07/21(土) 23:12:43.54ID:BkDv2dG7
>>819
やっぱり「解読」してるんだw

すでに証明済みの問題を自分の力で証明するという
お勉強をやってるだけだね
0821デフォルトの名無しさん垢版2018/07/21(土) 23:21:07.94ID:evbWgLmC
研究者で無い限り新しい証明考える必要ないっしょ
0822デフォルトの名無しさん垢版2018/07/21(土) 23:22:28.87ID:evbWgLmC
解読の工程は業務でも必要であるし
遊びとしても面白い
それが勉強になるならとても有益じゃん
0823デフォルトの名無しさん垢版2018/07/21(土) 23:34:47.51ID:4Q935nRZ
「車輪」は大きさ、材質、シャフトの接合部の形、色…大まかな形や役割は似ているが微妙に違うものが無数にある。
ちょっとでもこれらの特徴がずれたものは他への転用を考えるとすぐに不具合となって使い物にならない。
車輪を最初に「発明」した人物はこれらの無数の車輪を全て発明したわけではない。
だから他の人が死ぬほど似たようなものを作っていたとしても自分で作る必要がある。
他人が作った車輪は無条件で役にたつわけがない、
手直しして組み込むより「自分の規格で」作った方が早い。
0826デフォルトの名無しさん垢版2018/07/22(日) 02:15:34.77ID:+JtpRhMz
時代が違うからな。アルゴリズム考えてうんうん唸る時代は終わってるんだよ
今はそういうアルゴリズムが実装されたライブラリを組み合わせて
アプリを作る時代だってMITも言ってる

MIT「今は基礎よりライブラリ組み合わせてアプリ作る時代」 [無断転載禁止]©2ch.net
https://medaka.5ch.net/test/read.cgi/prog/1462443213/





MITがSICPを教えなくなった理由
http://cpplover.blogspot.jp/2016/05/mitsicp.html

今日では、状況が変わっている。

今のエンジニアは、自分が完全に理解していない複雑なハードウェアのための
コードを日常的に書いている(そして、大抵の場合、企業秘密により完全に理解するのは不可能である)。

ソフトウェアでも状況は同じだ。プログラミング環境は、多大な機能を提供する
巨大なライブラリ群の集合として存在している。

Sussmanの今日の生徒は、その時間の大半を、ライブラリのマニュアルを読み、
どのように組み合わせれば目的が達成できるのかを把握することに費やしている。

Sussman曰く、今日のプログラミングは、「より科学に近い。ライブラリを持ち寄って、
つっつき回すのだ。プログラムを書くには、突っつき回して、どのように動作するかを観察する。
そして、「目的を達成するために改造できるか」と考えるのだ」。

SICPの「合成による解析」という物の見方である、小さな、単純な部品を組み合わせて大きなシステムを作るということは、
もはや今日の状況にそぐわなくなった。今や、我々のプログラミングはつっつき回すことで行われている。
0828デフォルトの名無しさん垢版2018/07/22(日) 06:11:43.36ID:+JtpRhMz
そうだね。そもそもソフトウェアは他の製品と違って
完全に同じものを複製するのに技術がいらないからね
コピーすればいいだけだし。

その点、何かを作る職人とはぜんぜん違うよね
そいういう寸分違わないものを作り出す職人は不要な業界
0829デフォルトの名無しさん垢版2018/07/22(日) 09:02:23.96ID:XlZUepQP
>>825
そして、今は鉄道以外のほぼすべてのタイヤの接地面はゴムです。
そういうところもオブジェクト指向と、似てますね。
0831デフォルトの名無しさん垢版2018/07/22(日) 13:32:55.77ID:snsF+l1o
>>826
この論理は完全にお花畑。
完全無欠のライブラリがありそれが唯一無二なら
つつっつき回すだけでいいだろうさ。
だけど現実はほぼ似たような機能で構文が違う、
それに加え実行環境もバージョンも違うライブラリたちが乱立してるんだぜ、
それに加わりローカルで作られた野良ライブラリがある。
当然人によってそれらの使い方の認識に齟齬が生まれる。
信用できるのは、自身の即興のデータ構造定義能力と、
アルゴリズム構築能力だけだ。
0832デフォルトの名無しさん垢版2018/07/22(日) 13:34:08.83ID:LiIRy0eu
今必要なのは解読ではなくて解脱
0833デフォルトの名無しさん垢版2018/07/22(日) 14:02:08.11ID:+JtpRhMz
>>831
> だけど現実はほぼ似たような機能で構文が違う、
> それに加え実行環境もバージョンも違うライブラリたちが乱立してるんだぜ、

乱立しているからなんだっていうんだろう?
乱立してるから自分で作れってことにはならないよな?
何が言いたいんだろう

> それに加わりローカルで作られた野良ライブラリがある。

自分自身で作成したもの = 他人から見れば野良ライブラリだからね
野良ライブラリは作るべきじゃないね

だから乱立されている中のどれかを使うってことになるわけだけど
そういう結論を言いたかったんだよね?
0834デフォルトの名無しさん垢版2018/07/22(日) 14:02:42.93ID:YGqHpPTt
>>831
データ構造作るだけだと付加価値が低いというか
ただの作業員でしかなくない?
新しい仮想通貨作るとかだったらすごいけど
0835デフォルトの名無しさん垢版2018/07/22(日) 14:06:57.17ID:+JtpRhMz
まあ言えるのは、データ構造やアルゴリズムを作るだけの仕事なんて無いってことだな

やりたいからといって、それで金がもらえるわけじゃない
金を出す方がやってもらいたいことをやって金が出る

似たようなものを自作して、乱立させたって
そんなものに金を出す人はいない
0836デフォルトの名無しさん垢版2018/07/22(日) 14:18:22.79ID:LiIRy0eu
>>835
うむ

>>834
やったことないやつには判らんよ
0838デフォルトの名無しさん垢版2018/07/22(日) 17:42:32.79ID:bmpyz9fo
>>827
いや、ちょっと違う
プログラマという職業が、車輪を一から設計できる職人群と
それを再利用する専門家へと二極化していくというお話だよ

この二極化は以前から言われていたことだけど、
それを天下のMITが言い切って行動に移したことに>>826の意義がある
0839 ◆QZaw55cn4c 垢版2018/07/22(日) 18:20:24.01ID:+jM3tBOE
>>838
「職人」と「専門家」が逆ではないですか?
0840デフォルトの名無しさん垢版2018/07/22(日) 19:59:44.17ID:bmpyz9fo
いや、逆ではないよ

MITは計算機工学に特化しているわけでもなく、
機械工学、ロボティクス、生産工学、データ解析といった
あらゆる工学分野の専門家を養成し輩出している

そういった(計算機工学を除く)大半の「専門家」の卵達にとって、
優先すべきは(旧コースでSchemを使って学んでいた)計算機の動作原理ではなく、
計算機の利用方法である、という趣旨
彼ら「専門家」は決して計算機工学の専門家ではないが、
それぞれの分野に特化した高度な専門技術を有し、
与えられた問題を解決する道具として計算機を効果的に活用できる
0842デフォルトの名無しさん垢版2018/07/22(日) 21:07:14.12ID:+JtpRhMz
どんな仕事でも、その道の研究者ってのはいるだろう。
例えば数学者とかな。だけど世の中で必要とされてるのは
塾の数学の先生だったりするわけさ

もっとも大学に行った人の殆どは、大学で専攻していたものとは
関係のない仕事をしているわけだけどな
0844デフォルトの名無しさん垢版2018/07/22(日) 23:03:00.98ID:snsF+l1o
たとえばjsでオブジェクト構造をサーバに送りたいとする。
たったこれだけのことなのに邪魔くさい余計な機能が多すぎる。
わざわざ専用のクラスからインスタンス作って
専用の構文使ったりhttpヘッダー設定したりだ。
それでいてサーバ側では糞みたいな細かい仕様認識の違いでリクエストの内容が空だったりする。
サーバ側のコンフィグ見直したりjs側のコード見直したりするわけだ。
ログからライブラリのコード追っていくと大抵
過剰に技法使われてるから自ずと疑うべき探索
範囲は広くなる。
書き方はjQueryベースやangular typescriptなんかが混在してきて文法のちょっとした勘違いなんてのも生まれてくる。
だったらそんなライブラリ鼻っから信用しなけりゃいい。
ライブラリのインスタンスを介さずに多少原始的だが
文字列、数値 for文if文だけで大抵の問題は解決できる。
自力でJSON文字列に情報をぶち込んで送信してやれば、必ずサーバ側で取得できる。
サーバ側も下手なライブラリにパースさせないで自力でパースした方が慣れれば断然こちらの方が早い。
自力で作ったアルゴリズムは信用できるから
関数化しておいてまた似たような問題があったときに
使える。
俺が使うための自作ツールは他人は使わなくていいよ、どうせ価値観が違うんだからな。
自分で作ったもの以外はそりゃ不便だろうよ。
0847デフォルトの名無しさん垢版2018/07/22(日) 23:58:50.05ID:8Bgo+1zG
はい。このように他人の成果を利用して
目的を達成するのが今は重要って話です。
0848デフォルトの名無しさん垢版2018/07/23(月) 00:05:17.20ID:jaGQY9G3
>>844
> だったらそんなライブラリ鼻っから信用しなけりゃいい。

とりあえずお前が自力で作ったライブラリは
鼻っから信用しててないよ
0849デフォルトの名無しさん垢版2018/07/23(月) 00:19:04.74ID:jaGQY9G3
>>844
> 俺が使うための自作ツールは他人は使わなくていいよ、どうせ価値観が違うんだからな。
> 自分で作ったもの以外はそりゃ不便だろうよ。

価値観の問題じゃない。単にお前が作ったコードに
バグがあるから使えないだけ。使わないんじゃない。使えない。

反論するならバグがない証拠を出すこと
テストコードをかけという話ね。


> だったらそんなライブラリ鼻っから信用しなけりゃいい。
お前が書いたコードは鼻っから信用できない。するしないじゃない。できない。
0850デフォルトの名無しさん垢版2018/07/23(月) 06:43:27.98ID:LtlhEJ9n
みなさんお気づきだろうか
>>844>>849は同じことを言っている
0851デフォルトの名無しさん垢版2018/07/23(月) 07:32:08.19ID:LtlhEJ9n
jQueryはブラウザの差異を吸収するからね
同等のもの作ろうとしたら大変だよ

自前のコードを実装するのが汎用ライブラリを使うよりも早いとするなら
自前のコードは汎用ライブラリよりも機能が少ないものになる

要件がシンプルなら自作するのは効率が良いかもしれないね

システムをユーザのニーズに合わせてたら要件が複雑になり自作するメリットが得られない
ユーザがシステムの都合を忖度するならうまくいく
開発者にとっては桃源郷

開発者の幸せか、ユーザの幸せか
ぼくらはその選択を迫られてるんだ
0852デフォルトの名無しさん垢版2018/07/23(月) 09:47:19.69ID:nk4BkCBO
役所が作る神エクセルなんてのはユーザがシステムの都合に合わせてる典型例じゃないか、自作コードに拘るのは神エクセルを作るのと変わらぬよ
0853デフォルトの名無しさん垢版2018/07/23(月) 11:01:38.63ID:eU1p7hr8
>>842
自己紹介ですね
0854デフォルトの名無しさん垢版2018/07/23(月) 12:24:24.98ID:jaGQY9G3
>>851
> 要件がシンプルなら自作するのは効率が良いかもしれないね
それは正しくない。要件はシンプルでも実装が大変なことがある。
そもそも「ライブラリの一機能の独自実装」などという要件は
実際には発生しない。これらは単に道具

要件を実装するのに、道具を使うか使わないかの問題
シンプルな要件でも、道具は使ったほうが効率は良いよ

もちろん道具を使えない人であれば、道具を使えるようになるまで時間が
かかるけど、それは素人がプロに速度でかなわないという人間の問題にすぎない
そう道具を使えないなら素人なんだよ。
0855デフォルトの名無しさん垢版2018/07/23(月) 12:29:27.63ID:aoV6LMU9
>>850
ヒント:バカは皆がオンリーワン
0856デフォルトの名無しさん垢版2018/07/23(月) 12:36:13.41ID:jaGQY9G3
>>850
同じことは言ってないな

>>844はよくわからないのはライブラリのせいだ
自分で作れば、そのライブラリよりもわかりやすくなるはずだ
って机上の空論を言ってるだけ
0858デフォルトの名無しさん垢版2018/07/23(月) 15:02:52.51ID:EWSlu15m
りんごをむくのにピーラーを使うのもいいが、一度ナイフで剥くのを試すのも重要だし、かじってみるのもいい。
道具が解決する問題がなんなのか、体験することは、多くの人にとって有益だと思う(経験主義者)
0859デフォルトの名無しさん垢版2018/07/23(月) 15:32:18.18ID:1W7qAEKf
そこでピーラーを作るのは大変だとか見当違いの所に流れていくやつがいる。

ピーラー(ライブラリ)を使うか、ナイフを使うかだ

ライブラリ?中見たけどわけのわからないことをしてる
理解できない。ナイフのほうが単純だ。ナイフなら作れる。
なぜか作る話になってしまっている。
0861デフォルトの名無しさん垢版2018/07/23(月) 15:39:54.99ID:nk4BkCBO
例え話は物事を理解してなくてもそれらしく見せるから知ったか振りが捗りますなあ
0864デフォルトの名無しさん垢版2018/07/24(火) 18:20:36.91ID:WBO96fmU
最後までやれ
0866デフォルトの名無しさん垢版2018/07/27(金) 22:10:24.05ID:jesqHVAc
MVC, DAO, O/Rマッピングの発展形として、
俺は「R/Rマッピング(リクエスト/リレーショナルマッピング)」を
提唱したい。
そもそもDB上のカラムと本当に対応付けたいのは画面上のname属性
なんだよなぁ。
オブジェクトを必ず介する必要はない。
(処理が込み入ってきたら定義してもいい程度。)
まず前提として、DBのカラム名とHTML上のname属性を
必ず同じキーにすることを前提とする。(HTML上に関係ない
キーがあっても問題はない。)
その前提の上でDBのカラム名一覧を先に取得しておき、
カラム名リストと、受信したname属性のキーをマッチングして、
マッチングした時にそのキーから取得した値をSQLに突っ込んで
クエリを行う。
こうすることによって、プログラミング言語処理の中で
具体的な「項目名」をほとんど登場させずに処理することができる。
自分でやったらすごく便利だった。
こうなるとそもそもモデルとかDAOとかいらなくね?
ってなって来たよ。
項目数がどんなに二十, 三十と並んでいようがダラダラと羅列しない。
特別な処理を入れたいときだけその項目のカラム名を使って
ifで分岐して日付変換とかをおこなう。
その特別な処理も日付,範囲系、選択肢系などパターンを押さえれば、
めちゃめちゃ簡素化できる。
0867デフォルトの名無しさん垢版2018/07/27(金) 22:35:03.11ID:d6sXPNYF
あ、はい、4行ぐらいしか読んでないけど、
そのリクエストに含まれる名前 = オブジェクトのフィールド名なんだから
あんたが言ってるリクエスト = オブジェクトってこと

あとはストレージをなんにするかの話。
ODBMS(オブジェクトデータベース)を使えばそのまま読み書きできる
だけど、なんやかんやでリレーショナルデータベースを使わないといかんから
O/Rマッピングが必要になる
0868デフォルトの名無しさん垢版2018/07/27(金) 22:38:45.06ID:d6sXPNYF
>>886
あとRailsでも勉強しようね
普通は画面のname属性 = データーベースのフィールド名になってるから
(もちろん必要なら対応してないものも作れるけど)
0869デフォルトの名無しさん垢版2018/07/27(金) 22:58:52.80ID:HpMLTKup
二層CRUDオモチャ
昔から誰もが一回は考えるアイデアだよ

画面起点だとどうしてもアプリケーションロジックの居場所がないから簡単に作れてもアプリとしての価値が無い
DB起点だとSQLにアプリケーションロジックを埋め込んんで最低限のアプリの体裁は保てるけど保守性が最悪で使い物にならない
という理由から廃れた

なので今はオブジェクト指向の言語でモデルを書いてモデルから画面やDBを生成して微調整しようってのがスタンダード
これなら労力をかけずに豊かな振る舞いを持つアプリケーションを作れるしロジックがモデルに集まるから保守性も高い
0870デフォルトの名無しさん垢版2018/07/27(金) 23:43:33.59ID:jesqHVAc
>>869
モデルを作るとしても処理が複雑になる部分だけ
部分的でいいんじゃないか?
全ての要素に対して網羅的にモデルつくって
セッター/ゲッター定義して...ってのは肥大化して馬鹿げてる
気がするんだが。
なにせ機能を複製する時にこれらのずらずら並んだモデルオブジェクト名や
キーの名前をを置換しなけりゃならない。
ならない。
0871デフォルトの名無しさん垢版2018/07/27(金) 23:51:45.25ID:d6sXPNYF
> セッター/ゲッター定義して...ってのは肥大化して馬鹿げてる
それはJavaだけ
Javaが馬鹿げているだけ
0874デフォルトの名無しさん垢版2018/07/28(土) 02:15:45.58ID:kGN2HSKI
>>859
さてリンゴをむくか、
ピーラーがないと剥けないから探すか、
あれ、どこにしまったかな?
この引き出しにもこの棚にもない。
道具だらけで見つからない。
店に買いに行こう、たくさんのピーラーが並
んでいてどれを選ぼうか?
ようやく買ってきて構築しているけど、
どうや刃が付け替え式で色々な刃が付け替えられる
ようだ。
刃を買い忘れたからまた買いに行くか…
はぁはぁ…すごい刃を買ったぞ!今構築中だ。
おや?この刃はリンゴを剥く用途には対応して
ないようだ。もう疲れたしこれ無理だろ。
ピーラーが無いから俺にはリンゴを剥くのは
無理だ。前は引き出しにあったからむけたけど
今はできなくなった。

一方、いつも愛用のナイフで剥いてるならそう
はならない。
いつもポッケに入れているからなくさないし、
最悪自作で調達できる。
使い慣れてるからピーラー使うやつと遜色ないスピードで剥けるし形も綺麗に剥ける。
0875デフォルトの名無しさん垢版2018/07/28(土) 02:38:56.80ID:Wq9fNSFf
Rails なんか、全自動!

DB の表の構造が定義された、メタテーブルを参照して、
表の列名なども自動的に取得する
0877デフォルトの名無しさん垢版2018/07/28(土) 07:06:05.64ID:rUA3L/4N
>>870
それでずらずら並んで嫌だというなら、おまえのやり方だと画面定義もずらずらならぶし、テーブル定義やSQLがずらずら並んで更にわけわからなくなるだろ
0884デフォルトの名無しさん垢版2018/08/16(木) 01:50:12.60ID:c6C4Pdqe
最も重要ななのはアルゴリズムとデータ構造
次にI/O
つぎに無名関数やハンドラ、イベント駆動
つぎに並列、非同期処理
その次は画像処理とか3Dとか
ディジタル信号処理またいな各ドメインの専門
技術。
オブジェクトやクラスなんてこれらを達成する
上での手段でしかない。
それ以上のオブジェクト指向の設計思想は
もはや宗教。
唯一絶対に正しいわけでもないし
概念を余計に複雑にするだけ。
SQLやHTML XMLやJavaScript シェルスクリプト
URLなんかが絡んでくるとグダグダに崩壊
するものばかり。
そして現代のアプリケーションはこれら無しで
作るのは無理だからオブジェクト指向の高度な
技法はほどんど不要。
0885デフォルトの名無しさん垢版2018/08/16(木) 10:35:20.66ID:wiNukf+g
NoSQLω
0886デフォルトの名無しさん垢版2018/08/16(木) 14:12:13.61ID:sOMWRYDA
NoSQL db って、Redis以外はわりと滅びた感じ。
RDBでもスキーマレスなデータ扱えるようになったし、
トランザクションあった方が便利なことやっぱり多いし、
SQLってなんだかんだ言って表現力高いし。
0887デフォルトの名無しさん垢版2018/08/16(木) 21:39:02.86ID:xTRm/dST
pythonスレにも書いたのですが、pandasのMultiIndexにしたデータのままで、データを追加したり、値を更新したり、csvに入出力する方法をご存知の方はいませんか?
0896デフォルトの名無しさん垢版2018/08/30(木) 11:36:30.01ID:jf9m7XuW
AOJ の「DPL_1_I: Knapsack Problem with Limitations II」が分からん。

個数制限付きナップサック問題の
・ある品物の重さと個数制限
・ナップサック容量
が極めて大きいバージョン。


例えば解法
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=2856557#1
を見ると、品物の価値の総和が i であるときの最大容量を記録した動的計画法テーブルを作った後に貪欲法で答えを出してるんだが
・なぜこの方法で上手くいくのか
・前半の動的計画法で、品物の個数を min(m[i], MAX_V) としている (できる) 理由が分からない。


誰か知恵を貸してください。
僕としてはこの解法が理解できれば満足です。
0898デフォルトの名無しさん垢版2018/08/30(木) 16:38:34.35ID:AAPeDezt
>>897
どういう意味?
「このアルゴリズムを理解するのに必要な数学の分野」というものがあるならそれを参照するが、そんなものはない (挙げられないでしょ?)

俺個人の専門は物理で、「数学の勉強」というものも一応してきたが、このごく具体的な問の一解法を理解することと「数学の勉強」は関係がない

単純に論理的思考力を上げよ、と言っているなら会話になっていないのでこれ以上は結構
0900デフォルトの名無しさん垢版2018/08/30(木) 18:00:22.07ID:RB/Vojpj
うむ
0903デフォルトの名無しさん垢版2018/08/30(木) 19:55:53.34ID:dq2VmAiX
>>901
最適性の証明のことを言ってるの?
いずれにせよこの問題に限った話じゃないよね?
別に動的計画法が上手くいく理由が分からないと言っているのではなく、>>896の解法が分からないのだが。



>>902
違わない
算術、代数、幾何、解析だ全て
0905デフォルトの名無しさん垢版2018/08/30(木) 20:02:00.51ID:JJE0QqNc
フローチャートでも書けよバカ。
0909デフォルトの名無しさん垢版2018/08/30(木) 21:05:25.02ID:fZXCQKMc
>>906
分からんと思っているだけでは進まない。

なにを目的にして、どのようなフローチャートを描いて、
その結果なにが理解できていて、なにがまだ理解できていないのか、
可能な限り事細かに洗い出して、自分の理解の最前線を特定してみるといい。

と言うことを、私は数学で学んだ。
0913デフォルトの名無しさん垢版2018/08/31(金) 00:57:19.27ID:1Yp+WIrl
まあゲームじゃない限り物理なんて使わないよね
本格的な物理系シミュレーションとかだと
専門家が担当するだろうし
0914デフォルトの名無しさん垢版2018/08/31(金) 01:02:18.59ID:avsEGe4h
この程度の問題で数学数学言ってるアホ多過ぎて呆れる

多分>>910みたいな感じで高校の算数基準で話してるんだろうな
0915デフォルトの名無しさん垢版2018/08/31(金) 01:09:41.75ID:6Alav1/S
そんなに言うのなら、具体的に数学のどの分野なのか
それが具体的に何と同じなのか言えって。
どうせ論理的思考力がーみたいな精神論しか言えないんだろ
0917デフォルトの名無しさん垢版2018/08/31(金) 07:23:04.73ID:KNbvu5CI
どうしてこうなった
0921デフォルトの名無しさん垢版2018/08/31(金) 12:44:50.11ID:DXKxWv2O
>>920
数学の問題をコンピュータで解決するってのはわかる、
だが数学・物理特有の問題以外をコンピュータで解決するのに
数学はいらねーだろって話
0923デフォルトの名無しさん垢版2018/08/31(金) 14:39:40.99ID:DXKxWv2O
信号処理なんて、誰がやっても同じなんだから
一度ライブラリ作って、他の人はそれ使うだけだろ・・・
0925デフォルトの名無しさん垢版2018/08/31(金) 18:49:37.43ID:DXKxWv2O
>>924
だからそういうのは専門家に任せたほうが良くね?

音声合成をやる人は、そういう専門家に任せて
他の人は便利なインターフェースを作るとかさ、
なんでも1人でやるもんじゃないよ?
0926デフォルトの名無しさん垢版2018/08/31(金) 19:18:52.92ID:5OSgw2nY
別にそういう原理を知りたくないんなら勉強しなくて良いんじゃない
表面的なものしか作りたくないなら勉強しないことをおすすめします
0929デフォルトの名無しさん垢版2018/08/31(金) 20:05:55.05ID:OUCwI4mz
>>928
その理屈で言えば、君がそういう層になりたいだけでは?

残念だけど、自分がやりたいことと、他人がやってもらいたいこと
っていうのは同じじゃないんだよね

そして給料っていうのは、他人がやって欲しいことをやった対価として
もらえるものなので、いくら自分がすごいことができるって言ったからって
給料は高くならないんだよね。
0931デフォルトの名無しさん垢版2018/09/01(土) 09:56:42.06ID:pu0WuyWZ
うむ
0932デフォルトの名無しさん垢版2018/09/01(土) 10:48:54.59ID:iQmzKze8
自分一人で作るような小さいアプリとかなら、
全部を知っておかなければいけない、って思いたくなるのもわかる。

が、通常は数学の専門家でも無い人間を数学で信用する事は無いし、
プログラムの専門家でも無い人間をプログラムで信用する事は無い。

付け焼き刃は事故の元。
大きな仕事になればなるほど役割や責任が細分化される。
0933デフォルトの名無しさん垢版2018/09/01(土) 12:24:44.93ID:rDlJp/s7
ぼやっとして結局何を言いたいのか良くわからんが
何か良い事を言いってみたい必死さは伝わった
0936デフォルトの名無しさん垢版2018/09/01(土) 13:13:44.90ID:mPcVbgud
言ってることがわからんから、言ってるほうが馬鹿だと思ってるだけじゃないの?
俺に言わせれば、馬鹿だから言ってることがわからないんだと思うが?
0941デフォルトの名無しさん垢版2018/09/04(火) 02:27:34.18ID:Tt3u8CpR
アルゴリズム辞典みたいなものを手元に置いときたいんだが、最も支持されてるのってどれ?


・網羅性が高い
・支持されている(売れている)
・日本語版がある
・コード例はあってもなくても良くて、あるとしたら C/C++ か擬似コードで
という条件で
テーマ別に「どれとどれとどれを持っとけばまず問題ない」という言い方でもありがたい
とにかく網羅性を重視してる
0942デフォルトの名無しさん垢版2018/09/04(火) 07:04:17.98ID:OlESf3Ok
英語は知らんけど、日本語なら
[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)
奥村 晴彦
http://amzn.asia/d/bAqY5Be
が網羅性は随一じゃないかな。
改訂だけど初版が1991年で、収録アルゴリズムは増えてないらしいので、
機械学習とかここ25年の新分野は当然入っていない。
0943デフォルトの名無しさん垢版2018/09/04(火) 07:32:26.75ID:/VBaeORw
機械学習の何をアルゴリズム辞典に入れるべきだというのか

Amazonレビューかよテメェは
0945デフォルトの名無しさん垢版2018/09/04(火) 08:37:54.35ID:HF+7qfHp
より網羅的な対案示してからでないと批判にならないよ。

共立のアルゴリズム辞典が現存すればこっちも挙げてたかもしれん。
BM法に関してはコード例は簡略版のみだが。

個別のアルゴリズムについてどこまで踏み込むかは、
辞典の物理的な性質上取捨があるのはしかたないでしょ。
0946デフォルトの名無しさん垢版2018/09/04(火) 10:34:21.16ID:gEGTZvcA
>>943
+1
0947デフォルトの名無しさん垢版2018/09/04(火) 10:36:29.76ID:ROt4XEkp
名前がついていて解放も明らかになってるアルゴリズムに興味はない
そんなのいくらやっても新しいものは生み出されない
0949デフォルトの名無しさん垢版2018/09/11(火) 14:44:06.44ID:O54onciS
質問させてください。
マイコンからAD変換で入力したサイン波を配列に格納し、周波数を求めたいと思います。
ゼロクロスの位置を求めれば正確に周波数を求められそうですが、教えてください。
https://i.imgur.com/FC5XP0K.png
0950デフォルトの名無しさん垢版2018/09/11(火) 16:27:37.38ID:zEn+kcA0
質問が不完全だけど、そのためのアルゴリズムを教えてほしいということでよい?

前提として、各周期で確実に2回だけゼロクロスすると保証できるのなら、
前回の値を覚えておいて、今回との積が0以下になったらゼロクロス。

この保証がないのなら十分長く波形をとってFFTしてピークを探す。
0951デフォルトの名無しさん垢版2018/09/11(火) 22:09:31.90ID:i7axZbyN
♀だったらセクロス教えてやる
0952デフォルトの名無しさん垢版2018/09/11(火) 22:11:28.88ID:4O7I7zcY
え!?童貞なのにセクロスを!?
0953デフォルトの名無しさん垢版2018/09/12(水) 03:44:12.77ID:gw3HbkUV
できらあ!
0955デフォルトの名無しさん垢版2018/11/05(月) 18:00:44.74ID:ajh0QscM
有向グラフの有向閉路を求める問題です。

深さ優先探索を実行したときに、 Backward Edge が存在する。



有向閉路をもつ



⇒は自明ですが、逆はどう証明するのでしょうか?
0956デフォルトの名無しさん垢版2018/12/03(月) 20:50:16.30ID:wBSUle4B
深さ優先、幅優先探索を理解するのにオススメの本ってありますか?(コードサンプル付きでできればC)
0958デフォルトの名無しさん垢版2018/12/04(火) 10:14:50.08ID:GTmuusXQ
>>957

全くおすすめできません。その本。
0959デフォルトの名無しさん垢版2018/12/04(火) 10:27:11.51ID:GTmuusXQ
>>956

グラフ・ネットワークアルゴリズムの基礎: 数理とCプログラム
浅野 孝夫
固定リンク: http://amzn.asia/d/2MetXvf
0961デフォルトの名無しさん垢版2018/12/04(火) 14:19:52.12ID:X/ZQLD1J
学ぶ目的には全くお勧めできないってのはその通りだけど、
手元に置いておいて使う分には便利な本ではあるような。
あ、浅野先生の本も待ってます。
(この分野、浅野先生が2人いて紛らわしい)
0962デフォルトの名無しさん垢版2018/12/04(火) 14:28:35.23ID:GTmuusXQ
>>956

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
渡部 有隆
固定リンク: http://amzn.asia/d/g8qmfS6

↑この本にも、 BFS、DFS共に書いてあります。

解説は非常に雑ですが。
0963デフォルトの名無しさん垢版2018/12/04(火) 14:33:05.75ID:GTmuusXQ
>>959

の本には、再帰を使う DFS プログラムが書いてあります。(スタックを使う DFS プログラムは演習問題にあり、コードをダウンロードできます。)
0964デフォルトの名無しさん垢版2018/12/04(火) 14:34:21.14ID:GTmuusXQ
>>963

スタックを使う DFS プログラムは演習問題にあり、コードをダウンロードできますし、本にも解答のところにコードが載っています。)
0965デフォルトの名無しさん垢版2018/12/04(火) 14:39:02.72ID:eKuwOju4
前置記法(ポーランド記法) + 1 2
後置記法(逆ポーランド記法) 1 2 +
中置記法 1 + 2

確か、構文木をたどる時に、どれかが幅優先で、どれかが深さ優先探索になると、記憶している
0966デフォルトの名無しさん垢版2018/12/05(水) 13:24:47.73ID:2sSegHBZ
shaderって何回書き換えてもメモリ壊れない?
0967デフォルトの名無しさん垢版2018/12/05(水) 21:47:02.62ID:xYhP2Ga4
テンプレのソース探検なんちゃらのサイトいいね
pdf買えはうざいけど

ソートはクイックマージヒープの特性くらい押さえとけば良さそうな感じだな
そこら中に実装あるしまあ
バケットソートは聞いたこと無かったけど、これは局所で凄い威力発揮しそうだ
覚えとく価値ありそう
0971デフォルトの名無しさん垢版2020/01/13(月) 02:33:48.51ID:D6MgPK0q
こんにちは、初質問させていただきます、グラフアルゴリズム初心者です

・無向グラフGが入力として与えられる(ファイルからでも、コード内での手打ちでも、どちらも良い)
・Gがサイクルを持てばGの中の最小サイクル(長さが最も短いサイクル)とそのコストを出力する
・各辺、頂点の重みは考えなくても良い(つまり辺のコストは1とする)
といったアルゴリズムを実装したいです。
できればC言語もしくはC系統の言語でコーディングしたいです。

考え方と共に、コーディング例をご教授いただけると幸いです。

浅い知識ではありますが、この実装に必要そうである
・DFS,BFS
・ダイクストラ、ベルマンフォード
に関しては、基礎レベルは把握しています。

お手数おかけしますが、ご助力いただけると幸いです。
0972デフォルトの名無しさん垢版2020/01/13(月) 04:31:10.60ID:6QaMEdT1
適当に言うけど、

すべての辺を1回だけ通りながら、通った頂点を記録していく
それで同じ頂点を、2回以上通ったら、閉路がある?
0974デフォルトの名無しさん垢版2020/01/13(月) 13:32:08.60ID:D6MgPK0q
>>973
条件不足で申し訳ございません

グラフサイズの制約は特に設けないものとしています。
とりあえずは最大でも100頂点程度で考えています。

お手数お掛け致しますが、よろしくお願いします。
0975デフォルトの名無しさん垢版2020/01/13(月) 13:32:16.76ID:D6MgPK0q
>>973
条件不足で申し訳ございません

グラフサイズの制約は特に設けないものとしています。
とりあえずは最大でも100頂点程度で考えています。

お手数お掛け致しますが、よろしくお願いします。
0976デフォルトの名無しさん垢版2020/01/13(月) 17:13:44.37ID:jqPh5nAm
>>975
頂点数をn,辺数をmとする
ある頂点uを含んだ最小閉路は頂点uからbfsをすればO(n+m)で求められる(最初にuに戻ってきたときの経路が最小)
あとはすべての頂点に対してこれをして,その中から一番短いものを選べばいいので,全体でO(n(n+m))で求められる
0977デフォルトの名無しさん垢版2020/01/13(月) 22:42:08.62ID:D6MgPK0q
>>976
ありがとうございます。

つまり、例えば
各頂点を始点-終点とするダイクストラアルゴリズム処理を行えば良い
ということでしょうか。
0978デフォルトの名無しさん垢版2020/01/13(月) 23:30:01.64ID:jqPh5nAm
>>977
イメージとしてはそんな感じです
辺を考えたほうがわかりやすいかもしれないです

ある辺(u-v)を含むようなサイクルの中で最小のものを求めたいとします
まずグラフから辺(u-v)を除去します.このグラフ上でuからvの最短距離dを求めます
すると,d + 辺(u-v)が辺(u-v)を含むサイクルの中で最小のものとなります

グラフの中で一番短いサイクルは辺(u-v)を含んでいるかはわからないので,すべての辺に対して上の操作を実行します
その中から一番短いものを選べば,それがグラフの中で一番短いサイクルです
この場合だとO(m(n+m))です
0979デフォルトの名無しさん垢版2020/01/15(水) 13:45:14.74ID:oHYk5H5Q
>>978
ありがとうございます。
ご教授いただいた考えをもとに、ダイクストラ法を用いて実装してみました。
・ダイクストラ(グラフは頂点とコストで表現)
https://ideone.com/bXF0iQ

また、以前似たものを実装したのですが、これはダイクストラ(もしくはBFS)の考えに則れていますでしょうか・・・?
(グラフは隣接行列で表現)
https://ideone.com/snxvav

どちらにしても、始点と終点が同一でない場合はうまくいくのですが、
始点と終点を同一として閉路で求めようとすると、うまくいきません。
自己ループ辺のコストが0であるから、と思い9999などにしてみましたが、うまくいきませんでした。

すごく単純なミスなのでしょうが、詰まってしまっている状態です。
修正等いただけると幸いです。

一応、(可能であれば)望む仕様と結果としては
・グラフは隣接行列で表現
・辺の重みは非負である(今回、簡易化のために辺の重みは1~9)
・グラフサイズは制限しない(今回、簡易化のために10頂点程度)
・ダイクストラを用いて自分自身を始点かつ終点とする最短経路を求める
・各頂点に対して上のダイクストラを行い、中でも最短の閉路の経路とそのコストを表示する

です。

お手数をおかけしますが、よろしくお願いします。
0980デフォルトの名無しさん垢版2020/01/15(水) 16:39:42.37ID:Ex9G0OLU
>>979
>>971だと辺のコストは1となっているが,実際は辺に1以外のコストがある?
求めたい最小サイクルというのは,使う辺の本数が最小という意味なのか,使う辺の合計コストが最小という意味のどちらなのか
0981デフォルトの名無しさん垢版2020/01/15(水) 21:49:25.61ID:oHYk5H5Q
>>980
コストは1だと申し上げましたが、
ダイクストラなので非負であれば求まると思い、汎用性を考えて1以外のコストも付与してみました。
説明不足で申し訳ございません。
0982デフォルトの名無しさん垢版2020/01/15(水) 23:25:41.19ID:Ex9G0OLU
>>981
無向グラフだと面倒くさくて,uからvにいったあとvからuにいくような場合がでてくるのでこれを除かないといけない
そのような経路を除いたうえで始点に戻ってきたものが最短になる
ある辺が2回使われることはないので,辺は1度しか使えないようにすればいいと思う
0985デフォルトの名無しさん垢版2020/01/18(土) 22:58:37.26ID:iLU56BHo
>>983
>>984

ありがとうございます。
コストだけでなく、経路も出力したいのですが、弄ってみてもなかなかうまくいきません...。
0986デフォルトの名無しさん垢版2020/01/19(日) 12:55:00.98ID:VFlG/sWR
CLRSのダイクストラのアルゴリズムの正しさの証明を読み終わりました。
行間が全くなく、確かに、正しいことは分かりますが、あまりイメージのわかない証明ですね。

CLRSって他の本と比べると異常に行間がないですよね。
0988デフォルトの名無しさん垢版2020/01/20(月) 17:27:30.27ID:/b+J8VIk
>>985
どのへんがわからないか言ってくれ
Find minimum weight cycle in an undirected graphは
int Graph :: ShortestPathでu-vを削除したときの最短経路を求めてる
このときdist[v]が更新されるたびにvにきたノードをメモしておけば最後にvからprevをたどって復元できる
このときの経路をvector

楽な実装方法は,グローバル変数にこれまでの最短経路の距離とルートをもっておいて
常に最短のものを保存しておけばいい
0990デフォルトの名無しさん垢版2020/01/25(土) 23:49:17.89ID:Q85YRMjK
>>988
正直、C++の知識不足で勉強を頑張ってはいるのですがVectorの使い方がまだ、慣れていません。。。

厚かましいのは重々理解しているのですが、可能であればFind minimum weight cycle in an undirected graphのプログラムを>>988さんなりに改変したものをお教えいただけると幸いです。。。

悪い勉強法とは分かっているのですが、答えというか実装例が無いとなかなか理解できなくて。。。
0992デフォルトの名無しさん垢版2020/01/26(日) 13:25:18.52ID:eN1PAkvI
>>990

https://ideone.com/pShuim

↑一応動きました。
piという変数に経路を覚えさせています。
0993デフォルトの名無しさん垢版2020/01/26(日) 13:32:46.65ID:eN1PAkvI
>>990

piについては、

Cormen, Leiserson, Rivest, Stein著『Introduction to Algorithms 3rd Edition』の最短路の章を見ると、

書いてあります。
0994デフォルトの名無しさん垢版2020/01/26(日) 13:47:50.10ID:eN1PAkvI
アルゴリズムとデータ構造ってコンピューターサイエンスの分野で人気ないんですか?
0995デフォルトの名無しさん垢版2020/01/26(日) 16:03:48.66ID:gJO14xRt
>>994
ネット以外だとデータ構造とアルゴリズム好きな人見たことないな
CS系だと機械学習やってるやつが多い
0996デフォルトの名無しさん垢版2020/01/26(日) 16:28:11.19ID:eN1PAkvI
>>995

ありがとうございます。

機械学習は非常に流行していますが、勉強するのに面白い分野だとは思えません。
0997デフォルトの名無しさん垢版2020/01/27(月) 12:15:36.42ID:Dkceayzl
DAGの単一始点の最短経路問題を解くアルゴリズムとか
Bellman - Fordのアルゴリズムとかの正しさの証明が非常
に面白いですね。
0998デフォルトの名無しさん垢版2020/01/27(月) 17:15:29.90ID:Xu7tzl7q
>>996
+1
0999デフォルトの名無しさん垢版2020/01/27(月) 17:16:05.01ID:Xu7tzl7q
>>997
-1
1000デフォルトの名無しさん垢版2020/01/27(月) 17:16:23.08ID:Xu7tzl7q
>>999
+1=1000
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1317日 2時間 28分 54秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況