遅い→起動時

http://d.hatena.ne.jp/pmint/

先頭集団を求めるアルゴリズム (0)

もしかしたらクラスタリングアルゴリズムに入るのかも知れない。
例えばマラソン実況でよく出てくる「先頭集団」という言葉。その集団はどこからどこまでなのかを探す方法。


普通はしきい値を決めてそこまでを「先頭集団」と見なすんだろうけど、ここでは動的なしきい値を、集団を与えられてから求めている。

コード(C#)
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2013_05_28
{
    class Program
    {
        static void Main(string[] args)
        {
            var data = new List<int> { 10, 9, 8, 5, 4, 3 };
            Func<int, float> func = (datum => (float)datum);
            var ret = cl<int>(data, func);
            Console.Out.WriteLine("count:{0}, ret:{1}", ret.Count(), string.Join(", ", ret));
        }

        static IEnumerable<T> cl<T>(IEnumerable<T> target, Func<T, float> toScoreFunc)
        {
            var sorted = target.OrderByDescending(d => toScoreFunc(d));
            var scores = new List<Tuple<T, float>> { };
            
            var _datum = sorted.First();
            foreach (var datum in sorted)
            {
                float diff = toScoreFunc(_datum) - toScoreFunc(datum);
                scores.Add(new Tuple<T, float>(datum, diff));
                _datum = datum;
            }

            var threshould = scores.OrderByDescending(d => d.Item2).ToList().First();
            var ret = sorted.TakeWhile(d => !d.Equals(threshould.Item1));

            return ret;
        }
    }
}


実行結果。

count:3, ret:10, 9, 8

{10, 9, 8, 5, 4, 3}の中の先頭集団は{10, 9, 8}

用途

例えば検索結果を1ページ目にどれだけ詰め込むかを決めたり。
「1ページ10件表示(設定で変更可能)」とかいうのはあまり人間中心ではないから。