/// <summary> /// Reconstitutes the given tree into a new one (balances it) /// </summary> /// <param name="OldTree"></param> public Company_KDTree(Company_KDTree OldTree) { List <Company> CompanyList = new List <Company>(); OldTree.GetAllCompanies(ref CompanyList); Company[] CompanyArray = CompanyList.ToArray(); SplitDimensionIndex = 0; if (CompanyArray.Length > 2) { SortByDimension(ref CompanyArray, SplitDimensionIndex); int MedianIndex = CompanyArray.Length / 2; SplitPosition = CompanyArray[MedianIndex].Location[SplitDimensionIndex]; Company[] LowerList = new Company[MedianIndex + 1]; Company[] UpperList = new Company[CompanyArray.Length - MedianIndex - 1]; Array.Copy(CompanyArray, 0, LowerList, 0, LowerList.Length); Array.Copy(CompanyArray, MedianIndex + 1, UpperList, 0, UpperList.Length); LessEqualNode = new Company_KDTree(SplitDimensionIndex, LowerList); GreaterNode = new Company_KDTree(SplitDimensionIndex, UpperList); } else { Constituents = CompanyArray; isLeafNode = true; } }
/// <summary> /// Reconstitutes the given tree into a new one (balances it) /// </summary> /// <param name="OldTree"></param> public Company_KDTree(Company_KDTree OldTree) { List<Company> CompanyList = new List<Company>(); OldTree.GetAllCompanies(ref CompanyList); Company[] CompanyArray = CompanyList.ToArray(); SplitDimensionIndex = 0; if (CompanyArray.Length > 2) { SortByDimension(ref CompanyArray, SplitDimensionIndex); int MedianIndex = CompanyArray.Length / 2; SplitPosition = CompanyArray[MedianIndex].Location[SplitDimensionIndex]; Company[] LowerList = new Company[MedianIndex + 1]; Company[] UpperList = new Company[CompanyArray.Length - MedianIndex - 1]; Array.Copy(CompanyArray, 0, LowerList, 0, LowerList.Length); Array.Copy(CompanyArray, MedianIndex + 1, UpperList, 0, UpperList.Length); LessEqualNode = new Company_KDTree(SplitDimensionIndex, LowerList); GreaterNode = new Company_KDTree(SplitDimensionIndex, UpperList); } else { Constituents = CompanyArray; isLeafNode = true; } }
public void GetAllCompanies(ref List <Company> AppendList) { if (isLeafNode) { for (int i = 0; i < Constituents.Length; i++) { if (Constituents[i].Money > 0) { AppendList.Add(Constituents[i]); } } } else { LessEqualNode.GetAllCompanies(ref AppendList); GreaterNode.GetAllCompanies(ref AppendList); } }