From 3edb19605f0703cc6e51b82ee197b4ef0b183e3e Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sun, 27 Sep 2015 21:42:21 +0200 Subject: [PATCH] subtree jump table for PrefixRankedTree --- .../src/arbology/exact/SubtreeJumpTable.cpp | 36 +++++++++++++++++-- .../src/arbology/exact/SubtreeJumpTable.h | 3 ++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp index d6b5fc604a..39996c9abb 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 37e588c874..526a22d710 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; -- GitLab