<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>algorithm and data-structure</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/category/1093.aspx</link><description>algorithm and data-structure</description><managingEditor>επιστημη</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>επιστημη</dc:creator><title>新人クンにC++を教えてやってくれ。二日で。</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/08/28/288521.aspx</link><pubDate>Tue, 28 Aug 2012 17:06:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/08/28/288521.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/288521.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/08/28/288521.aspx#Feedback</comments><slash:comments>203</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/288521.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/288521.aspx</trackback:ping><description>&lt;p&gt;いや&lt;strong&gt;無理&lt;/strong&gt;。それは無理。&lt;br&gt;二日で教えられるもんなら四半世紀やってきた僕の&lt;strong&gt;立つ瀬&lt;/strong&gt;がねっす。&lt;/p&gt;&lt;p&gt;「そこをなんとか、&lt;strong&gt;サワリ&lt;/strong&gt;のとこだけでも」ってことやったんで&lt;br&gt;ちょーキホンなクラスの書き方とか教えてやることに。&lt;/p&gt;&lt;p&gt;新人クン、Cはそこそこ書けるみたいなんで&lt;br&gt;C++文法/構文をざっくり流して演習問題:&lt;/p&gt;&lt;p&gt;「intを要素とする可変長配列Vectorおよび&lt;br&gt;　末尾に追加するadd(int val)を実装してみそ？」&lt;/p&gt;&lt;p&gt;彼の書いたコード:&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;class Vector {&lt;br&gt;&amp;nbsp; int* data; &lt;font color="#008000"&gt;// 配列本体&lt;br&gt;&lt;/font&gt;&amp;nbsp; int index; &lt;font color="#008000"&gt;// 次にaddする位置(=要素数)&lt;/font&gt;&lt;br&gt;&amp;nbsp; int capacity; &lt;font color="#008000"&gt;// dataの容量&lt;/font&gt;&lt;br&gt;public:&lt;br&gt;&amp;nbsp; Vector(int cap);&lt;br&gt;&amp;nbsp;~Vector();&lt;br&gt;&amp;nbsp; bool add(int val);&lt;br&gt;};&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;Vector::Vector(int cap) {&lt;br&gt;&amp;nbsp; capacity = cap;&lt;br&gt;&amp;nbsp; data = new int[capacity];&lt;br&gt;&amp;nbsp; index = 0;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;Vector::~Vector() {&lt;br&gt;&amp;nbsp; delete[] data;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;bool Vector::add(int val) {&lt;br&gt;&amp;nbsp; if ( index &amp;gt;= capacity ) return false; &lt;font color="#008000"&gt;// 容量オーバー&lt;/font&gt;&lt;br&gt;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp; data[index] = val;&lt;br&gt;&amp;nbsp; return true;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;...おぅ、けっこー書けてんじゃん...おんや?&lt;br&gt;「おーい、バグってんよ？」&lt;br&gt;「え！？ どこっスか？」&lt;br&gt;「ほらココ。Vector::addで&lt;strong&gt;data[0]が空席&lt;/strong&gt;になってる」&lt;br&gt;「ホントだー。すぐ直しますっ」&lt;/p&gt;&lt;p&gt;３分後&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;Vector::Vector(int cap) {&lt;br&gt;&amp;nbsp; capacity = cap;&lt;br&gt;&amp;nbsp; data = new int[capacity];&lt;br&gt;&amp;nbsp; index = &lt;font color="#ff0000"&gt;-1&lt;/font&gt;;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="5"&gt;ばっかやろーー!!!&lt;br&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/288521.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>渡る者の途絶えた橋 (C#/LINQ版)</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/01/28/196717.aspx</link><pubDate>Fri, 28 Jan 2011 22:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/01/28/196717.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/196717.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/01/28/196717.aspx#Feedback</comments><slash:comments>223</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/196717.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/196717.aspx</trackback:ping><description>&lt;P&gt;えとー、こんなもんかの。&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;#define SET_3&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;namespace DAG {&lt;BR&gt;&amp;nbsp; struct bridge {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public char fr;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public char to;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bridge(char f, char t) { fr = f; to = t; }&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; class Program&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;bridge&amp;gt; path = new List&amp;lt;bridge&amp;gt;&lt;BR&gt;#if SET_1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('A','B'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('B','C'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('A','C'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('A','D'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('C','D'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;#elif SET_2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('A','B'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('A','C'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('B','C'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('B','D'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('D','A'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('D','C'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;#elif SET_3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('A','B'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('B','C'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('C','D'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('D','E'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('E','F'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('F','G'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('G','H'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new bridge('H','F'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;#endif&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( true ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 表示&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path.ForEach(item =&amp;gt; Console.WriteLine("{0}-&amp;gt;{1}", item.fr, item.to));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 入口/出口セットを作る&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var froms = (from item in path select item.fr).Distinct();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var tos&amp;nbsp;&amp;nbsp; = (from item in path select item.to).Distinct();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 入口/出口セットの一方にあって他方にないものをremoveに&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // symmetrc-diference に相当するもんがなさげな&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#008000&gt;んで"X-Y と Y-X の和集合"で代用&lt;BR&gt;&lt;/FONT&gt;　　　　 var remove = Enumerable.Union(froms.Except(tos), tos.Except(froms));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( remove.Count() == 0 ) break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// removeに含まれない橋を抽出する&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path = (from item in path &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where !(remove.Contains(item.fr) || remove.Contains(item.to)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select item).ToList();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(path.Count() == 0 ? "DAG!!" : "cyclic!!");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/196717.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>渡る者の途絶えた橋</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/01/20/196566.aspx</link><pubDate>Thu, 20 Jan 2011 21:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/01/20/196566.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/196566.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/01/20/196566.aspx#Feedback</comments><slash:comments>520</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/196566.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/196566.aspx</trackback:ping><description>&lt;P&gt;数学屋さんは「いくつかの島に橋が架かった様子」をグラフ(Graph)といいます。&lt;/P&gt;
&lt;P&gt;グラフのバリエーションとして、島に架かる橋が一方通行であるものを&lt;STRONG&gt;有向グラフ&lt;/STRONG&gt;(Directed Graph)と称しております。 &lt;/P&gt;
&lt;P&gt;さらに有向グラフは大きく二つに分類されます。&lt;BR&gt;ある島から一方通行の橋を渡っていけば元の島に戻れる経路のあるものを&lt;STRONG&gt;「閉路(cycle)のある有向グラフ」&lt;/STRONG&gt;、&lt;BR&gt;それと閉路のひとつもない&lt;STRONG&gt;「無閉路有向グラフ:DAG(Directed Acyclic Graph)」&lt;/STRONG&gt;です。&lt;/P&gt;
&lt;P&gt;DAGはエンジニアリングの分野と深い関わりがあります。&lt;BR&gt;たとえばC/C++での#include関係はDAGになってますし、&lt;BR&gt;.NETだとアセンブリの参照関係もDAGです。&lt;BR&gt;クラスの継承もDAGですな。&lt;BR&gt;あるいはお料理のレシピやmakefileなどの「手順書」もDAGです。&lt;BR&gt;手順書がDAGでないと作業の&lt;STRONG&gt;堂々巡り&lt;/STRONG&gt;が存在するわけで、いつまでたっても完了できひんです。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;さて、とある有向グラフが与えられたとき、それがDAGであるか否かを判定するアルゴリズムを考えます。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;[1] まず、有向グラフのデータとして橋の集合を用意します。橋には方向があるので"入口の島"→"出口の島"でひとつの橋を表現します。サンプルはコレ:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://episteme.wankuma.com/image/dag1.jpg"&gt;&lt;BR&gt;このグラフに引かれた矢印(つまり橋)を列挙すると:&lt;BR&gt;&lt;BR&gt;A→B&lt;BR&gt;A→C&lt;BR&gt;B→C&lt;BR&gt;C→D&lt;BR&gt;&lt;BR&gt;の４本の橋が架かっています。&lt;/P&gt;
&lt;P&gt;[2] 橋の入口を持つ島の集合を Iin, 出口を持つ島の集合をIoutとすると、&lt;BR&gt;Iin = { A, B, C }, Iout = { B, C, D }&lt;BR&gt;ですわね。ここで &lt;BR&gt;Iin に含まれるが Iout に含まれない島の集合は { A }、&lt;BR&gt;Iout に含まれるが Iin に含まれない島の集合は { D } です。&lt;BR&gt;それぞれ 入ることのできない島/出ることのできない島の集合です。&lt;BR&gt;こんな島は閉路の通り道には&lt;STRONG&gt;なり得ません&lt;/STRONG&gt;。閉路の通り道になるなら必ず入る橋と出る橋がそれぞれ一つ以上架かっているでしょうから。&lt;BR&gt;そんなわけで、閉路の通り道となり得ない島(入れない島と出られない島)に架かる橋を取り除きます。&lt;BR&gt;&lt;BR&gt;B→C&lt;BR&gt;&lt;BR&gt;が残りました。&lt;/P&gt;
&lt;P&gt;[3] 上の手順を繰り返します。&lt;BR&gt;Iin = { B }, Iout ={ C }&lt;BR&gt;ですから、このいずれかに架かる橋を取り除くと橋がなくなってしまいます。&lt;BR&gt;閉路を構成する可能性のある橋がなくなった、てことは DAG です。&lt;BR&gt;&lt;BR&gt;同じことを&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://episteme.wankuma.com/image/dag2.jpg"&gt;&lt;BR&gt;こいつでやってみましょ。&lt;BR&gt;&lt;BR&gt;A→B&lt;BR&gt;B→C&lt;BR&gt;C→A&lt;BR&gt;C→D&lt;BR&gt;&lt;BR&gt;ですから、&lt;BR&gt;Iin = { A, B ,C }, Iout = { A, B , C, D }&lt;BR&gt;IinとIoutのどちらかにしか含まれない島の集合は { D }、&lt;BR&gt;{ D } に架かる橋を取り除くと:&lt;/P&gt;
&lt;P&gt;A→B&lt;BR&gt;B→C&lt;BR&gt;C→A&lt;/P&gt;
&lt;P&gt;もう一度。&lt;BR&gt;Iin = { A, B, C }, Iout = { A, B, C }&lt;BR&gt;どちらかにしか含まれない島はありません。Φ(空集合)です。&lt;BR&gt;なのでこれ以上取り除ける橋はありません。&lt;BR&gt;なのにまだ橋が残っています。なので DAG ではありません。&lt;/P&gt;
&lt;P&gt;&amp;#8230;んじゃまそゆことで、さくさくーっと実装してやんよ。&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face="ＭＳ ゴシック"&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#include &amp;lt;iostream&amp;gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#include &amp;lt;algorithm&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#include &amp;lt;iterator&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#include &amp;lt;utility&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#include &amp;lt;set&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#include &amp;lt;vector&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;using namespace std;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;int main() {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;typedef pair&amp;lt;char,char&amp;gt; dep;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;vector&amp;lt;dep&amp;gt; deps;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#if 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('A','B'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('B','C'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('A','C'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('A','D'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('C','D'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#elif 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('A','B'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('A','C'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('B','C'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('B','D'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('D','A'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('D','C'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#elif 1&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('A','B'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('B','C'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('C','D'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('D','E'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('E','F'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('F','G'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('G','H'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;deps.push_back(dep('H','F'));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;#endif&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;while ( true ) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;// &lt;/SPAN&gt;表示&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;for_each(deps.begin(), deps.end(), &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;[&amp;amp;](const dep&amp;amp; x) { &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;cout &amp;lt;&amp;lt; x.first &amp;lt;&amp;lt; "-&amp;gt;" &amp;lt;&amp;lt; x.second &amp;lt;&amp;lt; endl; &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;});&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;cout &amp;lt;&amp;lt; endl;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;// &lt;/SPAN&gt;入口&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;出口セットを作る&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;set&amp;lt;char&amp;gt; parent;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;set&amp;lt;char&amp;gt; child;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;for_each(deps.begin(), deps.end(), &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;[&amp;amp;](const dep&amp;amp; x) { &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;parent.insert(x.first);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;child.insert(x.second);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;});&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;// &lt;/SPAN&gt;入口&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;出口セットの一方にあって他方にないものを&lt;SPAN lang=EN-US&gt;dif&lt;/SPAN&gt;に&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;vector&amp;lt;char&amp;gt; dif;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;set_symmetric_difference(parent.begin(), parent.end(), &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;child.begin(),&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;child.end(), &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;back_inserter(dif));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if ( dif.empty() ) break;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;// &lt;/SPAN&gt;入口&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;出口のいずれかが&lt;SPAN lang=EN-US&gt;dif&lt;/SPAN&gt;にあればそれを削除&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;vector&amp;lt;dep&amp;gt;::iterator last = deps.end();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;for_each(dif.begin(), dif.end(), &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;[&amp;amp;](char ch) { &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;last = remove_if(deps.begin(), last, &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;[=](const dep&amp;amp; x) { &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;return x.first == ch || x.second == ch;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;});&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;});&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;deps.erase(last, deps.end());&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;if ( deps.empty() ) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;cout &amp;lt;&amp;lt; "DAG!!" &amp;lt;&amp;lt; endl;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;} else {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;cout &amp;lt;&amp;lt; "cyclic!!" &amp;lt;&amp;lt; endl;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;あー、だれぞC#/VBにportしてはくれんかのぅ...&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/196566.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>昆布じゃないのよ(そのに)</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/12/29/196115.aspx</link><pubDate>Wed, 29 Dec 2010 01:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/12/29/196115.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/196115.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/12/29/196115.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/196115.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/196115.aspx</trackback:ping><description>&lt;P&gt;先日の &lt;A href="http://blogs.wankuma.com/episteme/archive/2010/12/07/195604.aspx"&gt;combsort&lt;/A&gt; 、比較/交換する要素間の距離(gap)をぢわぢわ縮めていく&lt;BR&gt; bubblesort&amp;nbsp;の改良版なわけですが。&lt;/P&gt;
&lt;P&gt;どのくらいずつ縮めていくか、 つまり gap = gap / ratio;&amp;nbsp;における ratio は&lt;BR&gt;実験的に 1.3 だという。ホントかしら?&amp;nbsp;ってんでやってみた。&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;template&amp;lt;typename Iterator&amp;gt;&lt;BR&gt;void combsort(Iterator first, Iterator last, double gap_ratio) {&lt;BR&gt;&amp;nbsp; auto gap = std::distance(first,last); // 要素間の距離:最初は要素数から&lt;BR&gt;&amp;nbsp; Iterator iter1, iter2;&lt;BR&gt;&amp;nbsp; bool swapped;&lt;BR&gt;&amp;nbsp; do {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gap = gap / gap_ratio; &lt;FONT color=#008000&gt;// ちょびっと狭める&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( gap == 0 ) gap = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterator iter1 = first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterator iter2 = first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::advance(iter2,gap); &lt;FONT color=#008000&gt;// iter1,iter2間をgapだけ離す&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( iter2 != last ) { &lt;FONT color=#008000&gt;// これ以降はbubblesortと同じね&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( *iter2 &amp;lt; *iter1 ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::iter_swap(iter1,iter2);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++iter1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++iter2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; } while (swapped || gap != 1);&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;void random_test() {&lt;BR&gt;&amp;nbsp; const int N = 50000;&lt;BR&gt;&amp;nbsp; array&amp;lt;int,N&amp;gt; source;&lt;BR&gt;&amp;nbsp; array&amp;lt;int,N&amp;gt; target;&lt;BR&gt;&amp;nbsp; iota(source.begin(), source.end(), 0); &lt;FONT color=#006400&gt;// [0..N) の配列を用意&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; map&amp;lt;int,double&amp;gt; hist;&lt;BR&gt;&amp;nbsp; const int trial = 10;&lt;BR&gt;&amp;nbsp; for ( int t = 0; t &amp;lt; trial; ++t ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; random_shuffle(source.begin(), source.end()); &lt;FONT color=#008000&gt;// ぐちょぐちょにかき混ぜて&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double time;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( int i = 110; i &amp;lt; 140; ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double ratio = i / 100.0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy(source.begin(), source.end(), target.begin());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; orz::ScopedWatch watch(time);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; combsort(target.begin(), target.end(), ratio); &lt;FONT color=#006400&gt;// 昆布ソート&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( is_sorted(target.begin(),target.end()) ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hist[i] += time; &lt;FONT color=#006400&gt;// 所要時間を積算&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "oops. disordered!" &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; &lt;FONT color=#006400&gt;// 平均値を出力&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; for ( int i = 120; i &amp;lt; 140; ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "ratio= " &amp;lt;&amp;lt; i/100.0 &amp;lt;&amp;lt; " time=" &amp;lt;&amp;lt; hist[i]/trial &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;結果:&lt;BR&gt;&lt;FONT face="Courier New"&gt;ratio= 1.2&amp;nbsp; time=6.64967&lt;BR&gt;ratio= 1.21 time=6.56539&lt;BR&gt;ratio= 1.22 time=6.37233&lt;BR&gt;ratio= 1.23 time=6.56348&lt;BR&gt;ratio= 1.24 time=6.18083&lt;BR&gt;ratio= 1.25 time=6.18782&lt;BR&gt;ratio= 1.26 time=6.25421&lt;BR&gt;ratio= 1.27 time=6.07581&lt;BR&gt;ratio= 1.28 time=6.26599&lt;BR&gt;&lt;STRONG&gt;ratio= 1.29 time=6.02135&lt;BR&gt;&lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;ratio= 1.3&amp;nbsp; time=6.55121&lt;BR&gt;&lt;/FONT&gt;ratio= 1.31 time=6.80597&lt;BR&gt;ratio= 1.32 time=6.47621&lt;BR&gt;&lt;STRONG&gt;ratio= 1.33 time=6.12299&lt;BR&gt;&lt;/STRONG&gt;ratio= 1.34 time=6.59149&lt;BR&gt;ratio= 1.35 time=13.3166&lt;BR&gt;ratio= 1.36 time=20.2281&lt;BR&gt;ratio= 1.37 time=34.2606&lt;BR&gt;ratio= 1.38 time=54.2303&lt;BR&gt;ratio= 1.39 time=64.2049&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;ふむ、この場合に限って言えば 1.29 のときが最速。&lt;BR&gt;1.33のあたりにヘコみがあるのも面白いですな。&lt;BR&gt;とはいえ 1.3近傍が&lt;STRONG&gt;実験的によさげ&lt;/STRONG&gt;な値なのは確かなようです。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/196115.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>昆布じゃないのよ</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/12/07/195604.aspx</link><pubDate>Tue, 07 Dec 2010 22:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/12/07/195604.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/195604.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/12/07/195604.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/195604.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/195604.aspx</trackback:ping><description>&lt;P&gt;なんとなーくアルゴリズムのお話など。&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;combsort&lt;/STRONG&gt;てゆーソート・アルゴリズムがあります。&lt;BR&gt;遅いので有名なbubblesortの改良版なんですけどね。&lt;BR&gt;&lt;BR&gt;bubblesortがなして遅いかっちゅーと、&lt;STRONG&gt;隣接する二つの&lt;/STRONG&gt;比較/交換を繰り返すので一回の交換で要素が&lt;STRONG&gt;ちょびっと&lt;/STRONG&gt;しか移動せんからなんですわ。&lt;BR&gt;二要素間の距離を大きくとって交換し、次第に距離を狭めていくのがcombsortです。&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;#include &amp;lt;algorithm&amp;gt;&lt;BR&gt;#include &amp;lt;iterator&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;template&amp;lt;typename Iterator, typename Predicate&amp;gt;&lt;BR&gt;void combsort(Iterator first, Iterator last, Predicate pred) {&lt;BR&gt;&amp;nbsp; auto gap = std::distance(first,last);　&lt;FONT color="#008000"&gt;// 要素間の距離:最初は要素数から&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp; Iterator iter1, iter2;&lt;BR&gt;&amp;nbsp; bool swapped;&lt;BR&gt;&amp;nbsp; do {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gap = gap * 10 / 13; &lt;FONT color="#008000"&gt;// ちょびっと狭める&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( gap == 0 ) gap = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterator iter1 = first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterator iter2 = first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::advance(iter2,gap); &lt;FONT color="#008000"&gt;// iter1,iter2間をgapだけ離す&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( iter2 != last ) { &lt;FONT color="#008000"&gt;// これ以降はbubblesortと同じね&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( pred(*iter2,*iter1) ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::iter_swap(iter1,iter2);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++iter1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++iter2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; } while (swapped || gap != 1);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;要素間の距離:gapが繰り返しのたんびに 1/1.3 になってます。&lt;BR&gt;この1/1.3て値、あんまり大きいと荒っぽすぎて効果がないし、小さいとなかなか収束しない。&lt;BR&gt;実験的に求められた"&lt;STRONG&gt;よさげな値&lt;/STRONG&gt;"が1/1.3らしいす。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/195604.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>わすれもので(ちょびっと)高速化</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/06/23/190494.aspx</link><pubDate>Wed, 23 Jun 2010 21:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/06/23/190494.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/190494.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/06/23/190494.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/190494.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/190494.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://codezine.jp/a/article/aid/5206.aspx"&gt;&lt;FONT color=#0000ff&gt;Visual C++ 2010に追加されたSTLアルゴリズム&lt;/FONT&gt;&lt;/A&gt;@CodeZine で忘れてたのがありました。&lt;/P&gt;
&lt;P&gt;■ minmax_element&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;template&amp;lt;class Iterator, class Predicate&amp;gt;&lt;BR&gt;std::pair&amp;lt;Iterator,Iterator&amp;gt; &lt;BR&gt;&amp;nbsp; &lt;STRONG&gt;&lt;FONT size=4&gt;minmax_element&lt;/FONT&gt;&lt;/STRONG&gt;(Iterator first, Iterator last, Predicate pred);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;シーケンス[first,last)から、最初に見つけた最小要素 と 最後に見つけた最大要素 を指すイテレータをペアにして返します。&lt;/P&gt;
&lt;P&gt;最小/最大要素を見つけてくれるアルゴリズムはそれぞれmin_element/max_elementがあるんだけど、minmax_elementはそいつらの&lt;STRONG&gt;合わせ技&lt;/STRONG&gt;。&lt;BR&gt;大きなメリットはmin_element,max_elementを一度ずつ呼び出すより速いす。要素数Nに対し3/2N程度だそうで、前者の2Nに比べて&lt;STRONG&gt;25%ほどの時短&lt;/STRONG&gt;となるます。&lt;/P&gt;
&lt;P&gt;コレ使って単純選択ソートをちょびっと速くします。単純選択ソートのアルゴリズム&lt;STRONG&gt;はめっちゃ単純&lt;/STRONG&gt;:&lt;BR&gt;「i=0..N-1に対し、data[i]～data[N-1]中の最少要素とdata[i]を交換する」こんだけ。コード書けば:&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;while ( first != last ) {&lt;BR&gt;&amp;nbsp; iter_swap(first, min_element(first,last));&lt;BR&gt;&amp;nbsp; ++first;&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;loop回るたんびに未ソートな要素がいっこずつ減ってくんだから、minmax_elementなら&lt;STRONG&gt;ふたっつずつ&lt;/STRONG&gt;減ってくれんでないのん?&amp;nbsp; と。&lt;BR&gt;&lt;BR&gt;ってなわけで書いてみた。ソート対象は挿入/削除が&lt;STRONG&gt;チョー速い&lt;/STRONG&gt;list&amp;lt;T&amp;gt;で。&lt;/P&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;array&amp;gt;
#include &amp;lt;list&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;numeric&amp;gt;
#include &amp;lt;cassert&amp;gt;
#include &amp;lt;windows.h&amp;gt;
&lt;FONT color=#000000&gt;&lt;B&gt;using&lt;/B&gt;&lt;/FONT&gt; &lt;FONT color=#000000&gt;&lt;B&gt;namespace&lt;/B&gt;&lt;/FONT&gt; std;
&lt;FONT color=#000077&gt;// フツーの単純選択ソート&lt;/FONT&gt;
DWORD min_selection_sort(list&amp;lt;&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;&amp;gt;&amp;amp; data) {
  DWORD t = GetTickCount();
  &lt;FONT color=#000000&gt;&lt;B&gt;for&lt;/B&gt;&lt;/FONT&gt; ( &lt;FONT color=#000000&gt;&lt;B&gt;auto&lt;/B&gt;&lt;/FONT&gt; first = data.begin(); first != data.end(); ++first ) {
    iter_swap(first,min_element(first,data.end()));
  }
  &lt;FONT color=#000000&gt;&lt;B&gt;return&lt;/B&gt;&lt;/FONT&gt; GetTickCount() - t;
}
&lt;FONT color=#000077&gt;// ヒネクレた単純選択ソート&lt;/FONT&gt;
DWORD minmax_selection_sort(list&amp;lt;&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;&amp;gt;&amp;amp; data) {
  DWORD t = GetTickCount();
  list&amp;lt;&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;&amp;gt; smaller, bigger;
  &lt;FONT color=#000000&gt;&lt;B&gt;while&lt;/B&gt;&lt;/FONT&gt; ( !data.empty() ) {
    &lt;FONT color=#000000&gt;&lt;B&gt;auto&lt;/B&gt;&lt;/FONT&gt; mm_pair = minmax_element(data.begin(),data.end());
    smaller.splice(smaller.end(), data, mm_pair.first);
    &lt;FONT color=#000000&gt;&lt;B&gt;if&lt;/B&gt;&lt;/FONT&gt; ( mm_pair.first != mm_pair.second ) {
      bigger.splice(bigger.begin(), data, mm_pair.second);
    }
  }
  data.splice(data.begin(),bigger);
  data.splice(data.begin(),smaller);
  &lt;FONT color=#000000&gt;&lt;B&gt;return&lt;/B&gt;&lt;/FONT&gt; GetTickCount() - t;
}
&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; main() {
  &lt;FONT color=#000000&gt;&lt;B&gt;const&lt;/B&gt;&lt;/FONT&gt; &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; N = 20000;
  array&amp;lt;&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;,N&amp;gt; src;
  iota(src.begin(),src.end(),0);
  random_shuffle(src.begin(),src.end());
  DWORD t;
  list&amp;lt;&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;&amp;gt; data;
  data.assign(src.begin(),src.end());
  t = min_selection_sort(data);
  assert( is_sorted(data.begin(), data.end()));
  cout &amp;lt;&amp;lt; t &amp;lt;&amp;lt; endl;
  data.assign(src.begin(),src.end());
  t = minmax_selection_sort(data);
  assert( is_sorted(data.begin(), data.end()));
  cout &amp;lt;&amp;lt; t &amp;lt;&amp;lt; endl;
}&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;実行結果:&lt;BR&gt;1092 (min_selection)&lt;BR&gt;967 (minmax_selection)&lt;BR&gt;&lt;BR&gt;一割ちょいかー、けっこーややこしくなってっから、こんなもんかなー&lt;BR&gt;もっとエレガントな実装がありそな希ガス。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/190494.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>並列処理が向かないかもしれない例</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/06/22/190465.aspx</link><pubDate>Tue, 22 Jun 2010 22:15:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/06/22/190465.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/190465.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/06/22/190465.aspx#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/190465.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/190465.aspx</trackback:ping><description>ネタ元 → &lt;A id=viewpost.ascx_TitleUrl class=singleposttitle HREF="/jitta/archive/2009/12/16/183892.aspx"&gt;&lt;STRONG&gt;&lt;FONT color=#006bad size=3&gt;Multi-Core と Multi-Thread&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/A&gt; のコメント:&lt;BR&gt;
&lt;BLOCKQUOTE&gt;&lt;FONT color=#808080&gt;どこまでをバブルソートと呼ぶかにもよるけど、交換の仕方を調整すると並列にできますよ、という例。&lt;BR&gt;&lt;/FONT&gt;&lt;A href="http://ja.wikipedia.org/wiki/奇偶転置ソート"&gt;&lt;FONT color=#808080&gt;http://ja.wikipedia.org/wiki/奇偶転置ソート&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;ただ並列にする処理の1つ1つがとても小さいので、有意な差は出るかどうかは謎。&lt;/FONT&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;やってみよぉぢゃありませんか。&lt;BR&gt;# いやさとっちゃんが急遽&lt;STRONG&gt;倍尺&lt;/STRONG&gt;でやらんならんそぉなので、ネタ出しに協力的意味でｗｗｗ&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;1 7 6 5 8 2 4 3 があったとき、&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;BR&gt;[1] ふたつずつのペアをつくる。&lt;U&gt;1 7&lt;/U&gt; &lt;U&gt;6 5&lt;/U&gt; &lt;U&gt;8 2&lt;/U&gt; &lt;U&gt;4 3&lt;/U&gt; &lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;[2] それぞれのペアについて必要なら入れ替え &lt;U&gt;1 7&lt;/U&gt; &lt;U&gt;5 6&lt;/U&gt; &lt;U&gt;2 8&lt;/U&gt; &lt;U&gt;3 4&lt;BR&gt;&lt;/U&gt;[3] ひとつずらしてペアをつくる 1 &lt;U&gt;7 5&lt;/U&gt; &lt;U&gt;6 2&lt;/U&gt; &lt;U&gt;8 3&lt;/U&gt; 4&lt;BR&gt;[4] それぞれのペアについて必要なら入れ替え1 &lt;U&gt;5 7&lt;/U&gt; &lt;U&gt;2 6&lt;/U&gt; &lt;U&gt;3 8&lt;/U&gt; 4&lt;BR&gt;[5] [1]～[4] をくりかえし。&lt;BR&gt;&lt;BR&gt;[2],[4] の際、ペアの入れ替えは&lt;STRONG&gt;互いに独立&lt;/STRONG&gt;だから並行処理できんぢゃん、と。&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;numeric&amp;gt;
#include &amp;lt;cassert&amp;gt;
#include &amp;lt;ppl.h&amp;gt;
#include &amp;lt;Windows.h&amp;gt;&lt;BR&gt;
&lt;FONT color=#000000&gt;&lt;B&gt;using&lt;/B&gt;&lt;/FONT&gt; &lt;FONT color=#000000&gt;&lt;B&gt;namespace&lt;/B&gt;&lt;/FONT&gt; std;
&lt;FONT color=#000000&gt;&lt;B&gt;using&lt;/B&gt;&lt;/FONT&gt; &lt;FONT color=#000000&gt;&lt;B&gt;namespace&lt;/B&gt;&lt;/FONT&gt; Concurrency;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;// 単スレッドで地道にソート
&lt;FONT color=#000000&gt;&lt;B&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;void&lt;/B&gt;&lt;/FONT&gt; single_bubble_sort(&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;* data, &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; N) {
  &lt;FONT color=#000000&gt;&lt;B&gt;bool&lt;/B&gt;&lt;/FONT&gt; swapped;
  &lt;FONT color=#000000&gt;&lt;B&gt;auto&lt;/B&gt;&lt;/FONT&gt; swapper = [&amp;amp;](&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; i) { 
    &lt;FONT color=#000000&gt;&lt;B&gt;if&lt;/B&gt;&lt;/FONT&gt; ( data[i] &amp;gt; data[i+1] ) {
      iter_swap(data+i,data+i+1);
      swapped = &lt;FONT color=#000000&gt;&lt;B&gt;true&lt;/B&gt;&lt;/FONT&gt;;
    }
  };
  &lt;FONT color=#000000&gt;&lt;B&gt;do&lt;/B&gt;&lt;/FONT&gt; {
    swapped = &lt;FONT color=#000000&gt;&lt;B&gt;false&lt;/B&gt;&lt;/FONT&gt;;
    &lt;FONT color=#000000&gt;&lt;B&gt;for&lt;/B&gt;&lt;/FONT&gt; ( &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; i = 0; i &amp;lt; N-1; i += 2 ) { swapper(i); }
    &lt;FONT color=#000000&gt;&lt;B&gt;for&lt;/B&gt;&lt;/FONT&gt; ( &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; i = 1; i &amp;lt; N-1; i += 2 ) { swapper(i); }
  } &lt;FONT color=#000000&gt;&lt;B&gt;while&lt;/B&gt;&lt;/FONT&gt; ( swapped );
}&lt;BR&gt;// PPLで並行処理
&lt;FONT color=#000000&gt;&lt;B&gt;void&lt;/B&gt;&lt;/FONT&gt; multi_bubble_sort(&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;* data, &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; N) {
  &lt;FONT color=#000000&gt;&lt;B&gt;bool&lt;/B&gt;&lt;/FONT&gt; swapped;
  &lt;FONT color=#000000&gt;&lt;B&gt;auto&lt;/B&gt;&lt;/FONT&gt; swapper = [&amp;amp;](&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; i) { 
    &lt;FONT color=#000000&gt;&lt;B&gt;if&lt;/B&gt;&lt;/FONT&gt; ( data[i] &amp;gt; data[i+1] ) {
      iter_swap(data+i,data+i+1);
      swapped = &lt;FONT color=#000000&gt;&lt;B&gt;true&lt;/B&gt;&lt;/FONT&gt;;
    }
  };
  &lt;FONT color=#000000&gt;&lt;B&gt;do&lt;/B&gt;&lt;/FONT&gt; {
    swapped = &lt;FONT color=#000000&gt;&lt;B&gt;false&lt;/B&gt;&lt;/FONT&gt;;
    parallel_for(0,N-1,2,swapper); // へーこー
    parallel_for(1,N-1,2,swapper); // しょり
  } &lt;FONT color=#000000&gt;&lt;B&gt;while&lt;/B&gt;&lt;/FONT&gt; ( swapped );
}&lt;BR&gt;
&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; main() {
  &lt;FONT color=#000000&gt;&lt;B&gt;const&lt;/B&gt;&lt;/FONT&gt; &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; N = 10000;
  &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;* src = &lt;FONT color=#000000&gt;&lt;B&gt;new&lt;/B&gt;&lt;/FONT&gt; &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;[N];
  iota(src, src+N, 10);
  random_shuffle(src,src+N);
  &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;* data = &lt;FONT color=#000000&gt;&lt;B&gt;new&lt;/B&gt;&lt;/FONT&gt; &lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;[N];
  DWORD t0, t1;&lt;BR&gt;
  copy(src,src+N,data);
  t0 = GetTickCount();
  single_bubble_sort(data,N);
  t1 = GetTickCount();
  assert( is_sorted(data,data+N) );
  cout &amp;lt;&amp;lt; (t1 - t0) &amp;lt;&amp;lt; endl;&lt;BR&gt;
  copy(src,src+N,data);
  t0 = GetTickCount();
  multi_bubble_sort(data,N);
  t1 = GetTickCount();
  assert( is_sorted(data,data+N) );
  cout &amp;lt;&amp;lt; (t1 - t0) &amp;lt;&amp;lt; endl;
  &lt;FONT color=#000000&gt;&lt;B&gt;delete&lt;/B&gt;&lt;/FONT&gt;[] data;
  &lt;FONT color=#000000&gt;&lt;B&gt;delete&lt;/B&gt;&lt;/FONT&gt;[] src;
}
&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;BR&gt;こいつを実行するとですね:&lt;BR&gt;171 (single)&lt;BR&gt;2855 (multi)&lt;BR&gt;なんともトホホな結果です。処理単位があまりに&lt;STRONG&gt;ちんこい&lt;/STRONG&gt;ために、&lt;BR&gt;スレッド/タスクこしらえたり切り替えたりのコストを&lt;STRONG&gt;ペイできん&lt;/STRONG&gt;のですな。&lt;BR&gt;# dual-coreでの結果です。octa-coreくらいになればちっとはマシかも。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/190465.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>データ構造なめんな</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/12/06/183571.aspx</link><pubDate>Sun, 06 Dec 2009 01:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/12/06/183571.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/183571.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/12/06/183571.aspx#Feedback</comments><slash:comments>6349</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/183571.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/183571.aspx</trackback:ping><description>&lt;p&gt;ネタ元 → &lt;a href="http://blogs.wankuma.com/ognac/archive/2009/12/06/183569.aspx"&gt;例外に依存するロジックは駄目ですよ&lt;/a&gt;&lt;/p&gt; &lt;p&gt;ほほぉ、なかなかに興味深い実験でございます。&lt;br&gt;&lt;br&gt;　「このケースのように、事前に対象データの絞り込みは言語で&lt;br&gt;　　行うほうが良いケースもあります。」&lt;/p&gt; &lt;p&gt;SQLわからんちんの僕には&lt;strong&gt;胸のすく思い&lt;/strong&gt;。&lt;br&gt;&lt;br&gt;もちっと速くなるかもしんないなーってんでちょいと実験です。&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;pre&gt;&lt;font color="#000000"&gt;
&lt;font color="#000000"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System;
&lt;font color="#000000"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Collections.Generic;
&lt;font color="#000000"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Diagnostics;

