QuickUnionWeighted.ixx

Quick-Union Weighted

Download source code for Visual Studio 2022 from Github
QuickUnionWeightedTest.ixx
#include "pch.h"
#include <iostream>
#include <crtdbg.h>
#include <span>
#include<tuple>



export module quickunionweightedtest;

import unionfind;
import nodes;
import utilitytest;





class QuickUnionWeightedTest : public ::testing::Test {

public:
	std::unique_ptr<UnionFind> m_unionFind;
	const int size = 10;

	virtual void SetUp() override
	{
		ZeroBasedArray zeroBasedArray;
		m_unionFind = std::make_unique <QuickUnionWeighted>(size, zeroBasedArray);
		m_unionFind->initialize();
	}

	virtual void TearDown() override
	{

	}

};


TEST_F(QuickUnionWeightedTest, testUnionWeightedUnionMultipleNodes)
{
	MemoryLeakDetector leakDetector;
	int expected[] = { 6,2,6,4,6,6,6,2,4,4 };


	for (auto nodePair : std::initializer_list<std::tuple<int, int>>{ {4,3},{3,8},{6,5},{9,4},{2,1},{5,0},{7,2},{6,1},{7,3}  })
	{
		m_unionFind->union_nodes(get<0>(nodePair), get<1>(nodePair));
	}

	const std::vector<int>& values = m_unionFind->getAllValues();
	assert_that(values, expected);


}



TEST_F(QuickUnionWeightedTest, testMultipleUnion_pathCompressionWithSinglePass_13Nodes)
{
	MemoryLeakDetector leakDetector;
	std::unique_ptr<QuickUnionWeighted> quickUnion;
	constexpr int size = 13;
	ZeroBasedArray zeroBasedArray;
	quickUnion = std::make_unique <QuickUnionWeighted>(size, zeroBasedArray);

	quickUnion->setRootpathCompressionWithSinglePass;

	std::vector<int> values = { 0, 0, 0, 1, 1, 1, 3, 3, 6, 6, 8, 9, 9 };


	quickUnion->setAllValuesmove(values);

	ASSERT_EQ( 0,	quickUnion->root(12) );

	int expected[size] = { 0, 0, 0, 1, 1, 1, 1, 3, 6, 6, 8, 9, 6 };
	const std::vector<int>& newValues = quickUnion->getAllValues();
	printAll(newValues);
	assert_that(newValues, expected);

}


QuickUnionWeighted.ixx
#include "pch.h"

export  module unionfind:quickunionweighted;

import :uf;
import :quickunion;
import nodes;

export class QuickUnionWeighted : public QuickUnion {
	Nodes m_nodeSize;
public:
	virtual ~QuickUnionWeighted() = default;

	QuickUnionWeighted(const int size, ArrayType& arrayType): QuickUnion(size, arrayType), m_nodeSize{ arrayType }
	{
		m_nodeSize.resize(size);
		m_nodeSize.fillAll(1);
	}
	
	virtual int sizeofBranch(const int i) const
	{
		return m_nodeSize.get(i);
	}


	virtual void union_nodes(const int a, const int b) override
	{
		 int i = root(a);
		 int j = root(b);
		const int newSize = sizeofBranch(i) + sizeofBranch(j);
		if (sizeofBranch(i) < sizeofBranch(j))
		{
			m_nodes.set(i, j);
			m_nodeSize.set(j, newSize );
		}
		else
		{
			m_nodes.set(j, i);
			m_nodeSize.set(i, newSize );
		}


	}
	
};