FLATzブログ

[技術情報]の記事一覧

モテるアルゴリズム講座  第1回 グラフでモテたい

2010年03月05日(金)15:00|amakata|FLATzブログ, アルゴリズム, 技術情報このエントリをdel.icio.usに追加このエントリをはてなブックマークに追加

天方です。


今日からモテるアルゴリズム講座を始めたいと思います。


それでは、第1回グラフでモテたいの講義を始めようと思います。
なんといってもアルゴリズムができるとかいうと、いろいろモテます。
この講座を通じて、皆さんもアルゴリズムをマスターしてモテてください。


本日は、モテるアルゴリズムを考える上で重要な
グラフのデータ構造について話をしたいと思います。


グラフというと、普通思い浮かべるのは棒グラフとか円グラフとかかもしれませんが、今回は違います。そんな反応をしていると婚期を逃します。


グラフというのは、点と枝かつながってできるものをグラフと言います。


グラフの例

グラフの例



グラフはいろいろな分野で使われていると思いますが、
あのGoogleも検索エンジンのページの順位付けのためにグラフの概念を利用していたいりします。


さて、グラフをコンピュータ上で扱おうとすると、そのデータ構造の持たせ方に悩みます。
グラフ用のライブラリを使えばそれほど大変でもないのですが、やはり自分で書いた方がモテます。


グラフをデータとして表現するにはいくつか方法があります。
では、上記の図で示したグラフをさまざまなデータ構造で表現してみようと思います。


まず、上の図の点と枝を数学的な表現を使って次のように表現することにします。


点の集合 V=\{v_1,v_2,v_3,v_4,v_5,v_6\}


枝の集合 E=\{e_1,e_2,e_3,e_4,e_5,e_6,e_7,e_8,e_9,e_{10}\}


その場合、点と枝の接続関係は次のようになります。


枝, 始点, 終点
e_1,v_1,v_2\\e_2,v_2,v_4\\e_3,v_3,v_4\\e_4,v_4,v_5\\e_5,v_5,v_6\\e_6,v_6,v_1\\e_7,v_1,v_3\\e_8,v_5,v_2\\e_9,v_3,v_6\\e_{10},v_1,v_1


ちなみに、向きがある枝でできたグラフを有向グラフと呼びます。
向きがない枝でできたグラフを無向グラフと呼びます。


こういったグラフを表現するデータ構造としては、枝の始点と終点の番号の組を持たせることでグラフを表現する方法があります。


それではこのグラフのデータ構造をRubyをつかって表現してみましょう。


例えば、上記の視点と終点をRubyの配列で表現すると下記のようになります。


start_vertex = [1,2,3,4,5,6,1,5,3,1]
end_vertex = [2,4,4,5,6,1,3,2,6,1]


これは、さきほど示した数学的な表現だと下記のような表現になります。
start\_vertex=[v_1,v_2,v_3,v_4,v_5,v_6,v_1,v_5,v_3,v_1]\\end\_vertex=[v_2,v_4,v_4,v_5,v_6,v_1,v_3,v_2,v_6,v_1] … ①


配列の添え字が、枝の添え字 – 1になります。


頂点間に枝があるかどうかを調べるには
頂点数をnとするとO(n)の計算量(時間的)がかかります。
また、計算量(空間的)は枝数をmとすると2mです。


そこで、各頂点毎に、出入りする枝を持つという手があります。


たとえば、下記の様な図のように一つの頂点に出入りする枝に注目します。


頂点v1に入る枝と出る枝の例

頂点v1に入る枝と出る枝の例



これはRubyで表現すると下記のようになります。


start_edge = [[1, 7, 10], [2], [3, 9], [4], [5, 8], [6]]
end_edge = [[6, 10], [1, 8], [7], [2, 3], [4], [5, 9]]


