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

連想配列と総量計算

2015年8月 8日

このエントリーをはてなブックマークに追加 Clip to Evernote
総量計算を連想配列使って効率よくこなす方法をまとめました。ただ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]

Twitter
>> その他のtwitter

instagram

カテゴリ

最近のエントリー

最近掲載した画像
  • ゆるキャン△見ていると、野外でかんたんな飯を作って食べたくなる!
  • あべのハルカスでやっていたジブリの立体建造物展を見て来た
  • ASUS VivoBook E203NA-464W:単純な使い道に限定するのであればコスパはかなり高い
  • ASUS VivoBook E203NA-464W:単純な使い道に限定するのであればコスパはかなり高い
  • ASUS VivoBook E203NA-464W:単純な使い道に限定するのであればコスパはかなり高い
  • ASUS VivoBook E203NA-464W:単純な使い道に限定するのであればコスパはかなり高い
  • iPhone6のバッテリーを安価で交換してきた
  • iPhone6のバッテリーを安価で交換してきた
  • iPhone6のバッテリーを安価で交換してきた
  • iPhone6のバッテリーを安価で交換してきた
  • クリスマスプレゼントは『once upon a time』で、グダグダおとぎ話世界をカードで彷徨う!
  • 喪中はがきの裏面を安価に且つ素早く作るのにも はがきデザインキット が使える
  • 喪中はがきの裏面を安価に且つ素早く作るのにも はがきデザインキット が使える
  • 喪中はがきの裏面を安価に且つ素早く作るのにも はがきデザインキット が使える
  • 祖母が亡くなったので葬儀を手伝う

RSS
更新情報はRSSをご利用下さい
サイトマップ