示例#1
0
        /// <summary>
        /// 递归寻找方法
        /// </summary>
        /// <param name="inputNode">输入的节点</param>
        /// <param name="inputValue">输入的值</param>
        /// <returns>找到的值若为Null则未找到</returns>
        private KDTreeNode searchRecursion(KDTreeNode inputNode, IDimensionValueBean inputValue)
        {
            if (null == inputNode)
            {
                return(null);
            }
            //若两节点相同
            else if
            (UtilityMethod.IfDDimensionIsEqula
                 (inputNode.ThisDataValue, inputValue, ifUseRecursionCheck))
            {
                //若节点已删除
                if (inputNode.IsDeleteTag)
                {
                    return(null);
                }
                else
                {
                    return(inputNode);
                }
            }
            else
            {
                //获取维度索引
                int dimensionIndex = inputNode.NowDimisionIndex;
                //获取多维数据封装
                IDimensionValueBean nodeValue = inputNode.ThisDataValue;
                //获得当前节点维度的值
                double tempDimensionValue = nodeValue.GetValueAtDimensionIndex(dimensionIndex);
                //获得输入数值在节点维度的值
                double tempInputValue = inputValue.GetValueAtDimensionIndex(dimensionIndex);

                //比较两值
                CompareResultEnum compareResult = UtilityMethod.CompareDoulbe(tempInputValue, tempDimensionValue);
                //比较结果调整
                compareResult = equalStrategy(compareResult);

                //次轮迭代使用的节点
                KDTreeNode nextRoundNode = null;

                //若小于去左节点
                if (compareResult == CompareResultEnum.Less)
                {
                    nextRoundNode = inputNode.LeftChild;
                }
                //其它去右节点
                else
                {
                    nextRoundNode = inputNode.RightChild;
                }
                //递归执行
                return(searchRecursion(nextRoundNode, inputValue));
            }
        }
示例#2
0
        /// <summary>
        /// 添加节点的递归方法
        /// </summary>
        /// <param name="inputValue">输入的值</param>
        /// <returns></returns>
        private bool insertLoopMethod(IDimensionValueBean inputValue)
        {
            //当前递归节点
            KDTreeNode currentNode = rootNode;
            //当前节点的父节点
            KDTreeNode parentNode = null;
            //临时节点
            KDTreeNode tempNode = null;
            //父节点的索引
            int tempDimensionIndex = -1;

            //当前节点应当使用的索引
            int tempNowIndex = -1;

            //表征节点前进方向是否是向左节点
            bool ifIsLeftTag = true;

            double tempParentValue  = 0.0d;
            double tempCurrentValue = 0.0d;

            CompareResultEnum tempCompareResult;

            //递归寻找添加位点
            while (true)
            {
                //当前递归层级节点变为父节点
                parentNode = currentNode;
                //获得父节点的索引
                tempDimensionIndex = parentNode.NowDimisionIndex;
                //获得父节点的值
                tempParentValue = parentNode.ThisDataValue.
                                  GetValueAtDimensionIndex(tempDimensionIndex);
                //获取此节点的值
                tempCurrentValue = inputValue.
                                   GetValueAtDimensionIndex(tempDimensionIndex);
                //比较节点值
                tempCompareResult = UtilityMethod.
                                    CompareDoulbe(tempCurrentValue, tempParentValue);
                //按相等策略调整
                tempCompareResult = equalStrategy(tempCompareResult);

                //小于:左子树方向
                if (tempCompareResult == CompareResultEnum.Less)
                {
                    ifIsLeftTag = true;
                }
                //其它右子树方向
                else
                {
                    ifIsLeftTag = false;
                }

                //获取父节点相应位置处的子节点
                currentNode = parentNode.GetChildNode(ifIsLeftTag);
                //获得子节点的索引
                tempNowIndex = GetUseDimensionInde(tempDimensionIndex);
                if (null == currentNode)
                {
                    tempNode = new KDTreeNode(inputValue, tempNowIndex);
                    parentNode.SetChildNode(ifIsLeftTag, tempNode);
                    break;
                }

                //若多维值相同
                if (UtilityMethod.IfDDimensionIsEqula(currentNode.ThisDataValue, inputValue))
                {
                    //若需要替换或当前节点是已删除状态
                    if (ifEqualValueReplace || currentNode.IsDeleteTag)
                    {
                        currentNode.ThisDataValue = inputValue;
                        currentNode.IsDeleteTag   = false;
                    }
                    break;
                }
            }
            nodeCount++;
            return(true);
        }