Crate general_sam
source ·Expand description
This crate provides an implementation of a general suffix automaton.
flowchart LR
init((ε))
a((a))
b((b))
ab((ab))
bc(((bc)))
abc((abc))
abcb((abcb))
abcbc(((abcbc)))
init -- a --> a
init -- b --> b
a -- b --> ab
b -- c --> bc
init -- c --> bc
ab -- c --> abc
bc -- b --> abcb
abc -- b --> abcb
abcb -- c --> abcbc
The suffix automaton of abcbc.
Examples
use general_sam::sam::GeneralSAM;
let sam = GeneralSAM::construct_from_bytes("abcbc");
// => GeneralSAM<u8>
// "cbc" is a suffix of "abcbc"
assert!(sam.get_root_state().feed_bytes("cbc").is_accepting());
// "bcb" is not a suffix of "abcbc"
assert!(!sam.get_root_state().feed_bytes("bcb").is_accepting());use general_sam::sam::GeneralSAM;
let sam = GeneralSAM::construct_from_chars("abcbc".chars());
// => GeneralSAM<char>
let state = sam.get_root_state();
// "b" is not a suffix but at least a substring of "abcbc"
let state = state.feed_chars("b");
assert!(!state.is_accepting());
// "bc" is a suffix of "abcbc"
let state = state.feed_chars("c");
assert!(state.is_accepting());
// "bcbc" is a suffix of "abcbc"
let state = state.feed_chars("bc");
assert!(state.is_accepting());
// "bcbcbc" is not a substring, much less a suffix of "abcbc"
let state = state.feed_chars("bc");
assert!(!state.is_accepting() && state.is_nil());use general_sam::{sam::GeneralSAM, trie::Trie};
let mut trie = Trie::default();
trie.insert_iter("hello".chars());
trie.insert_iter("Chielo".chars());
let sam: GeneralSAM<char> = GeneralSAM::construct_from_trie(trie.get_root_state());
assert!(sam.get_root_state().feed_chars("lo").is_accepting());
assert!(sam.get_root_state().feed_chars("ello").is_accepting());
assert!(sam.get_root_state().feed_chars("elo").is_accepting());
assert!(!sam.get_root_state().feed_chars("el").is_accepting());
assert!(!sam.get_root_state().feed_chars("el").is_nil());
assert!(!sam.get_root_state().feed_chars("bye").is_accepting());
assert!(sam.get_root_state().feed_chars("bye").is_nil());References
Re-exports
pub use sam::GeneralSAM;pub use sam::GeneralSAMNode;pub use sam::GeneralSAMNodeID;pub use sam::GeneralSAMState;pub use sam::SAM_NIL_NODE_ID;pub use sam::SAM_ROOT_NODE_ID;pub use trie_alike::IterAsChain;pub use trie_alike::TravelEvent;pub use trie_alike::TrieNodeAlike;pub use trie::Trie;pub use trie::TrieNode;pub use trie::TrieNodeID;pub use trie::TrieState;pub use trie::TRIE_NIL_NODE_ID;pub use trie::TRIE_ROOT_NODE_ID;
Modules
- A general suffix automaton implementation.
- trie
trieA simple implementation of tries with support ofTrieNodeAlike. - A trait for constructing
GeneralSAMfrom structures like tries and some other utilities to implement the trait for iterators.