見つけとは?
|
図1に示すHTML形式のテキスト・データ(以下,HTMLデータ)があります。このHTMLデータをブラウザに表示させたときに「表示される文字列」と「その文字列に対して有効なタグ名」を対応付けるアルゴリズムを考えてください。結果は配列に格納して,画面に表示させるものとします(図2)。 見わたせば,世の中はアルゴリズムだらけです。私のようなプログラマは,日常生活でも「締め切り順に仕事をソートしてごらん」「仕事のスタックがたまっているからてんてこまい」など,いま置かれている状態をアルゴリズムやデータ構造になぞらえて会話することがよくあります。前回紹介した再帰処理と言えば,落語の演目の一つ,「頭山」です。自分の頭に生えた桜の木を引っこ抜いて,その跡にできた池に自分自身が身を投げる,という不思議な話ですが,これこそ再帰処理をよく言い表していると思います。 このように世の中には,ハッシュだってスタックだってソートだって,みんな身近にあるものです。でも,解決したい問題と,よく知られているアルゴリズムやデータ構造を結びつけて考えることはなかなか難しいようです。そこで,今回は問題にあったアルゴリズムの探し方をご紹介しましょう。例としてHTML データを解析する処理にアルゴリズムを適用する方法を考えてみます。 まずは問題に挙げたHTMLデータ(図1)の構造をよく見てみましょう。このとき,「このデータから答えを得るためのデータの流れ」「今までプログラムを作ったときに使った処理の流れ」を頭のどこかに置きながら見てください。ほとんどの場合で,この作業からアルゴリズムのヒントが見つけられます。 HTMLデータでは,文(テキスト)を「タグ」と呼ばれるもので囲んでいます。タグにはいくつか種類があり,タグを変えることで「特定の文を大きくする/太くする」といった効果や意味を与えられます。 タグは「<」と「>」の間にタグ名を書くことで宣言します*1。このあとに文を書くことで,タグの効果が文字に加えられて表示されます。効果を終わらせるには「</タグ名>」と記述してタグを閉じます*2。例えば, と書くと,「アルゴリズム」という文が太字(bold)で表示されます。タグには効果を制御するためのパラメータを属性として設定できますが,ここではとりあえず考えないことにしましょう。 HTMLデータではタグで囲んでいる文の中にまたタグを置くことができます。すなわち,タグを入れ子構造で定義できます。例えば「<p><b>foo </b></p>」となっていたら,「foo」にpタグで段落を付けて,bタグで太字表示することになります。「<p><b>foo</b>bar </p>」なら,barに対してbタグは有効にならずpタグだけが有効になります。HTMLデータにインデントを付けると,タグと文が階層状態になっているのがよくわかります。 階層構造のデータを処理するときには,ある階層の処理を終えたら一つ外側の階層へと処理を戻さなければなりません。HTMLデータであれば,タグが閉じられたときのために,それまで登場したタグをどこかに保存しておかなくてはいけません。アルゴリズムを考えるときは,ここがポイントになります。 有名なアルゴリズムには,大体「よく使う場面」があります。ソートと言えばデータの並べ替えですが,ただそれだけではなく「別のアルゴリズムを使う前にデータを扱いやすくするために並べ替える」といった目的でもよく利用します。ハッシュなら,おおざっぱにデータを分類することで,検索処理を高速化できます。 そもそもアルゴリズムを考えるときは,「特定のアルゴリズムが得意としている部分がその問題の中にあるか」「よくある場面と同じように使えないか」と自問しながら問題を眺めてみるのが定石です。それでは,HTMLデータのような階層構造を持つデータを扱う場合には…?そうですね。スタックが利用できそうです。スタックは,多数のデータを管理するためのデータ構造で,データを次々に追加した後でデータを取り出すと,後に追加したものから順に取り出されるという特徴を持ちます。今回は,HTMLデータを読み込む処理を,スタックでどのように扱えばよいかを考えてみましょう。 最初に「HTMLデータを入力」〜「配列として出力」という処理の流れをイメージしてみます。配列に出力するのは「タグ名」と「文」なので,これをHTMLデータから読み取ることが処理の中心になりそうです。 HTMLデータは基本的にテキスト・データですから,ポインタか配列で先頭から1文字ずつ読み込むというのが一般的な処理方法でしょう。例えば,データを指すポインタを一つずつずらしながら1文字ずつ取り出して調べていきます。タグを示す文字「<」「>」にぶつかったらタグ名として取り出します。 ・1文字ずつ取り出して「<」が来たら,以降の文字をバッファに入れておき,「>」が来たらそこで読み取りを止める。バッファにはタグ名が入るので,それを利用する ・「<」の位置+1をポインタ変数に保存し,タグ文字の長さを計るカウンタを開始する。1文字ずつ読み込んで「>」が出たら,そこまでの「文字列長」を得る。タグ名は「ポインタ」+「文字列長」で得られる このように1文字ずつ照合していく以外に,C言語の文字列操作関数を利用して文字列単位で取り出す方法もあります。仕組みとしてはこんな感じです。 strchr関数に文字列と文字を渡すと,その文字列の中から指定した文字が最初に現れた位置(ポインタ)を返してくれます。そこでまず'<'を渡してその文字がある位置を得ます。次に,この位置を+1したところから'>'が現れる位置を探します。この間がタグ名となるので,あとは先に述べた方法と同じように処理します。同じような目的にstrtok関数も使えます。 タグを判別できたら,その間にあるデータが文になるはずです。文とタグをデータとして用意して,それを配列に出力すれば,今回の問題は解けたことになります。 では,文を出力するタイミングは,いつがいいのでしょうか。ある文に有効なタグが確定する場面として,まず「開始タグ+文+終了タグ」というパターンが見つかったときが挙げられます。今回は,HTMLデータのタグが完全に入れ子構造になっていて,各タグ名は入れ替わったり,途中のものが消えたりはしないとします*3。とすると,「開始タグ+文+開始タグ」「終了タグ+文+開始タグ」「終了タグ+文+終了タグ」といったパターンが見つかったときにも,文に対して有効なタグ名が決定することになります。すなわち,開始タグか終了タグかに関係なく,タグに出会ったときに,その直前までの文と,その文に有効なタグ名を配列へ書き出すようにすればよいわけです。文を配列へ書き出すときは,有効なタグ名を登場した順番に沿ってまとめる作業が必要です。 (4)現れたタグが終了タグの場合は,スタックの一番上にあるタグが対応する開始タグになるので,それを取り除く もっとも,このままでは少し面倒な点がいくつかあります。例えば,スタックの要素にタグなのか文なのかを区別するための目印を入れておかなくてはなりません。できればもう少しスマートに扱いたいものですね。 そこで,注目する場所を少し変えてみます。先ほどの方法では,「<」「>」「/」を目印にしてタグを取り出していました。それならいっそのこと,これらの文字も一つの要素としてスタックへ積んでみたらどうでしょうか? 例えば,「<p>アルゴリズム</p>」をスタックに積むなら図3のようにします。1文字ずつ読み出して,「<」「>」「/」という区切り文字,タグ名,文をスタックに積んでいきます*4。こうすると,スタックの特定の位置を調べるだけで,いろいろな事柄を判断できます。 例えば「>」まで読み取ったとき,それが開始タグの一部ならスタックの中身は図4(1)のようになっているはずです。そうでなければ開始タグではありません。また,終了タグなら図4 (2)のようになっています。開始タグの直前に文があるかどうかを調べるときは,図4(3)のように「>」の三つ下に「>」が入っていなければ,文が存在することを確認できます。こうした確認作業は区切り文字が出るときに実行すればいいでしょう。 図4●タグの種類とスタックの様子。スタックの特定の位置の要素を調べることでタグの種類などを判別できる 富士ゼロックス DocuWorks導入事例シリーズ 〜ドキュメントにまつわる経営課題を解決〜 キヤノン/キヤノンマーケティングジャパン キヤノンの「船積書類管理システム」〜船積書類を電子化し輸出業務を効率化 情報システム 業務アプリケーション 上流工程 SaaS&Enterprise 2.0 グローバル・ソーシング ITpro協力誌 日経コンピュータ 日経コミュニケーション 日経SYSTEMS 日経情報ストラテジー 日経NETWORK 日経ソリューションビジネス 日経ソフトウエア 日経Linux 日経ニューメディア 日経BPガバメントテクノロジー 日経パソコン 日経BPソフトプレス IT経営 システム開発 プロマネ&アーキテクト ネットワーク最新テクノロジー 業績&業界動向 セキュリティ Windows オープンソース 製品&サービス・ディレクトリ 業務アプリケーション 設計開発 OS/DB/ミドルウエア サーバー/ストレージ 運用管理 ネットワーク セキュリティ SIサービス 通信サービス クライアント/OA機器 |
[ 59] 第6回 上手なアルゴリズムの見つけ方:ITpro
[引用サイト] http://itpro.nikkeibp.co.jp/article/COLUMN/20070313/264703/
|
嬉しいお知らせ:ニュージーランドワイン見つけ隊を、日本&世界中のありとあらゆるワイン情報満載という(社)日本ソムリエ協会オープンサイト「ワイン村」さん内、「突撃ワインサイト」のコーナー(番組)で取り上げていただきました!サイトの更新そっちのけで、張り切ってインタビューに応じている隊長の発言を、是非ぜひご覧になってみて下さいませ。そうそう、「ワイン村」さんの編集スタッフ紹介ページで、偶然にも、いつもニュージーランドワイン見つけ隊を応援して下さっている〇〇さんを発見!ニュージーランドのヴィンヤードで働いたこともあって、現在は大阪でワインショップを経営している行動実力派隊員さんの「葡萄畑の些細な真実」もお見逃しなく。(←強制的に隊員さんと断言してしまったけれど、良かったかしら...?) ニュージーランドワイン見つけ隊(9月12日) 新しくなった交流の場「NZワインのわ(WA)」はこちら※以前の掲示板にメンバー登録して下さった皆様には、近日中に新規投稿方法などについてご連絡させていただきます。(お待たせして申し訳ございません。) 先日のカンタベリー ワイン&フード フェスティバルの余韻が消えないまま(そして、レポートをアップしないまま…)、今週末には、Waipara Wine & Food Celebrationへ取材に行こうとしています。Waiparaのフェスティバルは初。すっごく楽しみにしています。我が家から徒歩圏内の場所発着のバスツアーに便乗することにしたので、今回も、思いっきりテイスティング、いや取材をすることが出来そうです。なんだか、ニュージーランドワインの大ブームが日本で起こる予感がしています。いや、起こしてみせます。今年は、ニュージーラドワイン見つけ隊の夢計画(NZワインのWA参照)を一歩も二歩も前進させる予定ですので、お楽しみに。「日本国内で購入出来るワインリスト」も更新済みです。(3月16日) 行ってきました〜。Canterbury Wine & Food Festival。全ワイナリー制覇を目指していたのに、一軒だけ、お話をすることが出来ませんでした。飲み過ぎ&話し過ぎで時間が無くなり、実は最後のあたり、片づけ中のところに無理矢理押しかけてお話を聞いたりしました。一軒のみ、既にきれいに片付けてしまわれた後で、陰も形も無く、全制覇の目標を達成することが出来ませんでした。残念!途中、隊員勧誘?(ワーキングホリデーのお二人サマ)や見知らぬ地元の酔っ払い?三人にワイン講義を受けたり、楽しい時間を過ごしてきました。近日中にレポートを公開します。日本のワインショップの方からメールもいただきました。今年はこのサイトも盛り上がりそうな予感が…。(祈)「日本国内で購入出来るワインリスト」は更新済みです。(3月1日) 明後日の27日にクライストチャーチでCanterbury Wine & Food Festivalが開催されます。勿論、取材に行く予定です。日本からニュージーランドワイン見つけ隊に会いに来て下さった方、そこから生まれた新企画その他、当サイト上でご紹介したいことが山積み状態。ひたすら頑張ります。お問い合わせをいただいたタイミングによって、お返事を差し上げられなかった皆様、本当に、本当に申し訳ございません。全て、ニュージーランドワイン見つけ隊(私)の不徳の致すところ。ニュージーランドワインに罪は無いので、ニュージーランドワインのことは嫌いにならないで下さいね。「日本国内で購入出来るワインリスト」は23日に更新しています。(2月25日) 滋賀県にある「リゾートカフェ哲学の道」では、ニュージーランドのソーヴィニヨン・ブランに恋をしてしまったマスターが、積極的にニュージーランドワインをご紹介下さっているようです。滋賀県近郊にお住まいの方、是非、足を運んでみて下さいませ。詳細は、NZワインを探せ!のページでご確認下さい。(兵庫県近郊の方には、宝塚のニュージーランド・カフェレストラン「キウィハウス」がオススメです。)それから、「日本国内で購入出来るワインリスト」を更新しました。(2月8日) ようやく「日本国内で購入出来るワインリスト」を更新することが出来ました。毎週更新を楽しみにして下さっていた皆様、お待たせしてしまってごめんなさい。それから、上記「NZワインのわ(WA)」を盛り上げようとして下さっている皆様、本当にありがとうございます。オークランド周辺の貴重なワイナリー情報なども寄せられています。「WA」とはいったい何なのかご覧になっていらっしゃらない方は、是非、一度覗いてみて下さいませ。(1月25日) 上記、新しく登場させる予定の「NZワインのWA」のページを試験的に公開しています。それから、日本国内で購入出来るワインリストを更新しました。(12月14日) サイト内の改良策をいろいろと考えてきましたが、どれも今ひとつで、トライアルの域を出ることが出来ず、今度こそという願いを込めて、サイト内ブログにすべての情報をまとめてみてはどうかと考えています。現在、テスト中ですが、ログイン無しで簡単にコメントを残せるので、より使い易くなるのではないかと思っています。その中で、今後の計画の相談、英語サイトとの一部統合を行っていきたいと思っています。日本国内で購入出来るワインリストも更新しています。(12月2日) 日本国内で購入出来るワインリストを更新しました。通常の毎週火曜日更新にペースを戻そうと調整中です。(11月19日) 数日遅れになりましたが、日本国内で購入出来るワインリストを更新しました。ワインの種類も取扱い店も確実に増えています。サイトの更新になかなか手が回らなくて本当に申し訳ありません。みなさんからのご質問にも、時間に余裕が出来次第、お返事させていただこうと思っています。今しばらくお待ち下さい。(11月4日) 夏の始まりに、ちょっと出遅れてしまった気もしますが、イベント情報のページを新たに追加しました。日本国内で購入出来るワインリストも更新済みです。(10月19日) 掲示板へ書き込みを下さった皆さんへ、大変遅くなりましたが、お返事コメントを書き込みました。日本国内で購入出来るワインリストも更新しました。(10月13日) 掲示板のページのお知らせにも書きましたが、あまりにも非現実的な「大きな夢」の為、今まで口に出しては言わなかった「ニュージーランドワインを応援するNPO設立」の計画に向けて動き出すことにしました。目指すは三年後。利益を追求するのではなく、個人経営の小さなワイナリーも、大企業ワイナリーと同じ条件で応援したいという、「ニュージーランドワイン見つけ隊」がずっと持ち続けてきた願いを叶えつつ、ニュージーランドワインが大好きという日本の皆さんに、活動の場を提供出来たらいいなと思います。私が、これまでずっと試行錯誤しながら「ニュージーランドワイン見つけ隊」を通して実現しようとしていたことは、「これだっ!」という気がしています。(10月5日) またまた日本国内で買えるニュージーランドワインのリストのみ更新済みです。ニュージーランドでは、今週末からデイライトセービング(夏時間)が始まります!(9月28日) 日本国内で買えるニュージーランドワインのリストのみ更新済みです。日本へワインを輸出することに興味を持つワイナリーが増えてきているようです。たま〜〜〜にですが、ニュージーランドワイン見つけ隊へも、ニュージーランドのワイナリーから、「日本人のワインの好みは?」「日本のお店で取り扱ってもらう為には、どうしたらいい?」といった問い合わせがくるようになりました。(9月21日) 10月からニュージーランドでは本格的なサマーシーズンが始まります。今年こそはワイナリー巡りの現地情報をご紹介しようと、手持ち資料を整理しています。掲示板への参加も、10月から本格的に行う予定です。尚、日本国内で買えるニュージーランドワインのリストは、週1回のペースで更新を続けています。(9月15日) 日本国内で買えるニュージーランドワインのリストを更新しました。(毎週火曜日に更新しています。)(7月27日) ワインについて学べるコース(ニュージーランド・日本)の情報をワインの資料室内に加えました。(7月4日) ニュージーランドワイン見つけ隊のメンバー募集を始めました。詳しくはワインのニュース掲示板のページから。(7月2日) Yahoo! JAPANの「ワイン」のカテゴリー内に、このサイトが登録されました!ワイナリー情報390件、ワイン情報1,781件をひたすら入力した努力を認めていただけたような気がして、なんだか、今までの苦労が報われたようで、涙が出そうでした。これで、日本でのニュージーランドワインの知名度が、また一段とアップすること間違いなし!と喜んでいます。(6月18日) ワイナリー一覧ページ内から、各ワイナリーの基本情報を参照出来るようにしました。ただ、詳しい日本語での情報の入力は、まだ、一部のワイナリーにしか行っていません。(6月6日) 手始めに、ニュージーランドワインを探せのページをリニューアルしました。見つけ隊メンバーのページなど、徐々にアップしていく予定です。2004年度の、Buyer's Guide to New Zealand Winesで、ワインの最新情報も確認中です。(6月5日) 数日前に、ニュージーランドへ戻ってきました。実は、1ヶ月ほど、日本へ出張していました。日本でお店に並ぶ日本のワインも見てきましたが、酸化防止剤無添加…といった表示が印象に残りました。ニュージーランドのワイン関係者の皆さんに、日本のワインについて報告しようと思っています。また、宝塚にある、ニュージーランドの雰囲気を大切にした素敵なレストランも取材してきました。関西訪問中に空き時間が出来たので、突然突撃取材をさせていただいたにもかかわらず、笑顔で迎えて下さいました。かなりお薦めのお店です。 パワー不足になりつつあったコンピューターの為に、新しいパーツを日本で仕入れてきたので、システムをパワーアップすると共に、溜まりに溜まった情報を出来るだけ早くサイト上へアップしようと思っています。出張期間中待ってもらっていたプログラミングの仕事を終えたら、直ぐに取り掛かります!(5月5日) 日本国内で購入出来るニュージーランドワインのリスト(300種以上)※オンラインショッピングで購入出来るニュージーランドワインだけを集めてみました。(2月14日更新) ニュージーランドワインのリスト(評価やテイストガイド付き約1800種)※ニュージーランドワインのリストがついに完成! 登録ワイン(約1800種)を品種別・地域別にご覧いただけます。 これは便利と評判の、ニュージーランドのワイナリーやワイン関連ビジネス一覧(約400軒)※各ワイナリーへのリンク集として始めたこのページですが、各ワイナリーの基本情報を日本語でご覧いただけるようにと、少〜しずつデータを追加中。 ニュージーランドのワイン栽培地域解説※ワイン葡萄の出来が良かった収穫年情報を追加(10月21日) 日本国内でニュージーランドワインに出会えるお店やレストランの都道府県別リスト(現在の登録情報:約80件) ※現在、47都道府県中、24府県のみ情報の登録があります。みなさんからの、「ニュージーランドワイン見〜つけた!」報告をお待ちしております。日本のお店情報を下さった皆様、ありがとうございます!(感激) ニュージーランドワイン見つけ隊Q&A※個人輸入の手続き情報から、ワイン見つけ隊って誰が運営してるの…などといったワイン見つけ隊の秘密?まで、皆さんの疑問にお答えします!(一部未完成) ※「隊員になりたいっ!」という人現る!といった記録に残しておきたい ニュージーランドワイン見つけ隊で起きた日々の出来事(嬉しいニュース)の数々を掲載 ニュージーランドワイン見つけ隊への応援メッセージ、「更新しろ〜」の催促メッセージはこちらまで。 ホーム | ワイナリー一覧 | ワインの品種 | ワインの栽培地域 | ワインを探せ! | ワインリストワインの食器棚 | ワインの本棚 | ワインの資料室 | NZワインのわ(Wine Appreciation) | ワインな毎日 | お知らせ 日本国内で購入出来るニュージーランドワインのリスト | 質問と答え | サイトマップ | 連絡先サイト支援者リスト | サイト支援広告(広告スペースの購入千円〜)詳細 なぁでも屋運営サイト: ニュージーランドワイン見つけ隊 ・ DIYトラベルガイド ・ 下手な英語もこうすりゃ使える ・ みるだけただよのアイデアギフト ・ 新熱中らんど ・ 負けない羊のアフィリエイト知恵袋 ・ 情報1616(いろいろ)見つけ隊 ・ 近所のお店屋さん その他多数(英語によるサイトもあり)を一人で運営しております。。。 |
[ 60] ニュージーランド ワイン見つけ隊!
[引用サイト] http://wine.nademoya.biz/
