mirror of
https://github.com/TheAlgorithms/PHP.git
synced 2025-01-17 15:18:13 +01:00
eba642dbbe
* Added Disjoint Sets Data structure * Moved DisjointSetTest.php to tests/DataStructures * Update DataStructures/DisjointSets/DisjointSet.php Co-authored-by: Brandon Johnson <bbj1979@gmail.com> * Update DataStructures/DisjointSets/DisjointSetNode.php Co-authored-by: Brandon Johnson <bbj1979@gmail.com> * Update DataStructures/DisjointSets/DisjointSetNode.php Co-authored-by: Brandon Johnson <bbj1979@gmail.com> * Update tests/DataStructures/DisjointSetTest.php Co-authored-by: Brandon Johnson <bbj1979@gmail.com> * Update tests/DataStructures/DisjointSetTest.php Co-authored-by: Brandon Johnson <bbj1979@gmail.com> * Update tests/DataStructures/DisjointSetTest.php Co-authored-by: Brandon Johnson <bbj1979@gmail.com> * Considered PHPCS remarks. Unit Testing is now working. * Remove data type mixed. Considered annotations for php7.4. * Remove data type mixed. Considered annotations for php7.4. * updating DIRECTORY.md * Implemented Trie DataStructure * Added Trie to DIRECTORY.md * updating DIRECTORY.md * Implemented AVLTree DataStructure * updating DIRECTORY.md * Implemented AVLTree DataStructure * Implemented SegmentTreeNode.php * Implementing SegmentTree * Implementing SegmentTree with updateTree * Implementing SegmentTree with rangeUpdateTree * Implementing SegmentTree with query and queryTree * Added serializing and deserializing of the SegmentTree * Adding unit tests SegmentTree implementation * Added unit tests for SegmentTree updates and range updates * considering PHPCS for Added unit tests for SegmentTree updates and range updates * Added unit tests for SegmentTree serialization/deserialization and array updates reflections * Added unit tests for SegmentTree Edge Cases * Added unit tests for SegmentTree Exceptions (OutOfBoundsException, InvalidArgumentException) * Added SegmentTree to DIRECTORY.md * Implemented Segment Tree Data Structure * Added some comments to my files in: #160, #162, #163, #166. Implemented Segment Tree Data Structure. * Added some comments to my files in: #160, #162, #163, #166. Implemented Segment Tree Data Structure. * Added comments time complexity for query(), update() and buildTree() --------- Co-authored-by: Brandon Johnson <bbj1979@gmail.com> Co-authored-by: Ramy-Badr-Ahmed <Ramy-Badr-Ahmed@users.noreply.github.com>
50 lines
1.3 KiB
PHP
50 lines
1.3 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Created by: Ramy-Badr-Ahmed (https://github.com/Ramy-Badr-Ahmed) in Pull Request: #160
|
|
* https://github.com/TheAlgorithms/PHP/pull/160
|
|
*
|
|
* Please mention me (@Ramy-Badr-Ahmed) in any issue or pull request addressing bugs/corrections to this file.
|
|
* Thank you!
|
|
*/
|
|
|
|
namespace DataStructures\DisjointSets;
|
|
|
|
class DisjointSet
|
|
{
|
|
/**
|
|
* Finds the representative of the set that contains the node.
|
|
*/
|
|
public function findSet(DisjointSetNode $node): DisjointSetNode
|
|
{
|
|
if ($node !== $node->parent) {
|
|
// Path compression: make the parent point directly to the root
|
|
$node->parent = $this->findSet($node->parent);
|
|
}
|
|
return $node->parent;
|
|
}
|
|
|
|
/**
|
|
* Unites the sets that contain x and y.
|
|
*/
|
|
public function unionSet(DisjointSetNode $nodeX, DisjointSetNode $nodeY): void
|
|
{
|
|
$rootX = $this->findSet($nodeX);
|
|
$rootY = $this->findSet($nodeY);
|
|
|
|
if ($rootX === $rootY) {
|
|
return; // They are already in the same set
|
|
}
|
|
|
|
// Union by rank: attach the smaller tree under the larger tree
|
|
if ($rootX->rank > $rootY->rank) {
|
|
$rootY->parent = $rootX;
|
|
} else {
|
|
$rootX->parent = $rootY;
|
|
if ($rootX->rank === $rootY->rank) {
|
|
$rootY->rank += 1;
|
|
}
|
|
}
|
|
}
|
|
}
|