&lt;font color="#000000"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; Program {

  &lt;font color="#000000"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#000000"&gt;&lt;b&gt;long&lt;/b&gt;&lt;/font&gt; AddUnique&amp;lt;T&amp;gt;(IEnumerable&amp;lt;T&amp;gt; src, ICollection&amp;lt;T&amp;gt; dst) {
    Stopwatch watch = Stopwatch.StartNew();
    foreach ( T item in src ) {
      &lt;font color="#000000"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; ( !dst.Contains(item) ) { &lt;font color="#000077"&gt;// 重複なければ&lt;/font&gt;
        dst.Add(item); &lt;font color="#000077"&gt;// 追加&lt;/font&gt;
      }
    }
    watch.Stop();
    &lt;font color="#000000"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; watch.ElapsedMilliseconds;
  }

  &lt;font color="#000000"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#000000"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#000000"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; Main() {
    &lt;font color="#000000"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; N = 100000; &lt;font color="#000077"&gt;// 要素数&lt;/font&gt;
    &lt;font color="#000000"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; M = 10000; &lt;font color="#000077"&gt;// 値の上限&lt;/font&gt;
    &lt;font color="#000077"&gt;// 元ネタ生成&lt;/font&gt;
    &lt;font color="#000000"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;[] src = &lt;font color="#000000"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; &lt;font color="#000000"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;[N];
    var r = &lt;font color="#000000"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Random();
    &lt;font color="#000000"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; ( &lt;font color="#000000"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i = 0; i &amp;lt; N; ++i )src[i] = r.Next(M);
    &lt;font color="#000077"&gt;// 3つのCollectionで比べてみよう&lt;/font&gt;
    Console.WriteLine("LinkedList : {0}[ms]",AddUnique(src, &lt;b&gt;new&lt;/b&gt; LinkedList&amp;lt;&lt;b&gt;int&lt;/b&gt;&amp;gt;()));
    Console.WriteLine("List       : {0}[ms]",AddUnique(src, &lt;b&gt;new&lt;/b&gt; List&amp;lt;&lt;b&gt;int&lt;/b&gt;&amp;gt;()));
    Console.WriteLine("HashSet    : {0}[ms]",AddUnique(src, &lt;b&gt;new&lt;/b&gt; HashSet&amp;lt;&lt;b&gt;int&lt;/b&gt;&amp;gt;()));
  }
}
&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;実行結果:&lt;br&gt;&lt;font face="Courier New"&gt;LinkedList : 4729[ms]&lt;br&gt;List&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 3503[ms]&lt;br&gt;HashSet&amp;nbsp;&amp;nbsp;&amp;nbsp; : 17[ms]&lt;br&gt;&lt;/font&gt;&lt;br&gt;&lt;strong&gt;Hashすげー&lt;/strong&gt;。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/183571.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>かき混ぜてはいかがでしょうか C++版</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/07/22/178817.aspx</link><pubDate>Wed, 22 Jul 2009 13:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/07/22/178817.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/178817.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/07/22/178817.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/178817.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/178817.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/07/13/177448.aspx"&gt;かき混ぜてはいかがでしょうか&lt;/a&gt;のつづき...ってゆーか、&lt;br&gt;
ラムダがあんまりおもろいもんで、遊んでみたかっただけさ。&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;font size=2&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;iomanip&amp;gt;
#include &amp;lt;random&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;list&amp;gt;

