1 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:15:02 ] 【質問者へ】 回答者の便宜のため、以下の注意事項を遵守してください。 ・質問は【課題提示用テンプレ】を利用してください。 ・問題文は、出題されたまま全文を書いてください。 ・数学問題は「○×法でせよ」だけでなく、その数式、前提条件も説明してください。 ・JavaScriptは板違い、Web制作板をご利用ください。 ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 ・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。 ・回答されたら動作報告を必ずしてください。 ・課題文が長い時、添付ファイルがある時はこちらのアップローダーを使うと便利です。 ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htm 【課題提示用テンプレ】 【 課題 】与えられた課題文をそのまま書きます。 《必須》 【 形態 】1. Javaアプリケーション(main()で開始)/2. Applet/3. Servlet/ 4. 携帯(開発環境のver.必須)/5. その他(明記のこと) 《必ず選択》 【 GUI 】1. AWTのみ/2. Swing/3. SWT/4. 制限なし/ 5. その他(明記すること) 《GUIの課題の場合必ず選択》 【 期限 】提出期限、解答希望日を書きます。「できるだけ早く」はNG。 《必須》 【 Ver 】コンソールでjava -versionを実行し、その結果を貼ります。 《必須》 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 【 補足 】課題について自分なりに補足する事、何か思う事があれば書きます。 丸投げでない場合は、途中までのソースとその経過報告、 質問点、疑問点を書きます(なるべく丸投げにしてください)。 【回答プログラムの掲載場所】 Java質問スレWiki ttp://www.wikiroom.com/java/ ソースポストネット ttp://sourcepost.sytes.net/ ろだ2 ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htm 【前スレ】 pc12.2ch.net/test/read.cgi/tech/1232627790/
101 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 20:55:45 ] 夏休みの宿題の駆け込みとかあったらイヤだな
102 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 15:34:04 ] jad知らないもんなんだな。もしかしたらeclipseも知らないのかね。 学生ってまぞいことやってるんだな。
103 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 15:48:47 ] >>102 学生に割り当てられるショボイPCだと、最新のeclipseはきついかも知れない。
104 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:19:51 ] >>102 昔Jadclipseってのがあったな。今もあるのか知らないけど。 >>103 eclipseはごちゃごちゃプラグイン入れなければ、 バージョン3の方が2の時より軽い気がするが、気のせいか。 10年程前か、始めて使いはじめた頃は正直遅くて使えなかったな。
105 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:09:21 ] >>102 つーか、学生にclassファイル渡してこれと同じのを作れって言う 講師ともどもってことだなw
106 名前:デフォルトの名無しさん [2009/08/10(月) 16:59:12 ] わからないことが多すぎて もう自分に向いてない気がしてきた。 問題も全部英語だし、その意味すらもあやふやだし この科目の単位さえ取れればいいのに。
107 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 17:52:03 ] >>106 講師に言え
108 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:22:21 ] なんか、延々、オーストラリアかどこかの通信制大学の課題を投げてるやつがいたっけ。
109 名前:デフォルトの名無しさん [2009/08/11(火) 21:03:20 ] abstract class Animal { private static int count; public static void increment() { count++; } public static int getCount() { return count; } abstract void noise(); } class Dog extends Animal { public Dog() {}; public void noise() { System.out.println("Woof"); increment(); } } class Cat extends Animal { public Cat() {}; public void noise() { System.out.println("Meow"); increment(); } } public class Counter{ public static void main(String[] args) { Animal[] a = {new Dog(), new Cat(), new Cat(), new Dog(), new Dog()}; for (int i = 0; i < a.length; i++) a[i].noise(); System.out.println(Dog.getCount() + " woofs and " + Cat.getCount() + " meow"); } } なんかおかしいところありますか?
110 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:50:09 ] >>109 スレ違い。
111 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:57:10 ] >>109 おかしくはないが、思っているようには動かんだろうな。
112 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:29:19 ] 暇だから弄るか >>109 プログラムは書かれている通り動いたぞ >Woof >Meow >Meow >Woof >Woof >5 woofs and 5 meow
113 名前:デフォルトの名無しさん [2009/08/12(水) 00:33:54 ] >>110-112 ありがとうございました。 どう変えれば 3Woofs and 2Meowになるのでしょうか?
114 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 00:46:07 ] >>113 スレ違いだといってるだろうが >>1 を見るか質問スレへ行くかしろ
115 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 01:12:40 ] >>113 自分で考えろ。以上。
116 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 17:41:03 ] 【 課題 】3×3のマス目で行うマルバツゲームの作成。人対コンピュータで、難易度の選択が可能。 レベル1 だれでも勝てるようなレベル レベル2 人間と互角 レベル3 勝つことは不可能に近い 【 形態 】2. Applet 【 GUI 】4. 制限なし 【 期限 】8月22日 正午まで 【 Ver 】java version "1.6.0_13"
117 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 17:55:27 ] >>116 ええと、人間なら勝敗はつかないゲームなんだけど・・・ ja.wikipedia.org/wiki/%E4%B8%89%E7%9B%AE%E4%B8%A6%E3%81%B9
118 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 17:59:03 ] 3x3のマルバツゲームなら最善手で引分けになる そして最善手で進めるのは普通の人間でも十分可能 つまり人間と互角のレベルと 勝つことは不可能に近い=引き分けになってしまうレベルは同じくらいだろう どんな人間を想定しているのか知らないがレベル1とレベル3だけでいいんでは? 人間と互角っていうのがあやふや過ぎる
119 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 17:59:09 ] >>116 これ出した奴はただのアホだな。
120 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 18:14:32 ] >>119 「○×ゲームつくれ、あと、工夫したら加点」くらいの課題だったのでは?
121 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 19:08:38 ] >>120 出題者乙 とか言ってみたり
122 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 22:57:27 ] >>116 レベル1:人間先手で、交互に置いて、最終的に多く置けたほうが勝ち レベル2:特定のマスをランダムに決めておいて、そこに置いたほうが勝ち レベル3:人間先手で、交互に置いて、最終的に少なく置いたほうが勝ち
123 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 23:33:19 ] それ既にマルバツゲームじゃなくね?w
124 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 23:36:26 ] そうか、仕様策定からはいるわけか。。。 うまいな
125 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:09:07 ] 引き分けは後手勝ちにすればいんじゃね?
126 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:22:21 ] 人間ってなんだろう?
127 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 00:01:21 ] >>125 それで、レベル1は人間が後手、レベル2はランダムで後手が決まり、 レベル3はコンピュータが後手ということですね。
128 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 00:39:21 ] 期限まで時間がまだあるから難易度についての詳細か仕様変更の>>116 のレス待ちだな
129 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 00:59:09 ] マルバツゲームをするときは、相手に揃えさせたら勝ちって風にすることがある
130 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 01:04:08 ] >>129 その場合でも先攻後攻ともに最善を尽くせば引き分けになる
131 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 14:24:55 ] 先手が真ん中取れば相手の反対側に打っていけば絶対そろわないしな
132 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 14:30:55 ] 引き分けたら乱数で決めちゃえ
133 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 18:50:39 ] >>116 ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/782.java EASY:負けるように負けるようにと動く HARD:最悪でも引き分けに持ち込む NORMAL:基本的にHARDとして振舞うがたまにミスる(ミスるところが人並み) というようにした めんどくさいのでユーザは常に先手 改良の余地多し 特に メモリを喰いすぎる点がまずい そこを半端に対策練って変に高度になってしまったとこもまずい
134 名前:デフォルトの名無しさん mailto:age [2009/08/16(日) 01:15:35 ] 【 課題 】JPEG圧縮データからBMP画像を生成するプログラム。 ただし、ハフマン復号化、逆量子化、逆DCT変換の処理は自ら作成する。 【 形態 】1. Javaアプリケーション(main()で開始) 【 GUI 】4. 制限なし 【 期限 】8月いっぱい 【 Ver 】java version "1.6.0_13"
135 名前:134 mailto:age [2009/08/16(日) 01:35:35 ] 御免!!これも頼みます。 これは一応なんとなくはできてるんだけど、自信がないので。 【 課題 】BMP画像からJPEG圧縮データ生成するプログラム。 ただし、DCT変換、量子化、ハフマン符号化の処理は自ら作成する。 【 形態 】1. Javaアプリケーション(main()で開始) 【 GUI 】4. 制限なし 【 期限 】8月いっぱい 【 Ver 】java version "1.6.0_13"
136 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 03:53:50 ] >>135 自ら作成するというのが死ぬほど難しいな。
137 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 04:01:29 ] jpegに関する資料とかあればやってくれる人いるかも
138 名前:134 [2009/08/16(日) 04:21:48 ] jpeg圧縮のプログラムは↓を参考にしてみた。ってかこれ一応できてるけど。 www.geocities.co.jp/SiliconValley-SanJose/8609/labo/jpegcoder.html jpegのファイル構造は↓にある hp.vector.co.jp/authors/VA032610/JPEGFormat/StructureOfJPEG.htm あと↓には詳しいアルゴリズムが載ってる www.marguerite.jp/Nihongo/Labo/Image/JPEG.html 一番苦労しそうなのが、jpegデータからハフマン復号するところかな!? どうか、よろしく頼みます。
139 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 09:55:07 ] 既にハードチップに組み込まれてるほど普及してるのになんでまたjavaで再生産するの? それよりjpegのアルゴリズムのコツをまとめたサイトを作るほうに時間使ったほうが断然いいんじゃないのか。
140 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:43:44 ] Palm用にアセンブラで JPEG デコーダ作ったことあったな・・・ その情熱はもう無いわ
141 名前:デフォルトの名無しさん [2009/08/16(日) 17:09:04 ] 【 課題 】ろだ2の783でうpしてあります。 【 形態 】1 【 GUI 】4 【 期限 】8月28日まで 事情があり授業にほとんど出れてないので、ほとんどわかりません。。 一応参考書は開いてみたのですが、自力でできる気がしないのでよろしくお願いします。
142 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 17:18:26 ] >>141 授業出ないと学費払ってる親が泣くぞ.
143 名前:141 [2009/08/16(日) 17:57:08 ] >>142 すみません、やむを得ない事情がありまして。。 よろしくお願いします。
144 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:23:33 ] >>141 に限らずだが。 確かに>>1 に添った書き方にはなってるがな。 もうちょっと、せめてどんなレベルなのか(じゃんけんなのか電卓なのかjpedCODECなのか程度) 一言でいいから書いといて貰えないか。 出来そうもないようなモノをわざわざダウンロードして中身みる手間をかけずにすむ。
145 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:00:38 ] 学校も高校・高専・専門・大学一般・大学理工に分けてくれると判り易いな
146 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:57:08 ] たんなるテキストデータだからDLしなくてもブラウザで見れる ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/783.txt
147 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:38:10 ] >>141 ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/784.txt
148 名前: tor-proxy mailto:age [2009/08/17(月) 17:51:51 ] 自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L 名言集 その3 『いつもサボってばかりのキャップがウゼえ』 yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★ > 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0 > >>69 > 大変って言うか > 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。 > ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて > その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから > > 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。 ---------------------------------------------- この自動焼人 ★メールマガジンの配信停止をご希望される方は qb5.2ch.net/test/read.cgi/sec2chd/1250169591/ にて自動焼人 ★までご連絡ください
149 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 13:14:28 ] サーブレットプログラミングに関する宿題の質問は受け付けていませんか?
150 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 13:16:57 ] >>149 【 形態 】3. Servlet
151 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 20:06:06 ] >>149 >>1
152 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 13:36:47 ] 【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/786.txt 【 形態 】3 【 GUI 】4 【 期限 】今日中 よろしくお願いします。
153 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 17:03:27 ] プログラム中でどう使用されているかの説明を求められているわけでなく クラスやメソッドの機能の説明をせよってことなんだから APIドキュメントの記述をそのままコピーすればいいんじゃない?
154 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 19:03:40 ] >>153 すみません、具体的に教えてもらってもいいですか? ほんと知識が0に等しいもので・・・
155 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 16:57:20 ] >>154 sdc.sun.co.jp/java/docs/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/package-summary.html
156 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 14:12:33 ] >>155 ??
157 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 15:40:13 ] 【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/787.txt 【 形態 】コマンドプロンプト 【 GUI 】制限なし 【 期限 】9月2日16時まで (なるべく早く) 【 Ver 】1.6.0_12 行列や固有値を扱う数値計算の課題です。 締切まで時間がなく申し訳ありませんが、どうぞよろしくお願いします。
158 名前:157 mailto:sage [2009/09/01(火) 15:50:39 ] ↑一個ズレました。 【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/788.txt です。 よろしくお願いします。
159 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 16:21:15 ] >>157 参考リンクの逆反復法のソースを見たけど変なプログラムだな。 命名規則は置いておいても再描画のたびに数値計算を最初から繰り返すとか。 改造の大まかな方針としては、 paintの中のコードをそのままmainのコードとして置き換えて、 Drawで始まるメソッドやg.drawStringは数値計算ではなく出力するだけの部分なので、 drawStringについてはSystem.out.printlnでdrawStringの第一引数を与えるものに置き換える。 本来フレームのタイトルになるsetTitleについてもそのまま標準出力に出せばいい。 Drawで始まるメソッドについては与えられた行列やベクトルを表示するためのものなので、 例えばDrawMatVect(g, "*","=", 240, A, B, C, 4,4);なら、 A, B, Cという行列やベクトルの値をループを回して各要素ごとに標準出力に出力するようにする。 行列の要素を行単位で出力するコードくらいは書けるでしょ?
160 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 16:29:36 ] >>159 ありがとうございます。 自身はないですが、やってみます。 他にも回答を下さる方がいましたら、どうぞよろしくお願いします。
161 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 16:30:06 ] 忘れてた。 paintの中身をmainに持ってくる場合、 MultMV等のインスタンスメソッドはクラスメソッドにしておかないと呼べなくなる。 メソッドにstaticを付けるのさえ面倒なら、 mainの中身をnew InvPower().calculate();とでもして、 InvPowerのコンストラクタを消して、 paint(Graphics g)をcalculate()と名前を変えてもいい。 extends Frameも要らない。
162 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 17:09:57 ] >>158 ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/789.java >>159 の方針に従って最小限の改変をした 表示がgdgdなのはそちらで直してくれ 表示の行と列の向きがこれで合ってるかどうか確認するのも面倒なんで もし逆なら行と列を入れ替えて表示するよう直してくれ
163 名前:162 mailto:sage [2009/09/01(火) 17:27:02 ] 課題そのものはその先があったのか まあ出力の改変方法が分からなくて改変し切れなかったということみたいだから参考程度にしてくれ
164 名前:157 mailto:sage [2009/09/01(火) 20:13:08 ] 皆さんありがとうございますm(_ _)m 参考にはなりましたが、>>162 はLU分解を用いないものでした; 全部で多くても100行程、メソッド数も少なく済ませられるとのことなので、 課題>>158 を引き続きお願いします。
165 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 11:44:26 ] 【 課題 】20億個の数字が入っているファイル(約16GB)をソートし、結果をファイルに出力せよ 数字は32bit(Float)のバイナリフォーマットで記録されている 基準となる実行時間は15分(4 AMD Opteron 848 processors and 8 GB of RAM上) 【 形態 】コマンドプロンプト 【 期限 】9/5 15:00まで 【 Ver 】java version 1.6.0_14 【 補足 】よろしくお願いします
166 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 12:36:51 ] 嫌です
167 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 13:02:34 ] >>165 動作確認する気にもならんし。遅くても知らん。つか絶対早くは無い。 import java.io.*; import java.util.Arrays; public class Floats { public static void main(String[] args) throws IOException { float[] datas = new float[2000000000]; DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(args[0]))); try { for(int i=0; i<datas.length; i++) datas[i] = dis.readFloat(); } finally { dis.close(); } Arrays.sort(datas); DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(args[1]))); try { for(int i=0; i<datas.length; i++) dos.writeFloat(datas[i]); } finally { dos.close(); }}}
168 名前:デフォルトの名無しさん [2009/09/02(水) 13:34:44 ] 【 課題 】以下のようなコンソールアプリケーションを作成しなさい。 ・画像などのバイナリファイルをコピーする ・プログラムの第1引数でコピー元のファイル名を、第2引数でコピー先のファイル名を指定する ・コピーの際に、必ずバッファリングを行う 【 形態 】1. Javaアプリケーション(main()で開始)/ 【 期限 】本日 【 Ver 】1.6.0_13 よろしくお願いします
169 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 13:36:11 ] >>167 回答ありがとうございます でも、ファイルが16GBの大きさなので、全部一度に読み込むとメモリが足りません なんとか、メモリの消費を抑え、15分程度でソートを完了する方法はないでしょうか? Merge sortで、2個のファイルに分割、その2つのファイルを入力とし、 Mergeしてファイルに書き込む(繰り返し) というようなことを考えたのですが、いまいちよくわかりません。
170 名前:デフォルトの名無しさん [2009/09/02(水) 14:11:15 ] 【 課題 】以下のようなコンソールアプリケーションを作成しなさい。 ・HTMLなどのテキストファイルをウィンドウに表示する ・プログラムの第1引数で指定したファイルを、ウィンドウのJTextAreaで表示する ・読み込みの際、必ずバッファリングを行う 以下のようなコンソールアプリケーションを作成しなさい。 ・HTMLなどのテキストファイルを、別の文字コードに変換してコピーする ・コピー元のファイル名と文字コード、およびコピー先のファイル名と文字コードは、 プログラムの引数ではなく通話的にコンソールから入力する。 ・ファイル名や文字コードの指定ミスがあった場合、エラー内容を表示して再入力を促す。 ・コピーの際、必ずバッファリングを行う。 【 形態 】1. Javaアプリケーション(main()で開始)/ 【 期限 】できれば本日 【 Ver 】1.6.0_13 追加でよろしくお願いします。
171 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 14:12:14 ] そうか、自分でやるのか〜。 先生うれしいぞ〜
172 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:24:24 ] >>169 その考えで正解だと思うが、何がいまいち分からんの?
173 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:52:05 ] >165 4バイトデータが20億個入った16GBファイルの残り8GB以上は何が入ってるの? 頭から20億個データを読んであとは無視してソート後の出力ファイルは半分のサイズになっていいということ?
174 名前:165 mailto:sage [2009/09/02(水) 23:10:18 ] >>173 本当だ、おかしいですね、混乱させてすみません 4バイトデータが16GB分あるということです だから出力ファイルも同じサイズになります 数字の数は気にしないでください >>172 何がわからないのかさえもよくわからないというか… すみません、自分の力不足です スピードを求めるなら、Merge sortの前に、メモリに読み込める分を分割して読み込んで Quick sortした方がいいのでしょうか?
175 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 00:08:35 ] >>174 クイックソートは意味ない。 単純に 1.ある範囲ごとに記録するファイルを変更する 2.各々のファイルに関して 2.1そのデータを丸ごとメモリに読めるなら、読んでクイックソート。 2.2丸ごと読めないならそのファイルに関して1に戻る。 3.全てのファイルでソートが終わったら ソート済みのファイルを、記録範囲が小さい順番に結合する。 こんな感じじゃない? 速度を気にするなら、 1で元ファイルのデータ読み込みで1度に読む量を増やす。 (当然メモリ使用量は増える) 2.1で丸ごと読める上限を上げる。 位じゃないかな?
176 名前:172 mailto:sage [2009/09/03(木) 00:19:04 ] >>174 >>175 に追記 マルチプロセッサなら、 2の処理を複数のスレッドに分配すれば、処理時間は短くなるかも知れん。 あと、メモリ8GB積んでいるってことは64bitOSなんだよな? 遅くていいなら>>167 は動くはず。 64bitプロセスならデータがメモリに載らないことはない。
177 名前:165 mailto:sage [2009/09/03(木) 01:09:18 ] >>176 すみません、あまり理解できていません… 3 5 4 1 9 8 7 2 15 を、まず一部分ごとにQuick sort して、 3 4 5 | 1 8 9 | 2 7 15 というようにして、このファイルを先頭から交互に2つのファイルに記録し、 その二つのファイルをmergeする(繰り返し)という意味だったのですが、 やはり、はじめのQuick sortは意味がないでしょうか? 学校のサーバで、OSはRedhat Enterprise Linux 5.3です。
178 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 06:40:43 ] もし>>174 の通りfloatデータが16GB分あるのならデータ個数はintの範囲を超えるので、 たとえメモリが潤沢にあったとしてもデータ全体を収めるfloatの配列を作ることはできない。 また物理メモリサイズと同程度の大きさを確保してデータを収めるために使えば、 JVMやOSその他で使っているメモリが追いやられてしまうので速度的にとても不利になる。 もう少し小さめの例えば4GBくらいのfloat配列を確保して、 (1) 4GB分データをfloat配列に読み込む。 (2) float配列をソートする。クイックソートを使うArrays#sortでもいいし、他の好みのソートでもいいと思う。 (3) ソートされた配列の内容を一時ファイルに書き出す。 (4) (1)-(3)を4回繰り返して4つの一時ファイルを作成する。 ここまでが部分ごとにソートされたデータを作成する段階で、 (5) 1番目と2番目、3番目と4番目に作成した一時ファイルをそれぞれマージして新たなファイルを2個作成する。 (6) (5)で作成した2個のファイルをマージして全体がソートされた出力ファイルとする。 のように2つのファイルの先頭から小さい方(大きい方)を取り出して新しいファイルに出力することを繰り返す。 もちろんファイルの読み書きでは1個ずつとかでなくバッファを利用した読み書きにする。 FileChannelを利用し、バッファも大きいサイズのダイレクトバッファを予め用意して使い回せば、 ファイルの読み書きは少しは速くなるかもしれない。 ディスクの空き容量がそれなりに必要(上の例なら元データ+ソート済みデータ+2段階の一時ファイルで64GB分)なので、 空き容量次第で一時ファイルはマージ終了後にすぐに消さないといけないかもしれない。 それからJVMの最大ヒープサイズの初期設定は物理メモリの1/4か1GBの小さい方なので-Xmxで必要分を指定してやること。 初期ヒープサイズもついでに最初から大きく取っておいてもいいかも。
179 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 06:53:49 ] > たとえメモリが潤沢にあったとしても は余計でした。 メモリ容量のこととJavaの文法的に作れないこととは別の話なので。
180 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 08:36:57 ] >>177 ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/790.java 効率とかエラー処理とか諸々を全く考えずに大まかな流れだけを実装するとこんな感じに。 データ数を10000個(CHUNK_SIZE=2500)にしてソートされたっぽいファイルができたことだけは確かめた。
181 名前:165 mailto:sage [2009/09/03(木) 14:20:19 ] >>180 何から何までありがとうございます これを参考にして、頑張ってみます
182 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 06:15:27 ] >>177 もう見てないかも知れんが。 3 5 4 1 9 8 7 2 15 を例にとると、 ・データの範囲を0〜19とする。 ・データは3つまでしか読めない。 という仮定で、簡略化のため、テンポラリファイルにも3つの値しか書きこまないとする。 テンポラリファイルは7つできる。それぞれ0.dat〜6.datとする。 最初に、3つ読み込む メモリには「3,4,5」がある。 これを0.dat〜6.datに振り分ける。 この場合、1.datに3,4,5が書き込まれ、他のテンポラリファイルには何のデータもない。 次にもう3つ読む。 メモリには「1,9,8」がある。 これを振り分けると、1→0.dat、9→3.dat、8→2.datとなる。 最後に3つ読み振り分ける。7→2.dat、2→0.dat、15→5.datとなる。 この時点で振り分け終わり。各テンポラリファイルには、 0.dat:「2」、1.dat:「3,4,5」、2.dat:「8,7」、3.dat:「9」、4.dat:「」、5.dat:「」、6.dat:「15」 というデータが入っている。 次に各テンポラリファイルごとに読み込みなおして、クイックソート→書き戻しを行う。 これでテンポラリファイルの内容は 0.dat:「2」、1.dat:「3,4,5」、2.dat:「7,8」、3.dat:「9」、4.dat:「」、5.dat:「」、6.dat:「15」 となる。これを連結すれば 「2,3,4,5,7,8,9,15」 となって全体のソートが完了する。 こんな感じ。
183 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 07:35:40 ] >>182 float範囲内にどう分布しているか分からないのに振り分けてどうするんだよ。 ヘタしたら1ファイルに全部入るだろ。
184 名前:182 mailto:sage [2009/09/04(金) 21:45:19 ] >>183 むしろ振り分けなくてどうやるつもりなんだ? 1ファイルに入ることは何の問題もないだろ。 そのファイルを再分割するだけじゃん。
185 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 13:04:42 ] >>184 狭い範囲に集中してた場合、時間が掛からんか?
186 名前:182 mailto:sage [2009/09/05(土) 14:54:44 ] >>185 何を問題視しているかが良く分からん。 一体何と比較して時間がかかることを懸念しているんだ? 再帰が1段増えるだけじゃん。 再帰の深さもlogNのオーダだよな?
187 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 17:28:29 ] >>186 DataInputStreamがデータ一周なめるだけで15分の大半を消費しね? ファイル処理の再帰が不用意に一段深くなるだけでアウトになりかねない。(時間制限的に) バイナリレベルでファイル分割->ソート(一発メモリ上ソート)->マージ 上の流れならいけると思う。 DataInputStreamを最低2周させる必要がある。 ファイル分割以降の処理をCPUコア数で並行処理できても、 最後のマージを工夫しないと結構きついかな。
188 名前:182 mailto:sage [2009/09/05(土) 18:57:22 ] >>187 >バイナリレベルでファイル分割->ソート(一発メモリ上ソート)->マージ その場合マージの過程が大変じゃね? と思って最初の分割に一工夫入れてマージ作業を楽にしようと考えたんだけど。 >>187 のやり方だと、マージ処理で次に結果ファイルに書き込む値を決めるときに ファイルから値の読み込み→ソートという処理を行う必要があるよね? メモリ上にN個のデータの最小値を決定して、結果ファイルに書き込んで 次に書き込む値を決定するときに、ファイル上のデータ最小の可能性もある訳で、 メモリ上のN-1個のデータで最小値を決めるわけには行かないよね? 俺的にはこの部分が非常にヤバイ(データの偏り関係に関係なく必ずI/O数が爆発する)と 思うんだけど、その辺は大丈夫なの?
189 名前:182 mailto:sage [2009/09/05(土) 19:11:47 ] 追記。 俺のやり方が突っ込みまくられてるのは、I/Oのデータ量が 馬鹿にならなくなるからだと思う。 んで、確認しておきたいんだけど、このテの問題って ・I/Oのデータ量を抑えること ・I/Oの要求数を抑えること のどっちが大切なの? 俺は今まで後者だと思っていたんだけど、この認識が 間違い?
190 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 19:22:50 ] >>186 どう再分割するかが問題 狭い範囲にデータが集中しているようなものの場合その再分割を たとえば値が集中した区画を単純に等分していくなら再帰が一段増える程度では済まんだろ 対象のデータ量の規模が大きいから1段増加するだけでもかなりのロスになる 何かlogNよりも大きい方法と比べているわけでないからlogNのオーダーであることは意味を持たない 結局データの分布を調べないといけないんだが 一度にfloatがとりうる各値の度数を調べるには無理がきかない体だ 確かに分布さえ分かっているのなら分布数え上げソートできなくもないが 何段になるか分からない再帰を行うよりも オンメモリの範囲で分割して回数の分かっているマージを行う>>187 の方が現実的
191 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 19:29:06 ] >>188 マージソートについて何か勘違いしてるんじゃないか? マージ前の各部分については既にソート済みなんだから、 マージは各部分の先頭を見てどちらかを選択していくだけで済む。
192 名前:182 mailto:sage [2009/09/05(土) 20:10:36 ] >>190 理解できた。ありがと。 >>191 勘違いしてた。 いっぺんにマージすることばっかり考えてて、ボトムアップ的に マージすることが頭になかったわ。 確かに>>187 が普通のやり方だね。
193 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 21:01:11 ] floatの上位4ビットを使ってテンポラリファイル0〜15に書き出す。 テンポラリファイル8〜15、0〜7の順にバケットソート→結果ファイルに出力。 これで良い気がしてきた。
194 名前:193 mailto:sage [2009/09/05(土) 21:13:17 ] NaNの扱いをどうにかしないとだめか
195 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 01:50:59 ] もちっと期限に余裕があったら182のも書けば165が実際に試してくれたかもな。
196 名前:デフォルトの名無しさん [2009/09/08(火) 04:00:11 ] 【 課題 】 1. キーボードから次々に非負整数の入力を受け付け、それらの中での正の最小値を表示するプログラムを作成せよ。 データ入力の終わりは負の整数の入力とする。 2. キーボードから次々に非負整数の入力を受け付け、それらの中での(正の)偶数、奇数、ゼロが それぞれ何個ずつであったのかを*の数で表示するプログラムを作成せよ。 データ入力の終わりは負の整数の入力とする。 【 形態 】1. Javaアプリケーション(main()で開始 ?? 【 GUI 】? 【 期限 】今から2時間後まで 【 Ver 】? 【 補足 】初歩のプログラムの授業の課題で、私自身もさっぱりの状態です・・・ できるだけ基本的なプログラムでお願いします。
197 名前:196 [2009/09/08(火) 05:45:57 ] 期限を1時間伸ばします どなたかよろしくお願いいたします
198 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 06:10:51 ] >>196 課題1 public class MainClass { public static void main(String[] args) { java.util.Scanner sc = new java.util.Scanner(System.in); System.out.print("整数を入力してね(負数で終了):"); int input = sc.nextInt(); int min = input; while(0<=input){ if(input<min){ min=input; } System.out.print("整数を入力してね(負数で終了):"); input = sc.nextInt(); }; System.out.print("最小の値は "); if(0<=min){ System.out.println(min); }else{ System.out.println("定まりませんでした "); } } }
199 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 06:11:10 ] >>196 課題2 public class MainClass { public static void main(String[] args) { java.util.Scanner sc = new java.util.Scanner(System.in); int zero=0,even=0,odd=0; while(true){ System.out.print("整数を入力してね(負数で終了):"); int input = sc.nextInt(); if(0<=input){ if(input==0){ zero++; }else if(input%2==0){ even++; }else{ odd++; } }else{ break; } }; System.out.println("ゼロの個数:"+zero); System.out.println("偶数の個数:"+even); System.out.println("奇数の個数:"+odd); } }
200 名前:196 [2009/09/08(火) 06:47:36 ] >>198-199 ありがとうございます。非常に助かりました。
201 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 02:15:25 ] 課題2の結果は、「*」の繰り返しで表示するんじゃないの? 微妙に仕様と違う動きなのが 初心者っぽさの演出にはなっているが…。