Skip to content
Snippets Groups Projects
Commit 3edb1960 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

subtree jump table for PrefixRankedTree

parent be25da0d
No related branches found
No related tags found
No related merge requests found
......@@ -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 */
 
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment