예제 #1
0
        private UnionFindItemInternal FindInternal(UnionFindItem <TKey> item)
        {
            if (!_indexes.ContainsKey(item.Id))
            {
                throw new ArgumentException($"Item with code: {item.Id} not found", nameof(item));
            }

            var currIndex = _indexes[item.Id];

            while (_data[currIndex].ParentIndex != currIndex)
            {
                currIndex = _data[currIndex].ParentIndex;
            }

            return(_data[currIndex]);
        }
예제 #2
0
        /// <summary>
        /// Объединение элементов с их подмножествами в одно множество
        /// </summary>
        /// <param name="first">Первый элемент</param>
        /// <param name="second">Второй элемент</param>
        public void Union(UnionFindItem <TKey> first, UnionFindItem <TKey> second)
        {
            var firstRootElement  = FindInternal(first);
            var secondRootElement = FindInternal(second);

            if (firstRootElement.ParentIndex == secondRootElement.ParentIndex)
            {
                return;
            }
            //throw new InvalidOperationException("Elements already exist in the same set");

            if (firstRootElement.Count >= secondRootElement.Count)
            {
                secondRootElement.ParentIndex = firstRootElement.ParentIndex;
                firstRootElement.Count       += secondRootElement.Count;
            }
            else
            {
                firstRootElement.ParentIndex = secondRootElement.ParentIndex;
                secondRootElement.Count     += firstRootElement.Count;
            }
        }
예제 #3
0
 /// <summary>
 /// Получение родительского элемента множества, в котором находится <paramref name="item"/>
 /// </summary>
 /// <param name="item">Элемент поиска</param>
 /// <returns>Родитльеский элемент множества</returns>
 public UnionFindItem <TKey> Find(UnionFindItem <TKey> item)
 {
     return(FindInternal(item).Data);
 }