<?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</title><link>http://blogs.wankuma.com/hirase/category/1740.aspx</link><description>Algorithm</description><managingEditor>T.Hirase</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>T.Hirase</dc:creator><title>漸化式とプログラムループ</title><link>http://blogs.wankuma.com/hirase/archive/2009/05/28/173718.aspx</link><pubDate>Thu, 28 May 2009 02:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/05/28/173718.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/173718.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/05/28/173718.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/173718.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/173718.aspx</trackback:ping><description>&lt;p&gt;すべての漸化式の一般項が存在するならば、すべてのプログラムループは、１ループ単位でを並列実行できる・・・・・、とかなんとか。&lt;/p&gt;
&lt;p&gt;プログラムのループって、１回１回のループが別のループに依存していなければ、当然並列実行できると思う。たとえば、１回目のループと２回目のループは単にループ回数を利用して、特定の計算をしているだけ・・・とか。（ようわ、for文のiにだけ依存しているってこと。）&lt;/p&gt;
&lt;p&gt;で、別に他のループに依存していたら並列実行できないのかって考えた結果、その依存性を排除できれば並列実行できるわけなんだから、後は依存性を如何に排除すべきかって考えた。&lt;/p&gt;
&lt;p&gt;そうしたときに、ふと漸化式が舞い降りた。漸化式って、前後の値に依存するけど、一般項を求められる。これってつまり、前後の値への依存性を排除できているってこと。ということは、何だ。プログラムのループだって依存性を排除できるじゃない。&lt;/p&gt;
&lt;p&gt;って、夢うつつに思う。&lt;/p&gt;
&lt;p&gt;いや、まぁ、ハードウェア資源的な問題もあるけど、計算だけなら大丈夫・・・？&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/173718.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] シェーカーソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/08/136788.aspx</link><pubDate>Thu, 08 May 2008 02:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/08/136788.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136788.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/08/136788.aspx#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136788.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136788.aspx</trackback:ping><description>&lt;h2&gt;シェーカーソート（シェーカーソート、Shaker sort、カクテルソート、Cocktail sort、双方向バブルソート、bidirectional bubble sort）。&lt;/h2&gt;
&lt;p&gt;バブルソートの改良版。バブルソートで1回のループで昇順と降順を一度に並び替える。同じ要素の並びは変わらない安定ソート。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;template &amp;lt;typename TElement, typename TSize&amp;gt;
void ShakerSort(TElement * data, const TSize size)
{
    TSize head = 0;
    TSize tail = size - 1;
    while (head &amp;lt; tail)
    {
        TSize swapPos = head;

        for (TSize i = head; i &amp;lt; tail; ++i)
        {
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapPos = i;
            }
        }

        tail = swapPos;

        for (TSize i = tail; i &amp;gt; head; --i)
        {
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapPos = i;
            }
        }
        {    // TSizeがunsigned型の場合、対策。
            TSize i = head;
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapPos = i;
            }
        }
        head = swapPos;
    }
}
&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136788.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] ハトの巣ソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/08/136781.aspx</link><pubDate>Thu, 08 May 2008 01:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/08/136781.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136781.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/08/136781.aspx#Feedback</comments><slash:comments>956</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136781.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136781.aspx</trackback:ping><description>&lt;h2&gt;ハトの巣ソート（ピジョンソート、Pigeon sort）。&lt;/h2&gt;
&lt;p&gt;いまいち理解できていないので、Wikipedia様に丸投げ→→「&lt;a href="http://en.wikipedia.org/wiki/Pigeonhole_sort" target="_blank"&gt;Pigeonhole sort&lt;/a&gt;」。（ 18:06, 19 March 2008版には擬似コードもあり。）&lt;/p&gt;
&lt;p&gt;メモリは食うけど、ソートは馬鹿早い。同じ要素の並びは変わらない安定ソート。&lt;/p&gt;
&lt;p&gt;追記＠2008-05-12T23:39+09:00：新しいバージョンをアップ。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;/* データはユニークである必要があります。 */
template&amp;lt;typename TElement, typename TSize&amp;gt;
void PigeonholeSort(TElement * data, const TSize size)
{
    TElement min = data[0];
    TElement max = min;
    for (TSize i = 1; i &amp;lt; size; ++i) {
        min = data[i] &amp;lt; min ? data[i] : min;
        max = data[i] &amp;gt; max ? data[i] : max;
    }

    TSize range = max - min + 1;
    TElement * pigeonholes = new TElement[range];
    for (TSize i = 0; i &amp;lt; range; ++i)
        pigeonholes[i] = 0;	/* memsetで十分。 */

    for (TSize i = 0; i &amp;lt; size; ++i)
        pigeonholes[data[i]-min] = data[i];

    TSize dataPos = 0;
    for (TSize i = 0; i &amp;lt; range; ++i)
        if (pigeonholes[i] != 0)
            data[dataPos++] = i + min;

    delete[] pigeonholes;
}&lt;/pre&gt;
&lt;p&gt;追記@2008-05-08T17:19+09:00：下記のコードはちょっと間違えています。そのうち修正しますので、くれぐれも参考にしないよう、お願いします。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;map&amp;gt;
 