数学的な表現では下記のようになります。
start\_edge=[[e_1,e_7,e_{10}],[e_2],[e_3,e_9],[e_4],[e_5,e_8],[e_6]]\\end\_edge=[[e_6,e_{10}],[e_1,e_8],[e_7],[e_2,e_3],[e_4],[e_5,e_9]] … ②


これで、頂点と枝の両方から検索ができるデータ構造ができました。ここモテます。
でも、もうすこしハイクラスのモテを期待したい場合は、クラスを利用したほうがいいと思います。


さて、配列でグラフを表現できるとからモテモテだと思っていい気になってはいけません。
やはりグラフを表現する場合にもTPOがあります。
例えば、他のラフの表現方法としては、接続行列を使う方法もあります。


接続行列 M=\left\(<br />
  \begin{array}{ccc}<br />
   1  & 0  &  0 &  0 & 0 & -1 &  1 &  0 &  0 & 0\<br />
   -1 & 1  &  0 &  0 & 0 &  0 &  0 & -1 &  0 & 0\<br />
   0  & 0  &  1 &  0 & 0 &  0 & -1 &  0 &  1 & 0\<br />
   0  & -1 & -1 &  1 & 0 &  0 &  0 &  0 &  0 & 0\<br />
   0  & 0  &  0 & -1 & 1 &  0 &  0 &  1 &  0 & 0\<br />
   0  & 0  &  0 &  0 &-1 &  1 &  0 &  0 & -1 & 0\<br />
  \end{array}<br />
\right) … ③


縦の座標が頂点の添え字、横の座標が枝の添え字に対応し、
要素が1であれば、その頂点を始点、要素が-1であれば、その頂点を終点とすることを表現しています。
この場合、計算量(空間的)はnmです。頂点間に枝があるかを調べる計算量(時間的)はO(m)です。
ちなみに、接続行列だと、自己ループしている枝を表すことができません。
そういえば、さきほどの配列を用いた、枝の始点と終点の番号の組のデータ構造だと、枝がない頂点を表現できません。
そこらへんについて、「ちょっときみ、そのデータ構造だと、自己ループが表現できないので、今回の案件には使わない方がいいと思うよ」と
それとなく耳打ちできるとそれとなくモテます。


他に隣接行列で表現する方法もあります。


隣接行列 A=\left\(<br />
  \begin{array}{ccc}<br />
  1 & 1 & 1 & 0 & 0 & 0 \<br />
  0 & 1 & 0 & 0 & 0 & 0 \<br />
  0 & 0 & 0 & 1 & 0 & 1 \<br />
  0 & 0 & 0 & 0 & 1 & 0 \<br />
  0 & 1 & 0 & 0 & 0 & 1 \<br />
  1 & 0 & 0 & 0 & 0 & 0 \<br />
  \end{array}<br />
\right) … ④


これは、縦の座標を始点の頂点の添え字に対応させ、横の座標を終点の頂点の添え字に対応させて表現したもので、1なら接続している、0なら接続していないという表現です。この場合、計算量(空間的)はn^2です。頂点間に枝があるかを調べる計算量(時間的)はO(1)です。
みなさん、もうお気づきとは思いますが、隣接行列では、同じ始点、終点をもつ複数の枝を表すことができなくなります。


さて、4種類ほど表現方法を扱いましたが、それぞれの表現では、表現できるパターンの制約や、グラフを参照、更新する場合の計算量(時間的、空間的)などが違います。
シチュエーションや、相手の好みによって、表現方法を変えるとモテまくります。


みなさんもグラフでモテてみませんか?

続きを読む


[ZenCart] とても便利な商品ページの設定機能を紹介します

2010年02月23日(火)10:25|taniguchi|FLATzブログ, ZenCart, 技術情報このエントリをdel.icio.usに追加このエントリをはてなブックマークに追加

谷口です。


Zen Cartで商品を登録して、商品ページが表示されるようになったのは良いけど、「この情報は商品ページに出したくないな」とか、「この商品はカートに入れられないようにしたいなぁ」とか、商品ページの情報を調整したいものです。
当然、テンプレートをカスタマイズすればできるのですが、テンプレートのカスタマイズは専門の知識も必要となり、運営者自身で編集するには敷居が高いこともあるかと思います。


