トップ «前の日記(2007-02-14) 最新 次の日記(2007-02-16)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2007-02-15

_ 比較しないのは難しい

追記:.NETは関係ないよ。32ビット整数と64ビット整数を持つ処理系の 話だ。手元でcscがすぐ動く環境でたまたま書いてたからC#で書いてるだけ。でもまあ、おもしろいので『整数型に対する Compare の実装』も参照すると良いかも。(さらに追記:ああ、意図がわかったかも。正しい実装(HardCmp)については自分で実装しなくても良いってことか。まあ、それは実装の比較ということでというか.NETの実装を使ってはあまり意味がない、と多分NyaRuRuさんはわかってるので別の話を展開して、というのが流れか)

どうやれば比較しないで済むか試したが僕にはえらく難しかった。

とりあえず、こんなものしかできなかった(最初、比較関数の中でプリントまでしてたのでえらく簡単だったがintを戻すように変えた瞬間から困ったことになったのであった)。

public class Cmp
{
    static void ShowResult(string p, int result)
    {
        System.Console.WriteLine("{0} {1}", p,
                (result == 0) ? "0" : (result < 0) ? "-" : "+");
    }
    static int FastCmp(int x, int y)
    {
        return x - y;
    }
    static int HardCmp(int x, int y)
    {
        return (x == y) ? 0 : (x > y) ? 1 : -1;
    }
    static int Bogus(int x, int y)
    {
        long l = (long)x - (long)y;
        return (int)(l >> 1 | l & 0x7fffffff);
    }
    delegate int comp(int x, int y);
    public static void Main()
    {
        comp[] fns = { FastCmp, HardCmp, Bogus };
        int[][] checks = {
            new int[]{ 5, 4, }, new int[]{ 4, 4, }, new int[]{ 4, 5, },
            new int[]{ -4, -5, }, new int[]{ -4, -4, }, new int[]{ -5, -4, },            
            new int[]{ 1, -1, }, new int[]{ -1, -1, }, new int[]{ -1, 1, },            
            new int[]{ int.MinValue, int.MaxValue, },
            new int[]{ int.MaxValue, -1 },
            new int[]{ 0, int.MinValue },            
        };
        foreach (int[] check in checks)
        {
            System.Console.WriteLine("--- cmp({0}, {1}) ---", check[0], check[1]);
            foreach (comp c in fns)
            {
                ShowResult(c.Method.Name, c(check[0], check[1]));
            }
        }
    }
}
最後が本当にl >> 32 & 0x80000000でよいのか自信がない。l >> 32 & 0x80000001としなければならないことにはならないとは思うんだけど。

元は比較関数の反応むむ。(RSSリーダの巡回順にこの順で出てきておもしろかったわけだが。というか、intは30ビットで収まるあたり、longは60ビットで収まるあたりで大体使うもんじゃないか? と思ったけど汎用ライブラリではそうもいかないわけですな)

追記:上で33ビット目が立つかとか書いてるが、立たないはずなので、するとMSBを持ってくる必要がなくなってさらに小さくなった。

_ どこかで見たような記法

それにしてもwhere句の指定方法ってK&Rみたいだな。

_ ハリー!ハリー!

誠に申し訳ございませんがご注文いただいた以下の商品がまだ確保
できておりません。
      					
  細野晴臣 (アーティスト) "ハリーホソノ クラウン 
	イヤーズ オブ 1975-1976 (DVD付) [Box set] [Live]" [CD]
    商品の発送が4~6週間ほど遅れます。
そんなぁ。 ハリー細野 クラウン・イヤーズ1974-1977(細野晴臣/ティン・パン・アレー/馬場こずえ)

_ 3値を返すComparer

そりゃ安定したソートのためだろうと思ったら、(追記:関係ないね)
このメソッドは、QuickSort アルゴリズムを使用します。この実装では不安定な並べ替えを実行します。つまり、2 つの要素が等しかった場合、これらの順序は保持されない可能性があります。一方、安定した並べ替えでは、等しい要素の順序が保持されます。 ――Array.Sort メソッド
なんて書いてあるなぁ。 Javaの場合、Comparator<? super T>は同様に3値(というか、正、0、負)を返すだけに、
This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort. ――Arrays.sort
となっているけど。これは.NETのドキュメントがおかしいのではなかろうか。とまで思ったけど、QuickSortを使うと書ききっているので、単にJavaのComparatorに合わせただけなのかも(Javaはマージソートを使うとなっている)。

2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|

ジェズイットを見習え