template&amp;lt;typename TElement, typename TSize&amp;gt;
void PigeonholeSort(TElement * data, const TSize size)
{
    typedef std::map&amp;lt;TElement, std::vector&amp;lt;TElement&amp;gt; &amp;gt; TMap;
    TMap pigeonholes;
    
    for (TSize i = 0; i &amp;lt; size; ++i)
        pigeonholes[data[i]].push_back(data[i]);
    
    TSize dataPos = 0;
    const TMap::const_iterator end = pigeonholes.end();
    for (TMap::iterator it = pigeonholes.begin(); it != end; ++it)
    {
        const TMap::value_type &amp; pigeonhole = *it;
        const TSize size =  pigeonhole.second.size();
        for (TSize i = 0; i &amp;lt; size; ++i)
        {
            data[dataPos++] = pigeonhole.first;
        }
    }
}
&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136781.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] 選択ソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/08/136763.aspx</link><pubDate>Thu, 08 May 2008 00:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/08/136763.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136763.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/08/136763.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136763.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136763.aspx</trackback:ping><description>&lt;h2&gt;選択ソート（直接選択ソート、Selection sort）。&lt;/h2&gt;
&lt;p&gt;一番小さいのを選んで、先頭へ。次に小さいのを選んで2番目に・・・と並べる。一般的には、同じ要素の並びが変わってしまう不安定ソート。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;template&amp;lt;typename TElement, typename TSize&amp;gt;
void SelectionSort(TElement * data, const TSize size)
{
    TSize tail = size - 1;
    for (TSize head = 0; head &amp;lt; tail; ++head)
    {
        TElement * pMin = (data + head);
        for (TSize pos = head + 1; pos &amp;lt; size; ++pos)
            if (data[pos] &amp;lt; *pMin) pMin = (data + pos);
    
        if (data + head != pMin)
        {
            TElement temp = data[head];
            data[head] = *pMin;
            *pMin = temp;
        }
    }
}
&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136763.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] バブルソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/07/136743.aspx</link><pubDate>Wed, 07 May 2008 23:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/07/136743.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136743.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/07/136743.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136743.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136743.aspx</trackback:ping><description>&lt;h2&gt;バブルソート（Bubble sort）&lt;/h2&gt;
&lt;p&gt;2つの要素を比べては交換、比べては交換して、交換できる要素がなくなれば終了。同じ要素の並びは変わらない安定ソート。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;template &amp;lt;typename TElement, typename TSize&amp;gt;
void BubbleSort(TElement * data, const TSize size)
{
    bool swapped = false;
    do
    {
        swapped = false;
        const TSize max = size - 1;
        for (TSize i = 0; i &amp;lt; max; ++i)
        {
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapped = true;
            }
        }
    } while (swapped);
}
&lt;/pre&gt;
&lt;p&gt;これでOK？&lt;/p&gt;
&lt;p&gt;交換するコードが、味噌味。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136743.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>