Quantcast
Channel: つねづね思ふこと 〜 ゲームやアニメの紹介を中心 に、あと気がついたときにプログラムネタも書いてます
Viewing all articles
Browse latest Browse all 153

連想配列と総量計算

$
0
0

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

・メンバーテーブル

メンバー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

Viewing all articles
Browse latest Browse all 153

Trending Articles