【问题标题】:what's the purpose of variable val in this algo这个算法中变量 val 的目的是什么
【发布时间】:2017-01-13 06:10:41
【问题描述】:

这是来自互联网的关于 Red-Black BST Java 实现的算法。我对这个程序中名为 val 的变量感到困惑。代码如下:

package tools;
public class redBlack2 {
    private static final boolean RED   = true;
    private static final boolean BLACK = false;
    private Node root;
    public redBlack2() {}
    private class Node {
        private int key;
        private int val;
        private Node left, right;
        private boolean color;
        public Node(int key, int val, boolean color) {
            this.key = key;
            this.val = val;
            this.color = color;
        }
    }
    private boolean isRed(Node x) {
        if (x == null) return false;
        return x.color == RED;
    }
    public int get(int key) {
        return get(root, key);
    }
    private int get(Node x, int key) {
        while (x != null) {
            if      (key < x.key) x = x.left;
            else if (key > x.key) x = x.right;
            else              return x.val;
        }
        System.out.println("There is no such key.");
        return 0;
    }
    public boolean contains(int key) {
        return get(key) != 0;
    }
    public void put(int key, int val) {
        root = put(root, key, val);
        root.color = BLACK;
    }
    private Node put(Node h, int key, int val) {
        if (h == null) return new Node(key, val, RED);
        if      (key<h.key) h.left  = put(h.left,  key, val);
        else if (key>h.key) h.right = put(h.right, key, val);
        else if (key == h.key)  h.val   = val;
        if (isRed(h.right) && !isRed(h.left))      h = rotateLeft(h);
        if (isRed(h.left)  &&  isRed(h.left.left)) h = rotateRight(h);
        if (isRed(h.left)  &&  isRed(h.right))     flipColors(h);
        return h;
    }
    private Node rotateRight(Node h) {
        Node x = h.left;
        h.left = x.right;
        x.right = h;
        x.color = x.right.color;
        x.right.color = RED;
        return x;
    }
    private Node rotateLeft(Node h) {
        Node x = h.right;
        h.right = x.left;
        x.left = h;
        x.color = x.left.color;
        x.left.color = RED;
        return x;
    }
    private void flipColors(Node h) {
        h.color = !h.color;
        h.left.color = !h.left.color;
        h.right.color = !h.right.color;
    }
    public static void main(String[] args) {
        redBlack2 r = new redBlack2();
        r.put(34,1);
        r.put(23,2);
        r.put(65,3);
        r.put(73, 4);
        System.out.print(r.get(73));
    }
}

这只是我们对放入树中的数字的标记吗?那么我们不是已经有钥匙作为标记了吗?为什么我们还需要变量val

【问题讨论】:

  • 假设有人给你一本你从未见过的字典。你决定查一个词。当你找到这个词时,字典不会告诉你任何关于它的信息——没有发音,没有定义,没有任何东西,只有这个词。你不知道比以前更多(除了你知道这个词在字典里,这是一点点,但不多)。拥有一本能提供更多信息的词典不是更有用吗?这是否有助于解释 val 的用途?
  • val 存储在对put(int key, int val) 的调用中给出的值,然后由get(int key) 返回。为什么你认为key 的值与val 的值相同?如果你只是简单地按照代码来查看值的来源和使用位置,答案就是这样。
  • 同样,Java 提供 SetMap 集合。 Set 可以查找密钥并告诉您该密钥是否在集合中,但它不能告诉您更多信息。 Map 允许您提供与密钥关联的其他数据。这有助于解释吗?

标签: java algorithm binary-search-tree red-black-tree


【解决方案1】:

是的,你是对的,它就像一个标记。我们确实可以只用一个变量来实现这个算法,即key。在这个算法中,val 是被存储为我们需要跟踪的一种数据类型的东西。

例如考虑这个

您有几个编号为 34、23、65、73 的框,并且您想要 对它们执行 RB 树操作。所以盒子上的这些数字 类似于您算法中的key

现在考虑每个盒子中包含许多球。这些球 可以看作是存储在盒子内的数据,您需要 跟踪它。所以可以认为是val

您甚至可以更进一步,通过将val 的数据类型更改为ListMap 甚至用户定义的对象来跟踪框内的若干事物。它仍然会以相同的方式工作。

【讨论】:

    【解决方案2】:

    在这个实现中,这个数据结构就像Map,这意味着它将键映射到值。 valvalue 的常见缩写,这是不言自明的。它可以是 Java 中存在的任何类型,无论是原始类型还是引用类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2020-11-16
      相关资源
      最近更新 更多