/// <summary> /// 比较两个多维数据封装是否相同 /// </summary> /// <param name="inputOne">输入1</param> /// <param name="inputTwo">输入2</param> /// <param name="ifCheck">是否进行输入检查</param> /// <returns>是否相同</returns> /// <exception cref="ArgumentException">输入为Null或维度不相同或维度为0</exception> internal static bool IfDDimensionIsEqula (IDimensionValueBean inputOne, IDimensionValueBean inputTwo, bool ifCheck = true) { if (ifCheck) { inputCheck(inputOne, inputTwo); } bool returnValue = true; int sumNumber = inputOne.GetSumDimensionNumber(); //检查各维度 for (int tempIndex = 0; tempIndex < sumNumber; tempIndex++) { //当出现不等时 if (CompareResultEnum.Equal != CompareDoulbe (inputOne.GetValueAtDimensionIndex(tempIndex), inputTwo.GetValueAtDimensionIndex(tempIndex))) { returnValue = false; } } return(returnValue); }
/// <summary> /// 计算两个多维数据之间的欧几里得距离 /// </summary> /// <param name="inputOne">输入1</param> /// <param name="inputTwo">输入2</param> /// <returns>欧几里得距离</returns> /// <exception cref="ArgumentException">输入为Null或维度不相同或维度为0</exception> internal static double CalculateDistanceByEuclidean (IDimensionValueBean inputOne, IDimensionValueBean inputTwo, bool ifCheck = true) { if (ifCheck) { inputCheck(inputOne, inputTwo); } double returnValue = 0.0d; int tempSize = inputOne.GetSumDimensionNumber(); //维度距离累计 for (int tempIndex = 0; tempIndex < tempSize; tempIndex++) { returnValue = returnValue + Math.Pow ((inputOne.GetValueAtDimensionIndex(tempIndex) - inputTwo.GetValueAtDimensionIndex(tempIndex)), 2.0D); } //开根号 returnValue = Math.Pow(returnValue, 0.5D); return(returnValue); }
/// <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)); } }
/// <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); }