繁体   English   中英

如何在二叉搜索树中打印出第n个最常用的单词?

[英]How to print out the nth most frequent words in a binary search tree?

这涉及“软件算法” https://stackoverflow.com/help/on-topic

我目前正在写一个单词计数字典程序。 为了存储不同的字数,我使用二进制搜索三,以字为键,频率为值。

这是我的二进制搜索树类

public class BinarySearchTree<AnyKey extends Comparable<? super AnyKey>, AnyValue>
    implements MyTreeMap<AnyKey, AnyValue>{
              protected BinaryNode<AnyKey, AnyValue> root;
              protected BinaryNode<AnyKey, AnyValue> insert(AnyKey x, 
                      AnyValue y, BinaryNode<AnyKey, AnyValue> t ){
                    if( t == null )
                         t = new BinaryNode<AnyKey, AnyValue>(x, y );
                   else if( x.compareTo( t.element ) < 0 )
                         t.left = insert( x, y, t.left );
                  else if( x.compareTo( t.element ) > 0 )
                        t.right = insert( x, y, t.right );
                 else
                          throw new IllegalArgumentException( x.toString( ) );  
                return t;
      }

这是我的节点类

class BinaryNode<AnyKey, AnyValue> {
      BinaryNode( AnyKey theElement, AnyValue theValue ){
          element = theElement;
          value = theValue;
          left = right = null;
       }
       AnyKey             element; 
       AnyValue    value;
        BinaryNode<AnyKey, AnyValue> left;    
       BinaryNode<AnyKey, AnyValue> right;  
     }

我想在我的二进制搜索树中编写这个方法

@Override
public void PrintMostFrequent(int n) {

}

它将根据频率打印出第n个最常用的单词。 我知道如何在伪代码中执行此操作。
1.创建一个用于保存节点的集合
2.将树中的所有节点添加到此集合中
3.根据计数对集合进行排序
4.迭代排序的集合并打印出最常见的第n个。

这是解决此问题的最佳方法/编写此方法吗? 我担心创建一个单独的集合可能是非常昂贵的,并且排序在计算上也是昂贵的。

你的方法描述也非常好。 当你考虑需要在插入到树中的一个插入新单词时将是复杂的,这将采用O(logn)并且在最坏情况下在排序列表O(n)上然后再次搜索O(n)。

为了比搜索第n个频繁节点更好的性能,插入一个方法将创建一个BST但具有频率。 因此,在两个树中插入新节点将采用O(logn)并搜索O(logn)。

在上面的方法中,您有数据冗余,即第二棵树将具有单词和频率。 因此,为了避免你可以做的是在第二个BST中,只需将频率和一个引用放在第一个BST中的单词的节点,这样你就可以在任何时间点从一棵树跳到另一棵树。

解决方案是:

  1. 初始化按节点字频率排序的TreeSet<Node> result
  2. 将树中的前n个元素添加到集合中。
  3. 迭代其余元素,用更高的值替换集合中的最低值。 if current > result.lowest() then result.pollFirst(); result.add(current)

这有限的空间成本,应该更快,因为大多数元素可以直接跳过。

但请注意,除非您正在处理大型数组并且已经跟踪此功能的减速,否则您的解决方案的简单性使其成为更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM