もしかしたらクラスタリングのアルゴリズムに入るのかも知れない。
例えばマラソン実況でよく出てくる「先頭集団」という言葉。その集団はどこからどこまでなのかを探す方法。
普通はしきい値を決めてそこまでを「先頭集団」と見なすんだろうけど、ここでは動的なしきい値を、集団を与えられてから求めている。
コード(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件表示(設定で変更可能)」とかいうのはあまり人間中心ではないから。