namespace std { using namespace std::tr1; }

int main() {
  const int N = 20;
  typedef std::list&amp;lt;int&amp;gt; container;
  container data(N); &lt;font color="#009900"&gt;// 要素数Nのコンテナ&lt;/font&gt;

  int i = 0;
  &lt;font color="#009900"&gt;// 1..Nで埋める&lt;/font&gt;
  std::generate_n(data.begin(), data.size(), [i]() mutable { return ++i; });

  &lt;font color="#009900"&gt;// シャッフル前&lt;/font&gt;
  std::cout &amp;lt;&amp;lt; &lt;font color="#0000ff"&gt;&amp;quot;\nbefore : &amp;quot;&lt;/font&gt;;
  std::for_each(data.begin(), data.end(), [](int item) { std::cout &amp;lt;&amp;lt; std::setw(3) &amp;lt;&amp;lt; item;});

  std::mt19937 mt; &lt;font color="#009900"&gt;// メルセンヌ・ツイスター&lt;/font&gt;
  std::uniform_int&amp;lt;&amp;gt; dist; &lt;font color="#009900"&gt;// 一様分布&lt;/font&gt;

  &lt;font color="#009900"&gt;// ネタ元とおんなじアルゴリズム&lt;/font&gt;
  container::iterator tail = data.end();
  for ( int size = data.size(); size != 0; --size ) {
    &lt;font color="#009900"&gt;// &amp;quot;size未満の乱数&amp;quot;番目と末尾要素とを入れ替える&lt;/font&gt;
    container::iterator position= data.begin();
    std::advance(position,dist(mt,size));
    std::iter_swap(position, --tail);
  }

  &lt;font color="#009900"&gt;// シャッフル後&lt;/font&gt;
  std::cout &amp;lt;&amp;lt; &lt;font color="#0000ff"&gt;&amp;quot;\nafter  : &amp;quot;&lt;/font&gt;;
  std::for_each(data.begin(), data.end(), [](int item) { std::cout &amp;lt;&amp;lt; std::setw(3) &amp;lt;&amp;lt; item;});

}&lt;/font&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/178817.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>かき混ぜてはいかがでしょうか</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/07/13/177448.aspx</link><pubDate>Mon, 13 Jul 2009 13:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/07/13/177448.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/177448.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/07/13/177448.aspx#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/177448.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/177448.aspx</trackback:ping><description>&lt;P&gt;ネタ元 → &lt;A href="http://bbs.wankuma.com/index.cgi?mode=al2&amp;amp;namber=38363"&gt;シャッフル&lt;/A&gt;&amp;nbsp;→&amp;nbsp; &lt;A href="http://www.interq.or.jp/www-user/komurak/tips/tranp.html"&gt;トランプのシャッフル&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;僕ならこうやる。&lt;BR&gt;配列を用意する。ナカミは01～13を入れておく。&lt;BR&gt;&lt;BR&gt;01 02 03 04 05 06 07 08 09 10 11 12 13|&lt;BR&gt;&lt;BR&gt;縦棒'|'の左をシャッフル前、右をシャッフル後とする。&lt;BR&gt;シャッフル前の要素の中からでたらめにひとつ選び、&lt;BR&gt;シャッフル前の末尾要素と入れ替えて|を左にずらす。&lt;BR&gt;たとえばでたらめに05を選んだなら:&lt;/P&gt;
&lt;P&gt;01 02 03 04 &lt;font color='blue'&gt;13&lt;/font&gt; 06 07 08 09 10 11 12|&lt;font color='red'&gt;05&lt;/font&gt;&lt;BR&gt;&lt;BR&gt;同じこと、つまり：&lt;BR&gt;シャッフル前の要素の中からでたらめにひとつ選び、&lt;BR&gt;シャッフル前の末尾要素と入れ替えて|を左にずらす。&lt;BR&gt;たとえばでたらめに10を選んだなら:&lt;/P&gt;
&lt;P&gt;01 02 03 04 13 06 07 08 09 &lt;font color='blue'&gt;12&lt;/font&gt; 11|&lt;font color='red'&gt;10&lt;/font&gt; 05&lt;BR&gt;&lt;BR&gt;以下同文に繰り返し、| が左端に達したらシャッフル完了。&lt;BR&gt;&lt;BR&gt;VB.NETで書いてみた。&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;Module ShuffleDemo&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#006400&gt;' x と y を交換する&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Swap(ByRef x As Integer, ByRef y As Integer)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim t As Integer = x&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = y&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = t&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#006400&gt;' data() をかき混ぜる&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Shuffle(ByVal data As Integer())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim rnd As New Random()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For n As Integer = data.Length To 1 Step -1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#006400&gt;' "n未満の乱数"番目 と "n-1"番目とを入れ替える&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Swap(data(rnd.Next(n)), data(n - 1))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub Main()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim data(13) As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#006400&gt;' data() を 1, 2, 3, ... 13 で埋める&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i As Integer = 0 To data.Length - 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data(i) = i + 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#006400&gt;' シャッフルシャッフルぅ&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Shuffle(data)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#006400&gt;' 結果の確認&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each item As Integer In data&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write("{0} ", item)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;End Module&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;簡単ぢゃーん♪&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/177448.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>