59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
/*
 | 
						|
 * DSFVector.cpp
 | 
						|
 *
 | 
						|
 *   Created on: Jun 25, 2010
 | 
						|
 *       Author: nikai
 | 
						|
 *  Description: a faster implementation for DSF, which uses vector rather than btree.
 | 
						|
 *               As a result, the size of the forest is prefixed.
 | 
						|
 */
 | 
						|
 | 
						|
#include <gtsam/base/DSFVector.h>
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
namespace gtsam {
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	DSFVector::DSFVector (const size_t numNodes) {
 | 
						|
		resize(numNodes);
 | 
						|
		int index = 0;
 | 
						|
		for(iterator it = begin(); it!=end(); it++, index++)
 | 
						|
			*it = index;
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	size_t DSFVector::findSet(const size_t& key) const {
 | 
						|
		size_t parent = at(key);
 | 
						|
		return parent == key ? key : findSet(parent);
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	std::set<size_t> DSFVector::set(const std::size_t& label) const {
 | 
						|
		std::set<size_t> set;
 | 
						|
		size_t key = 0;
 | 
						|
		std::vector<std::size_t>::const_iterator it = begin();
 | 
						|
		for (; it != end(); it++, key++) {
 | 
						|
			if (*it == label || findSet(*it) == label)
 | 
						|
				set.insert(key);
 | 
						|
		}
 | 
						|
		return set;
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	void DSFVector::makeUnionInPlace(const std::size_t& i1, const std::size_t& i2)  {
 | 
						|
		at(findSet(i2)) = findSet(i1);
 | 
						|
	}
 | 
						|
 | 
						|
	/* ************************************************************************* */
 | 
						|
	std::map<size_t, std::set<size_t> > DSFVector::sets() const {
 | 
						|
		std::map<size_t, std::set<size_t> > sets;
 | 
						|
		size_t key = 0;
 | 
						|
		std::vector<std::size_t>::const_iterator it = begin();
 | 
						|
		for (; it != end(); it++, key++) {
 | 
						|
			sets[findSet(*it)].insert(key);
 | 
						|
		}
 | 
						|
		return sets;
 | 
						|
	}
 | 
						|
 | 
						|
}
 |