連想配列と総量計算 : つねづね思ふこと

«« Cyclemeterで自転車ログを計測して眺めてみるのは面白い | 簡易商品申込ページをメールフォームで作る際、オプションをカスタマイズできるようにするなら「jquery.add-input-area」が使えそう »»

連想配列と総量計算

2015年8月 8日

このエントリーをはてなブックマークに追加
総量計算を連想配列使って効率よくこなす方法をまとめました。ただSQL使っているならsumとgroup byを使うほうがてっとり早いか。


リレーションデータベース内に、メンバーと作業量のテーブルがあり、作業量のテーブルには、各メンバーがキーになってます。
作業量テーブルでは、同じメンバーのデータが登録日時は別で多重に挿入されている事もあります。詳しくは下表参照。

・メンバーテーブル

メンバーID 名前 特徴
2 若林 妙子 義妹。
3 小日向 あゆ 真面目に朝から晩までバイトしている。
50 神崎 麻衣 生徒に人気の養護教諭。

・作業量テーブル

メンバーID 日時 作業量
50 08:30 3
3 09:20 5
2 10:50 1
50 11:11 2

さてメンバー毎の作業総量をコードで出す場合、どう組めば効率よく計算出来るでしょう?
そんな課題へ取り組む場合、DBからselect文から配列に取り込んだ後、うっかりするとこんなコードを書いてしまいます。

※言語は適当ですのでツッコミ禁止です。

for i = 0 to count(メンバー)
  作業量[j].総作業量 = 0;
  for j = 0 to count(作業量)
    If (メンバー[i].メンバー===作業量[j].メンバー ) {
      作業量[j].総作業量 += 作業量[j].作業量;
    }
  next
next

このコードがアレなのは、メンバー×作業量分の処理が必要で、それぞれが多い場合処理が爆発的に必要になってしまうんですよね。
しかもその大半が何もしない処理で大変無駄。

そこで連想配列!
活用することで、if文否定による無駄を省くすることが出来ます。

for i = 0 to count(メンバー)
  総作業量["メンバー[i].メンバーID"]=0;
next
for i = 0 to count(作業量)
  総作業量["作業量[i].メンバーID"]+=作業量[i].作業量;
next

こうすると処理する回数が、メンバー+作業量になりますので、大幅に減ります!
オススメです!

でも、よく考えたらこのぐらいの処理なら最初からSQLのsumとgroup by使って直接やらせた方が圧倒的に早い...。

select メンバーID,sum(作業量) from 作業量テーブル group by メンバーID

※メンバーテーブルの名前は、「ギャルゲーヒロイン自動生成」から拝借しました。

アルゴリズムが世界を支配する (角川EPUB選書)
KADOKAWA / 角川書店 (2013-10-10)
売り上げランキング: 792

投稿者 kuze : 2015年8月 8日 22:10


■このエントリーに関連した記事

■「実用ソフト&サイト」カテゴリの最新記事

«« Cyclemeterで自転車ログを計測して眺めてみるのは面白い | 簡易商品申込ページをメールフォームで作る際、オプションをカスタマイズできるようにするなら「jquery.add-input-area」が使えそう »»


自己紹介
PHPやVBによるコーディングやシステムエンジニアを仕事にしています。
主にiPhoneアプリの紹介やWeb開発などのPC系の話題と、アニメやゲームなどのサブカルな話題を取り扱っています。

[PR]

instagram

カテゴリ

最近のエントリー

最近掲載した画像
  • 映画『ゴジラ-1.0』レビュー(ネタばれあり)
  • Three-up HC-T2206WHで狭い部屋も快適に
  • 「君たちはどう生きるか」は父親を気にするかで評価が別れそう(ネタバレあり)
  • 画像生成AIソフトでしばらく毎日SNSに画像を上げてみたけどネタ出しについて
  • ホットクックを使えば一人で並行して色々作りやすくなるのでオススメ
  • ホットクックを使えば一人で並行して色々作りやすくなるのでオススメ
  • ホットクックを使えば一人で並行して色々作りやすくなるのでオススメ
  • Python3.4向けにつくったAPIが、Python3.6では動かなくなったので直してみた

RSS
更新情報はRSSをご利用下さい