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]); }
/// <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; } }
/// <summary> /// Получение родительского элемента множества, в котором находится <paramref name="item"/> /// </summary> /// <param name="item">Элемент поиска</param> /// <returns>Родитльеский элемент множества</returns> public UnionFindItem <TKey> Find(UnionFindItem <TKey> item) { return(FindInternal(item).Data); }