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