现在的位置: 首页 > 综合 > 正文

Using Tries 《字典树》2

2012年01月25日 ⁄ 综合 ⁄ 共 1720字 ⁄ 字号 评论关闭

编写一棵树

字典树可以有很多的方式来实现,有些可以用来在字典中查找单词的集合这些单词可能和要找的单词有一点不同,其他的实现方式可以用来查找一个和目标单词完全匹配的单词。这里字典树的实现方式将只能查找完全匹配的单词和计数有相同前缀的单词数量。这里的实现将使用伪代码,因为不同的编码者可能使用不同的编程语言

我们将写下边4个函数:

  • addWord. 这个函数将添加一个单独的单词到字典中。
  • contPreffixes. 这个函数将计算字典中和字符串前缀相同的单词的个数。
  • contWords. 这个函数将计算字典中和给定单词完全匹配的单词的数量。
  • 我们的字典树只能够支持英文字母。

我们也要写一个结构体,它的一些属性将表示这个节点所存的值。因为我们想知道匹配一个给定字符串的单词的数量,所以每个节点要有一个属性来判断这个节点表示一个单词或者一个前缀(为了简单,一个完整的单词也被视为一个前缀)和有多少个单词在这个字典中包含了这个前缀(在字典中有可能重复的单词)。这个任务可以用一个整数属性值来解决。

因为我们想知道有多少单词有给定前缀字符串,我们需要另一个整数属性值来记录在这个节点有多少个单词有相同的前缀。同时每个节点必须有能访问它所有可能儿子节点的(26个)。当知道了这些细节之后,我们的结构体应该有下面的一些成员:

我们也需要下边的一些函数:

首先,我们必须初始化用下边的这个函数来初始化所有的节点:

addWord函数有两个参数组成,要插入的节点和我们要添加的单词。这个函数的思想是对那个一个字符串word被加到节点vertex,我们将添加这个word到对应的节点分支去掉单词的最左边的字符。如果分支不存在,我们就应该添加它。所有的TopCoder的编程语言都可以模拟这个在常数时间内删除字符代替创建一个原始字符串或者移动其他字符的操作。

countWordscountPrefixes两个函数有一些相似。如果我们查找一个空的字符串我们只需要返回和这个节点相关联的单词或者前缀的数量。如果哦我们要查找一个非空的字符串,我们应该在树中查找一个对应的子树,但是如果这个子树不存在,那么我们就不得不返回0

抱歉!评论已关闭.