Java 如何打印出二进制搜索树中第n个最频繁的单词?

Java 如何打印出二进制搜索树中第n个最频繁的单词?,java,algorithm,tree,binary-tree,binary-search-tree,Java,Algorithm,Tree,Binary Tree,Binary Search Tree,这涉及到一个软件算法 我目前正在编写一个单词计数器字典程序。为了存储不同的字数,我使用了一个二进制搜索,以单词作为关键字,频率作为值 这是我的二叉搜索树类 public class BinarySearchTree<AnyKey extends Comparable<? super AnyKey>, AnyValue> implements MyTreeMap<AnyKey, AnyValue>{ protected Bin

这涉及到一个软件算法

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

这是我的二叉搜索树类

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;
      }
它将根据频率打印出第n个最频繁的单词。我有一个如何在psuedo代码中实现这一点的想法。 1.创建一个集合来保存节点 2.将树中的所有节点添加到此集合 3.根据计数对集合进行排序 4.迭代排序的集合并打印出第n个最频繁的集合


这是解决这个问题的最好方法吗?我担心创建一个单独的集合可能过于昂贵,而且排序在计算上也会非常昂贵。

您描述的方法也非常好。当你需要把一个插入新单词添加到一个插入到树中的一个FRO中时,这将是复杂的,它将把Ologn和排序列表放在WestTobe上,然后再搜索。p> 为了获得比搜索第n个频繁节点和插入一个方法更好的性能,将创建一个更频繁的BST。因此,在这两个树中插入一个新节点都将采用Ologn和搜索Ologn

在上述方法中,数据具有冗余性,即第二棵树将同时具有单词和频率。因此,为了避免在第二个BST中出现这种情况,只需在第一个BST中输入频率和对单词节点的引用,就可以在任何时间点从一棵树跳到另一棵树。

解决方案如下:

初始化按节点字频排序的树集结果。 将树中的前n个元素添加到集合中。 遍历其余元素,用较高的值替换集合中的最低值。如果当前>result.lower,则result.pollFirst;result.addcurrent 这限制了空间成本,应该更快,因为大多数元素可以直接跳过


但是,请注意,除非您处理的是大型阵列,并且已经跟踪到该函数的速度变慢,否则您的解决方案的简单性使其成为更好的选择。

您是否考虑过在主树中使用树形图?@AdrianLeonhard是的,但正在尝试实现我自己的数据结构,不要使用内置java。如何确定树的前n个元素?@CommittedDroider我指的是在二元搜索树中迭代时的前n个元素。它们是哪一个并不重要,关键是要填充集合。按树集合排序的集合?您是否需要在节点类中有一个比较对象来支持元素的比较?@committedandroider树集合可以工作,是的。您不一定需要compareTo方法,您可以实现一个Comparator并将其传递给TreeSet的构造函数。我只打算在插入所有内容后调用它,这样您就可以查看所有字数。它仍然很复杂吗?如果搜索元素是键而不是它的值,则BST很有用。在您的情况下,搜索元素是Value。因此,在这里,当考虑到值时,BST是没有用的。因此,要么创建另一个以值为键的BST,要么您的方法也很好,即按其值对节点进行排序如果我要使用另一个BST方法,我将在哪里保存该树?
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) {

}