[base] Compressed MemTrie optimization.

This commit is contained in:
Yuri Gorshenin 2017-12-01 16:43:52 +03:00 committed by Vladimir Byko-Ianko
parent ccef4a9f61
commit bb81febba8
2 changed files with 17 additions and 8 deletions

View file

@ -227,7 +227,7 @@ public:
while (it != key.end())
{
bool created;
curr = &curr->GetOrCreateMove(*it, created);
curr = &curr->GetOrCreateMove(*it++, created);
auto & edge = curr->m_edge;
@ -238,9 +238,6 @@ public:
continue;
}
ASSERT(!edge.Empty(), ());
ASSERT_EQUAL(edge[0], *it, ());
size_t i = 0;
SkipEqual(edge, key.end(), i, it);
@ -261,6 +258,7 @@ public:
ASSERT(!edge.Empty(), ());
auto const next = edge[0];
edge.Drop(1);
node->Swap(*curr);
curr->AddChild(next, std::move(node));
@ -362,6 +360,8 @@ private:
return prefix;
}
void Prepend(Char c) { m_label.push_back(c); }
void Prepend(Edge const & prefix)
{
m_label.insert(m_label.end(), prefix.m_label.begin(), prefix.m_label.end());
@ -467,7 +467,7 @@ private:
{
ASSERT(it != prefix.end(), ());
cur = cur->GetMove(*it);
cur = cur->GetMove(*it++);
if (!cur)
return;
@ -502,14 +502,19 @@ private:
if (root.m_values.Empty() && root.m_moves.Size() == 1)
{
Node child;
root.m_moves.ForEach([&](Char const & /* c */, Node & node) { child.Swap(node); });
Char c;
root.m_moves.ForEach([&](Char const & mc, Node & mn) {
c = mc;
child.Swap(mn);
});
child.m_edge.Prepend(c);
child.m_edge.Prepend(root.m_edge);
root.Swap(child);
}
return;
}
auto const symbol = *cur;
auto const symbol = *cur++;
auto * child = root.GetMove(symbol);
if (!child)
@ -539,6 +544,7 @@ private:
{
auto const size = prefix.size();
auto const edge = node.m_edge.template As<String>();
prefix.push_back(c);
prefix.insert(prefix.end(), edge.begin(), edge.end());
ForEachInSubtree(node, prefix, toDo);
prefix.resize(size);

View file

@ -60,7 +60,10 @@ public:
Base::m_values = inIt.GetValues();
inIt.ForEachMove([&](Char c, InnerIterator it) {
auto const label = it.GetLabel();
Base::m_edges.emplace_back(label.begin(), label.end());
Base::m_edges.emplace_back();
auto & edge = Base::m_edges.back().m_label;
edge.push_back(c);
edge.append(label);
m_moves.push_back(it);
});
}