//todo: not working correct. Very slow
        /// <summary>
        /// Performs a linear search.
        /// </summary>
        /// <param name="center">Center point</param>
        /// <param name="radius">Radius to find neighbours within</param>
        public LinkedList <TValue> LinearSearch(TKey[] center, TKey[] radius)
        {
            var extendedCenter = new TKey[center.Length];

            for (int i = 0; i < center.Length; i++)
            {
                extendedCenter[i] = typeMath.Add(center[i], radius[i]);
            }
            //var prevDistance = new TKey[center.Length];
            //for (int i = 0; i < center.Length; i++)
            //    prevDistance[i] = typeMath.PositiveInfinity;
            var prevDistance = new Stack <TKey> [center.Length];
            var wasLess      = new Stack <bool> [center.Length];

            for (int i = 0; i < center.Length; i++)
            {
                prevDistance[i] = new Stack <TKey>();
                prevDistance[i].Push(typeMath.PositiveInfinity);

                wasLess[i] = new Stack <bool>();
                wasLess[i].Push(false);
            }

            LinkedList <TValue> nearestNeighbours = new LinkedList <TValue>();

            AddNearestNeighbours(root,
                                 extendedCenter,
                                 0,
                                 prevDistance,
                                 nearestNeighbours,
                                 wasLess);
            return(nearestNeighbours);
        }
Beispiel #2
0
        private TKey DistanceSquaredBetweenPoints(TKey[] a, TKey[] b)
        {
            TKey distance = typeMath.Zero;

            // Return the absolute distance bewteen 2 hyper points
            for (var dimension = 0; dimension < dimensions; dimension++)
            {
                TKey distOnThisAxis        = typeMath.Subtract(a[dimension], b[dimension]);
                TKey distOnThisAxisSquared = typeMath.Multiply(distOnThisAxis, distOnThisAxis);

                distance = typeMath.Add(distance, distOnThisAxisSquared);
            }

            return(distance);
        }