| Class | SubwordGraph |
| In: |
subgraph.rb
|
| Parent: | Object |
# File subgraph.rb, line 39
39: def initialize(string)
40: @autonum=0
41: @root=Node.new(nextnum)
42: create(string)
43: end
gibt den Graphen in einem Stream im dot Format aus
# File subgraph.rb, line 46
46: def print(io)
47: io.puts "Digraph myTrie { //DOTCODE
48: rankdir=LR; //DOTCODE
49: ordering=out; //DOTCODE
50: splines=true; //DOTCODE
51: "
52: seen=[]
53: @root.traverse do |node|
54: unless seen.include?(node)
55: io.puts "#{node.name}[peripheries=1]; //DOTCODE\n"
56: io.puts "#{node.name}->#{node.suf.name}[style=dashed]; //DOTCODE\n" if node.suf
57:
58: node.each do |with,to,type|
59: if type==:solid
60: io.puts "#{node.name}->#{to.name}[style=bold,weight=2.0,label=\"#{with}\"]; //DOTCODE\n"
61: else
62: io.puts "#{node.name}->#{to.name}[style=solid,label=\"#{with}\"]; //DOTCODE\n"
63: end
64: end
65: seen << node
66: end
67: end
68: io.puts "}; //DOTCODE\n"
69: end
erzeugt den Subgraphen
# File subgraph.rb, line 73
73: def create(string)
74: sink=@root
75:
76: string.each_char do |a|
77: newsink=Node.new(nextnum)
78: sink.edge(a,newsink,:solid)
79: w=sink.suf
80:
81: while w != nil && w.son(a) == nil
82: w.edge(a,newsink,:non_solid)
83: w=w.suf
84: end
85:
86: if w==nil
87: newsink.suf=@root
88: else
89: v,type=w.son(a)
90: if type==:solid
91: newsink.suf=v
92: else
93: newnode=Node.new(nextnum)
94: #copy the outgoing edges
95: v.each do |with,to,_type|
96: newnode.edge(with,to,:non_solid)
97: end
98: w.edge(a,newnode,:solid)
99: newsink.suf=newnode
100: newnode.suf=v.suf
101: v.suf=newnode
102: w=w.suf
103:
104: while w != nil && w.son(a) == [v,:non_solid]
105: w.edge(a,newnode,:non_solid)
106: w=w.suf
107: end
108: end
109: end
110: sink = newsink
111: end # each_char
112: end