Ejemplo n.º 1
0
        /// <summary>
        /// O(n * k * logk)  // much faster than O(n logn) for k << n
        /// </summary>
        /// <param name="s"></param>
        /// <param name="p"></param>
        /// <param name="conf"></param>
        /// <returns></returns>
        public long UpdateKnn(IAlgorithm s, IP p, KnnConfiguration conf)
        {
            conf = conf ?? new KnnConfiguration();

            var sw = new Stopwatch();

            sw.Start();

            s.Knn.Clear();
            s.Knn.Origin = p;
            s.Knn.K      = conf.K;

            //var all = new List<IPDist>(); // naive version
            var sortedList2 = new SortedList2();  // better naive version

            var n = s.Points.Count;

            for (var i = 0; i < n; i++)
            {
                var p1 = s.Points[i];
                if (p.Equals(p1))
                {
                    continue;               // don't include origin
                }
                if (conf.SameTypeOnly && p.Type != p1.Type)
                {
                    continue;                                         // only same type used
                }
                var dist = p.Distance(p1.X, p1.Y);
                if (dist >= conf.MaxDistance)
                {
                    continue;
                }

                var pdist = new PDist {
                    Point = p1, Distance = dist
                };

                //all.Add(pdist); // naive version
                sortedList2.Add(pdist, conf.K);  // better naive version
            }

            //s.Knn.NNs = all.OrderBy(i => i.Distance).Take(conf.K).ToList(); // O(n logn)
            s.Knn.NNs = sortedList2.GetAll(); // O(n * k * logk) // better naive version

            sw.Stop();
            return(sw.ElapsedMilliseconds);
        }
 public ObservableCollectionSortedIndex(string name, IObservableCollection <T> collection, string[] watchProperties, Func <T, object> keyGetter, System.Collections.IComparer comparer) : base(name, collection, watchProperties, keyGetter, comparer)
 {
     _items = new SortedList2(new SortedList2ItemComparer(comparer));
     Initialize();
 }