Πέμπτη 2 Ιουλίου 2026

Suffix Tree

 https://rosettacode.org/wiki/Suffix_tree#M2000_Interpreter

https://en.wikipedia.org/wiki/Suffix_tree


'https://rosettacode.org/wiki/Suffix_tree
Module Suffix_tree {
  Class SuffixTree {
  Private:
    Nodes=List
    ' Class definition which return a pointer to object
    Class Node {
      String sub
      ch=list
      {
        Read Node.sub, Node.ch
        ->(Node)
        break
      }
    }  
    module addSuffix (suf as String) {
      long n = 0, i = 0, x2, n2
      String b
      tmp=list
      While i < Len(suf)
        b=mid(suf,i+1,1)
        x2=0
        n2=0
        do
          children=.Nodes(n).ch
          if x2=len(children) Then
            n2=len(.Nodes)
            .Nodes(n2)=.Node(Mid$(suf, i+1))
            children(X2)=n2
            break ' Exit module
          End if
          n2=children(x2)
          if left(.Nodes(n2).sub,1)=b Then Exit ' Exit do
          x2++      
        Always
        sub2=.Nodes(n2).sub
        long j=0
        While j<len(sub2)      
          if mid(suf,i+1+j,1)<>mid(sub2, j+1,1) Then
            n3=n2
            n2=len(.Nodes)
            .Nodes(n2)=.Node(Left(sub2,j), List:=0:=n3)
            .Nodes(n3).sub=Mid(sub2, j+1)
            .Nodes(n).ch(X2)=n2
            Exit
          End if
          j++
        End While
        i+=j
        n=n2
      End While
    }    
  Public:
    module visualize {
      if len(.Nodes)=0 Then ? "<empty>":Exit
      visualize_f(0, "")    
      sub visualize_f(n as long, pre as string)
        Local children=.Nodes(n).ch
        if len(children)=0 Then
          ? "- "+.Nodes(n).sub
        Else
          ? "┐ "+.Nodes(n).sub
          Pr each(children, 1 , -2), "├─"
          Pr each(children, -1), "└─"
        End if
      End sub
      Sub Pr(ch, pre2 as string)
        While ch  
        ? pre + pre2;
        visualize_f(Eval(ch), pre + "│ ")
        End While
      End Sub
    }
  Class:
    module SuffixTree (Str as String) {
      if len(Str)=0 Then Error "need one character...at least"
      .Nodes(0)=.Node()
      for i=1 to len(Str)
          .addSuffix Mid(Str, i)
      next
    }
  }
  M=SuffixTree("banana$")
  M.visualize
}
Suffix_tree

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.