Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
 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);
 }