でも、実はZen Cartでは商品ページに表示する内容をある程度調整ができます。
テンプレートをカスタマイズすることなく、管理画面から調整できる項目であれば、専門知識を必要としないので、誰でも簡単にできます。


では、具体的にどんな設定ができるのか、簡単に紹介しようと思います。


まずは、とても分かりやすいメニューとして、商品情報の設定のメニューは[一般設定] → [商品情報の設定]で基本的な設定ができます。
ここでは以下のような設定ができます。


[前へ] [次へ] リンクの表示設定 前の商品、次の商品へのリンクに関しての表示、動作を設定できます。
セール割引表示設定 セール商品に対して割引の表示を設定できます。
無料商品の表示設定 無料商品の場合の表示を設定できます。
お問合せ商品の表示設定 お問合せ商品の場合の表示を設定できます。
レビューの承認の要否 商品レビューで承認をしたものだけ掲載させるようにするかどうかを設定できます。
「こんな商品も購入しています」 – 横列あたりの表示点数 「こんな商品も購入しています」リストの一列あたりの表示数を設定できます。





若干分かりにくいのですが、実はもう一つ商品ページに関する設定ができる画面があります。
それは・・・[商品の管理] → [商品タイプの管理]の[表示設定]です。
なんとこの画面で設定できる項目は、商品タイプ毎に変えることが可能です。
「商品タイプGeneralなら重量表示する」、「商品タイプDocumentなら重量表示しない」とかです。
こちらの画面で設定できる項目には、商品登録時の設定もありますので、商品ページの表示に関わる項目のみ簡単に紹介します。


型番表示 型番を表示するか否か
重量表示 重量を表示するか否か
オプション重量表示 オプションの重量を表示するか否か
メーカーの表示 メーカーを表示するか否か
カート内の数量表示 カート内の数量を表示するか否か
在庫数表示 在庫数を表示するか否か
レビュー数表示 レビュー数を表示するか否か
レビューボタン表示 レビューボタンを表示するか否か
購入可能になった日付の表示 購入可能になった日付を表示するか否か
登録日表示 商品登録日を表示するか否か
商品URL表示 商品URLを表示するか否か
ベース価格の表示 ベース価格を表示するか否か
Show Product Additional Images 関連画像を表示するか否か(関連画像はあるルールでFTPなどでアップロードする必要があります。)
「友達に知らせる」ボタン表示 友達に知らせるボタン表示するか否か
送料無料の画像ステータス – カタログ 送料無料の画像/テキストを表示するか否か
Show Metatags Title Default – Product Name ブラウザのタイトルに商品名を表示するか否か(メタタグの設定をしていない場合の設定)
Show Metatags Title Default – Product Model ブラウザのタイトルに型番を表示するか否か(メタタグの設定をしていない場合の設定)
Show Metatags Title Default – Product Price ブラウザのタイトルに商品価格を表示するか否か(メタタグの設定をしていない場合の設定)
etc…





ただ、これらの表示設定はテンプレートによっては、設定しても効果のないものもあります・・・。
そんなときは、テンプレート作成した人を恨みつつ、カスタマイズすることになってしまいます。
業者にテンプレート作成を依頼する場合は、業者に設定が効かなくなる項目があるかないかを確認をすると良いと思います。


さて、ここで紹介した商品ページの設定だけでなく、Zen Cartでは一覧ページの設定、画像の大きさ、カート画面の表示設定などなど、表示に関してだけでもいろんな設定ができます。
(おかげで管理画面が複雑になりすぎてるわけですが・・・。)
ページの内容を変えたいと思ったときは、カスタマイズをする前に一度管理画面でできないか確認してみると面白い発見があるかもしれませんね。

続きを読む


Page 4 of 46« First...«23456»...Last »

このページの先頭へ