【问题标题】:Keeping track of word frequency using a binary tree使用二叉树跟踪词频
【发布时间】:2012-04-08 21:15:27
【问题描述】:

我目前正在学习二叉树和二叉搜索树,我正在进行的一项练习涉及读取文本文件,将每个单词按字母顺序存储在二叉树中,并使用不同的方法遍历树。 以下是具体规格:

读入文本并构建一个包含文本中所有单词的二叉搜索树(按字母顺序),存储单词并记录单词的频率(每个单词在文本中出现的次数)一个节点,并执行类中提到的树遍历。

我的问题是,当我将单词添加到树中时,如何跟踪它的频率?我们从来没有在课堂上讨论过相同的节点,所以我被困在这里。任何建议表示赞赏!

【问题讨论】:

    标签: java binary-tree word-frequency


    【解决方案1】:

    简单。二叉树节点将由两个元素组成,一个是字符串(比如键),另一个是整数计数(比如值)。添加元素时检查它是否已经存在,如果是,则简单地增加计数,否则将元素添加为计数为 1 的新二叉树节点。

    【讨论】:

      【解决方案2】:

      棘手的家庭作业问题...

      因此,您的节点显然会包含它所代表的单词。当您插入一个新词时,您会创建节点,但在此之前,您会搜索该词。如果您的树中已经存在该单词的节点,只需检索该节点并在其中增加一个计数器。

      public class MyNode
      {
         String word;
         Integer counter;
      }
      

      明白了吗? :)

      【讨论】:

        【解决方案3】:

        当我将单词添加到 树

        1) 除了TreeNodedata leftright 成员之外,添加另一个成员count 并在每次尝试在树中添加现有单词时加1。

        2) 您可以使用单独的哈希表来保存单词和出现的映射。如果单词存在于哈希表中,只需增加计数。如果它不存在,则将其添加到树中。由于哈希表,这需要额外的空间

        【讨论】:

          【解决方案4】:

          使用 HashMap,用 String、Integer 填充。遍历文本中的单词,如果尚未添加,则将其放入 Integer(occurrence) == 1 的地图中。如果之前添加过,则将 Integer 增加 1。

          处理完所有文本后,您可以例如用 String 和 Integer 的对象填充列表,根据它们的 compareTo 方法对它们进行排序。

          【讨论】:

          • OP 正在学习 BST,而您正在给他一个与哈希表相关的答案?真正的哈希表是 O(1) 的平均情况,但它们不能替代树。
          【解决方案5】:

          以防万一有人需要。

          scala BST 容器的实现。

          trait BSTree[+A]
          
          case object Empty extends BSTree[Nothing]
          
          case class Node[+A](left: BSTree[A], x: A, right: BSTree[A]) extends BSTree[A]
          
          object BSTree {
          
            def insert[T](t: BSTree[T], k: T)(
              implicit ord: T => Ordered[T]
            ): BSTree[T] = t match {
              case Empty => Node(Empty, k, Empty)
              case Node(l, x, r) if k < x => Node(insert(l, k), x, r)
              case Node(l, x, r) if k == x => Node(l, k, r)
              case Node(l, x, r) => Node(l, x, insert(r, k))
            }
          
            def toList[T](t: BSTree[T]): List[T] = t match {
              case Empty => Nil
              // preorder traverse
              case Node(l, x, r) => x :: toList(l) ++ toList(r)
            }
          
            def apply[T](as: T*)(implicit ord: T => Ordered[T]): BSTree[T] = as.foldLeft(
              Empty: BSTree[T])((t, e) => insert(t, e))
          }
          
          object Main extends App {
              case class WordCount(c: Char, var count: Int) {
              override def toString: String = s"'$c' -> $count"
            }
          
            implicit def wordCountConvert(x: WordCount): Ordered[WordCount] =
              (that: WordCount) => if (x.c.<(that.c)) -1
              else if (x.c == that.c) {
                that.count = x.count + 1
                0
              } else 1
          
            val content = "Scala Cool!"
            val wordCountTree = BSTree(content.filter(_.isLetter).map(WordCount(_, 1)): _*)
            println(BSTree.toList(wordCountTree))
          }
          

          并在此处输出

          List('S' -> 1, 'C' -> 1, 'c' -> 1, 'a' -> 2, 'a' -> 1, 'l' -> 2, 'o' -> 2, 'l' -> 1, 'o' -> 1)
          

          参见示例here

          【讨论】:

            猜你喜欢
            • 2015-08-02
            • 1970-01-01
            • 1970-01-01
            • 2015-06-10
            • 2011-05-25
            • 1970-01-01
            • 1970-01-01
            • 2010-12-14
            • 1970-01-01
            相关资源
            最近更新 更多