Incremental Construction of Minimal Acyclic Finite-State Automata

Nov 22, 2013 12:16

Упрощение... пока не последнее. А так почти наигрался ж) Ещё немного раздумий про суфиксный ДАГ и всё....



http://vk.com/doc10874142_242547033

--- на закуску. Add() без предварительной Split процедуры:


void Add(const char *txt)
{
Add(root,txt,false);
}

void Merge(State *st,State *st1,char sym)
{
State *st2=reg.Get(st1);
if(st2) {
SetLink(st,sym,st2);
reg.Del(st1);
DelState(st1);
}
}

State *Add2(State *st,const char *txt,bool dup)
{
char sym=*txt++;
reg.Del(st);
if(sym) {
State *s=st->get(sym);
if(s) {
if(s->in>1) dup=true;
if(dup) s=DupState(s);
} else s=NewState();
s=Add2(s,txt,dup);
SetLink(st,sym,s);
Merge(st,s,sym);
} else st->fin=true;
return reg.Add(st);
}

Previous post Next post
Up