public TagsGroup[] GetFiftyMostSimilarGroupsHeap(TagsGroup value) { const int resultLength = 50; BinaryHeap <TagsSimilarityInfo> binaryHeap = new BinaryHeap <TagsSimilarityInfo>(50); for (int groupIndex = 0; groupIndex < Groups.Length; groupIndex++) { TagsGroup tagsGroup = Groups[groupIndex]; int similarityValue = TagsGroup.MeasureSimilarity(value, tagsGroup); TagsSimilarityInfo newInfo = new TagsSimilarityInfo(groupIndex, similarityValue); if (binaryHeap.Count == resultLength && binaryHeap.Max.CompareTo(newInfo) == -1) { continue; } binaryHeap.Add(newInfo); if (binaryHeap.Count > resultLength) { binaryHeap.RemoveMax(); } } TagsGroup[] result = new TagsGroup[resultLength]; List <TagsSimilarityInfo> list = new List <TagsSimilarityInfo>(binaryHeap); list.Sort(); for (int i = 0; i < resultLength; i++) { result[i] = Groups[list[i].Index]; binaryHeap.RemoveMax(); } return(result); }
public TagsGroup[] GetFiftyMostSimilarGroupsSortedSet(TagsGroup value) { const int resultLength = 50; SortedSet <TagsSimilarityInfo> sortedSet = new SortedSet <TagsSimilarityInfo>(); for (int groupIndex = 0; groupIndex < Groups.Length; groupIndex++) { TagsGroup tagsGroup = Groups[groupIndex]; int similarityValue = TagsGroup.MeasureSimilarity(value, tagsGroup); TagsSimilarityInfo newInfo = new TagsSimilarityInfo(groupIndex, similarityValue); if (sortedSet.Count == resultLength && sortedSet.Max.CompareTo(newInfo) == -1) { continue; } sortedSet.Add(newInfo); if (sortedSet.Count > resultLength) { sortedSet.Remove(sortedSet.Max); } } TagsGroup[] result = new TagsGroup[resultLength]; int i = 0; foreach (var info in sortedSet) { result[i++] = Groups[info.Index]; } return(result); }
public TagsGroup[] GetFiftyMostSimilarGroups(TagsGroup value) { const int resultLength = 50; List <TagsSimilarityInfo> list = new List <TagsSimilarityInfo>(resultLength); for (int groupIndex = 0; groupIndex < Groups.Length; groupIndex++) { TagsGroup tagsGroup = Groups[groupIndex]; int similarityValue = TagsGroup.MeasureSimilarity(value, tagsGroup); TagsSimilarityInfo newInfo = new TagsSimilarityInfo(groupIndex, similarityValue); if (list.Count == resultLength && list[resultLength - 1].CompareTo(newInfo) == -1) { continue; } int index = ~list.BinarySearch(newInfo); list.Insert(index, newInfo); if (list.Count > resultLength) { list.RemoveAt(resultLength); } } TagsGroup[] result = new TagsGroup[resultLength]; for (int i = 0; i < resultLength; i++) { result[i] = Groups[list[i].Index]; } return(result); }
List <TagsSimilarityInfo> GetFiftyMostSimilarGroupsMultiThreadCore(TagsGroup value, int leftIndex, int rightIndex) { const int resultLength = 50; List <TagsSimilarityInfo> list = new List <TagsSimilarityInfo>(resultLength); for (int groupIndex = leftIndex; groupIndex < rightIndex; groupIndex++) { TagsGroup tagsGroup = Groups[groupIndex]; int similarityValue = TagsGroup.MeasureSimilarity(value, tagsGroup); TagsSimilarityInfo newInfo = new TagsSimilarityInfo(groupIndex, similarityValue); if (list.Count == resultLength && list[resultLength - 1].CompareTo(newInfo) == -1) { continue; } int index = ~list.BinarySearch(newInfo); list.Insert(index, newInfo); if (list.Count > resultLength) { list.RemoveAt(resultLength); } } return(list); }
TagsGroup[] MergeTaskResults(int resultLength, int threadsCount, List <TagsSimilarityInfo>[] taskResults) { TagsGroup[] result = new TagsGroup[resultLength]; int[] indices = new int[threadsCount]; for (int i = 0; i < resultLength; i++) { int minIndex = 0; TagsSimilarityInfo currentBest = taskResults[minIndex][indices[minIndex]]; for (int j = 0; j < threadsCount; j++) { var current = taskResults[j][indices[j]]; if (current.CompareTo(currentBest) == -1) { minIndex = j; currentBest = taskResults[minIndex][indices[minIndex]]; } } int groupIndex = currentBest.Index; result[i] = Groups[groupIndex]; indices[minIndex]++; } return(result); }