66 lines
1.5 KiB
C
66 lines
1.5 KiB
C
|
/* ----------------------------------------------------------------------------
|
||
|
|
||
|
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
|
||
|
* Atlanta, Georgia 30332-0415
|
||
|
* All Rights Reserved
|
||
|
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
|
||
|
|
||
|
* See LICENSE for the license information
|
||
|
|
||
|
* -------------------------------------------------------------------------- */
|
||
|
|
||
|
/**
|
||
|
* @file DSFMap.h
|
||
|
* @date Oct 26, 2013
|
||
|
* @author Frank Dellaert
|
||
|
* @brief Allow for arbitrary type in DSF
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <map>
|
||
|
|
||
|
namespace gtsam {
|
||
|
|
||
|
/**
|
||
|
* Disjoint set forest using an STL map data structure underneath
|
||
|
* Uses rank compression but not union by rank :-(
|
||
|
* @addtogroup base
|
||
|
*/
|
||
|
template<class KEY>
|
||
|
class DSFMap {
|
||
|
|
||
|
/// We store the forest in an STL map
|
||
|
typedef std::map<KEY, KEY> Map;
|
||
|
mutable Map parent_;
|
||
|
|
||
|
public:
|
||
|
/// constructor
|
||
|
DSFMap() {}
|
||
|
|
||
|
/// find the label of the set in which {key} lives
|
||
|
KEY find(const KEY& key) const {
|
||
|
typename Map::const_iterator it = parent_.find(key);
|
||
|
// if key does not exist, create and return itself
|
||
|
if (it==parent_.end()) {
|
||
|
parent_[key] = key;
|
||
|
return key;
|
||
|
} else {
|
||
|
// follow parent pointers until we reach set representative
|
||
|
KEY parent = it->second;
|
||
|
if (parent != key)
|
||
|
parent = find(parent); // not yet, recurse!
|
||
|
parent_[key] = parent; // path compression
|
||
|
return parent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// Merge two sets
|
||
|
void merge(const KEY& i1, const KEY& i2) {
|
||
|
parent_[find(i2)] = find(i1);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
}
|