diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp index d6b5fc604ab9ce9d0a6e4ba7857698bbc52b22ed..39996c9abbfc770ef2101d15f79500bb58043fca 100644 --- a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp +++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp @@ -8,8 +8,8 @@ #include "SubtreeJumpTable.h" #include <exception/AlibException.h> +#include <tree/ranked/PrefixRankedTree.h> #include <tree/ranked/PrefixRankedBarTree.h> -#include <tree/ranked/PrefixRankedBarPattern.h> #include <alphabet/RankedSymbol.h> #include <map> @@ -30,6 +30,18 @@ std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarTree return res; } +auto SubtreeSizesPrefixRankedBarTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarTree > ( SubtreeJumpTable::getInstance ( ), SubtreeJumpTable::compute ); + +std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedTree & subject ) { + std::vector < int > res; + + buildDataPointers ( res, subject, 0 ); + + return res; +} + +auto SubtreeSizesPrefixRankedTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedTree > ( SubtreeJumpTable::getInstance ( ), SubtreeJumpTable::compute ); + /** * used to compute subtree jump table. * @param begin - index of a root node of a complete subtree to process @@ -49,7 +61,27 @@ int SubtreeJumpTable::buildDataPointers ( std::vector < int > & res, const tree: return index; } -auto SubtreeSizesPrefixRankedBarTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarTree > ( SubtreeJumpTable::getInstance ( ), SubtreeJumpTable::compute ); +/** + * used to compute subtree jump table. + * @param begin - index of a root node of a complete subtree to process + * @return index, increased by one, of the last node in the subtree starting at index begin + */ +int SubtreeJumpTable::buildDataPointers ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin ) { + for ( unsigned i = 0; i < subject.getContent ( ).size ( ); i++ ) + res.push_back ( 0 ); + + return buildDataPointersInternal ( res, subject, begin ); +} + +int SubtreeJumpTable::buildDataPointersInternal ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin ) { + int index = begin + 1; + + for ( unsigned i = 0; i < subject.getContent ( )[begin].getRank ( ).getData ( ); i++ ) + index = buildDataPointersInternal ( res, subject, index ); + + res[begin] = index; + return index; +} } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.h b/alib2algo/src/arbology/exact/SubtreeJumpTable.h index 37e588c8748d628ced0a3662efc383d758379c5e..526a22d71050a6be01ca17fe72cf6d5a20cab739 100644 --- a/alib2algo/src/arbology/exact/SubtreeJumpTable.h +++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.h @@ -24,8 +24,11 @@ public: static std::vector < int > compute ( const tree::RankedTreeWrapper & subject ); static std::vector < int > compute ( const tree::PrefixRankedBarTree & subject ); + static std::vector < int > compute ( const tree::PrefixRankedTree & subject ); static int buildDataPointers ( std::vector < int > & res, const tree::PrefixRankedBarTree & subject, int begin ); + static int buildDataPointers ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin ); + static int buildDataPointersInternal ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin ); static SubtreeJumpTable & getInstance ( ) { static SubtreeJumpTable res;