<div dir="ltr">Hi all, I am trying to get a suffix tree from a string. I use three classes, Node, Edge, SuffixTree. I have two questions when implementing:<div><br><div>【1】</div><div>
<p class="">>>> a = Edge(1,2,3,4)</p>
<p class="">>>> a.length</p>
<p class="">1</p></div><div>if I remove '@property' in my code, it returns as below:</div><div>
<p class="">>>> a = Edge(1,2,3,4)</p>
<p class="">>>> a.length</p>
<p class=""><bound method Edge.length></p><p class="">>>> a.length()</p><p class="">
</p><p class="">1</p><p class=""><br></p><p class=""><br></p></div><div>I don't really understand the differences w/ @property, and the differences of a.length and a.length(), could you explain?<br></div><div><br></div>
<div>【2】</div><div><br></div><div>In SuffixTree, I define two functions, _get_str_from_edge, _get_str_from_node, the latter depend on the first one (please see my code). Then I have this problem:</div><div>
<p class="">>>> a = SuffixTree('abcd')</p><p class="">>>> a._get_str_from_edge(a.edges[(0,1)])</p><p class="">
</p><p class="">'abcd$'</p><p class="">
</p><p class="">>>> a._get_str_from_node(0,1)</p><p class="">
</p><p class="">TypeError: _get_str_from_edge() takes exactly 2 arguments (3 given)<br></p><p class="">Could you tell me what's wrong here?</p><p class=""><br></p><p class=""><br></p></div><div><br></div><div>below is my code, __repr__ are removed for convenience.</div>
<div>###################################</div><div><br></div><div><br><div><div>class Node:</div><div><br></div><div> def __init__(self, parent_node):</div><div> self.suffix_node = -1 </div><div> self.parent = parent_node</div>
<div> self.children = []</div><div><br></div><div> def add_child(self, child_node_index):</div><div> self.children.append(child_node_index)</div><div><br></div><div>class Edge:</div><div><br></div><div> def __init__(self, first_char_index, last_char_index,\</div>
<div> source_node_index, dest_node_index):</div><div> self.first_char_index = first_char_index</div><div> self.last_char_index = last_char_index</div><div> self.source_node_index = source_node_index</div>
<div> self.dest_node_index = dest_node_index</div><div><br></div><div> @property</div><div> def length(self):</div><div> return self.last_char_index - self.first_char_index</div><div><br></div><div>class SuffixTree:</div>
<div><br></div><div> def __init__(self, string):</div><div> self.string = string+'$'</div><div> self.N = len(self.string) </div><div> self.nodes = []</div><div> self.num_nodes = 0</div>
<div> self.edges = {}</div><div> </div><div> #initialize two node tree</div><div><br></div><div> root = Node(-1)</div><div> root.suffix_node = -1</div><div> self._add_node(root)</div>
<div><br></div><div> leaf = Node(0)</div><div> leaf.suffix_node = 0 </div><div> self._add_node(leaf)</div><div> self.nodes[0].add_child(1)</div><div><br></div><div> edge = Edge(0, self.N, 0, 1) </div>
<div> self._add_edge(edge)</div><div><br></div><div> def _get_str_from_edge(self, edge):</div><div> return self.string[edge.first_char_index : edge.last_char_index]</div><div><br></div><div> def _get_str_from_node(self, source_node_index, dest_node_index):</div>
<div> return self._get_str_from_edge(self, self.edges[(source_node_index, \</div><div> dest_node_index)])</div><div> </div><div> </div><div> def _add_node(self, node):</div><div> self.nodes.append(node)</div>
<div> self.num_nodes += 1</div><div><br></div><div> def _add_edge(self, edge):</div><div> self.edges[(edge.source_node_index, edge.dest_node_index)] = edge</div><div> self.nodes[edge.source_node_index].add_child(edge.dest_node_index)</div>
<div> self.nodes[edge.dest_node_index].parent = edge.source_node_index</div><div><br></div><div><br></div><div><br></div><div><br></div><div> </div><div><br></div></div></div></div></div>