【问题标题】:Change binary search tree to balance改变二叉搜索树平衡
【发布时间】:2018-05-23 05:53:49
【问题描述】:

我刚刚学会了如何创建一个二进制搜索数据结构,它将用于存储字典中的数千个单词。我遇到的问题是计算添加和删除数据需要很长时间。通常 199263 毫秒或 200 秒计算 100000 个单词。有人告诉我,拥有一棵可以自我平衡的树将提高效率并使操作更快。

我的问题是如何使我的树自动平衡以使其高效。通过消除重复的单词使树的高度更短,我做了一些小的改进。

如果有人可以就如何使树高效以及如何在 java 中实现平衡树给我建议。

【问题讨论】:

  • 我看到了两种主要的方法:A. 每次添加元素时自我平衡,或 B. 经常将树重新制作为平衡
  • Self-balancing binary search tree。这可能非常复杂。
  • 到目前为止,是否有任何答案回答了您的问题?如果是这样,请接受最有帮助的答案。
  • Java TreeSet 或 TreeMap 已经使用了平衡的二进制 AVL tree
  • 普通二叉树的一个问题是:当按顺序写入文件时,下次从这样的有序文件中读取实际上会创建列表,即只有左分支或右分支的树。

标签: java tree binary-tree binary-search-tree


【解决方案1】:

为了平衡二叉树,构建一个新的可能更容易,以更好的顺序添加元素

BinaryTree balance(BinaryTree tree)
{
    BinaryTree out = new BinaryTree();
    String[] values = tree.toArray(); //a sorted array
    for(int i = Integer.highestOneBit(values.length); i > 0; i >>= 1)
        for(int j = i; j <= values.length; j += i)
            out.add(values[j - 1]);
    return out;
}

由此延伸,如果读入的单词不需要立即放入树中排序,Arrays.sort(Object[]) 可能会更快

List<String> wordList = new LinkedList<String>();
BufferedReader reader = [...];
for(String line = reader.readLine(); line != null; line = reader.readLine())
    wordList.add(line);
String[] words = wordList.toArray(new String[0]);
Arrays.sort(words);
BinaryTree tree = new BinaryTree();
for(int i = Integer.highestOneBit(words.length); i > 0; i >>= 1)
    for(int j = i; j <= words.length; j += i)
        out.add(words[j - 1]);

根据您实际使用此数据的目的(只是一个查找表?),改用 HashSet 可能会更快

Set<String> dict = new HashSet<String>();
BufferedReader reader = [...];
for(String line = reader.readLine(); line != null; line = reader.readLine())
    dict.add(line);

【讨论】:

    【解决方案2】:

    您应该研究红/黑树,它们是自我平衡的。除了元素之外,节点还存储颜色,每次修改树时,您都会重新平衡树,使其符合红/黑树的属性:

    (来自Wikipedia:)

    1. 每个节点不是红色就是黑色。

    2. 根是黑色的。

    3. 所有叶子 (NIL) 都是黑色的。

    4. 如果一个节点是红色的,那么它的两个子节点都是黑色的。

    5. 从给定节点到其任何后代 NIL 节点的每条路径 包含相同数量的黑色节点。

    要开始实现红黑树,我建议查看 github 上的 this example implementation,并阅读红黑树的this explanation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 2013-12-18
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多