【问题标题】:Is it necessary to implement a BST with both keys and values?是否有必要使用键和值来实现 BST?
【发布时间】:2010-01-20 01:46:57
【问题描述】:

是否有必要同时使用键和值来实现BST?我可以实现一个具有如下方法调用的 BST,其中它将根据 V 值在每个节点上进行遍历是应该去左节点还是右节点的比较:

public class BST<V>
{
    public void Insert(V value)
    {
        //implementation
    }

    public V Remove(V value)
    {
        //implementation
    }

    //other methods
}

或者,我可以实现BST,使其具有如下方法调用,其中K键是比较确定是遍历左节点还是右节点:

public class BST<K key, V value>
{
    public void Insert(K key, V value)
    {
        //implementation
    }

    //which of the following would then be the appropriate method signature?
    public V Remove(K key)
    {
        //implementation
    }
    //or?
    public V Remove(V Value)
    {
        //implementation
    }

    //other methods
}

【问题讨论】:

    标签: c# generics binary-tree binary-search


    【解决方案1】:

    不使用键而只使用值就可以了。但是,如果您这样做,树将变得不可变。修改一个值不再安全,因为它会使树不平衡。您必须通过仅提供节点值的属性获取器来强制执行此操作。

    【讨论】:

    • 鉴于此,您会推荐包含键和值的通用 BST 解决方案吗?
    • 非常肯定,是的。这就是 System.Collection 类的工作方式。
    • 您确定您没有考虑 IDictionary 口味吗? .NET 中的 ICollection 接口实现不提供修改元素的直接访问,而 IDictionary 提供基于索引/键的访问。就项目访问而言,ICollection 仅提供添加和删除。
    【解决方案2】:

    如果它是通用数据结构,我建议使用基于键值的 API(因为您事先不知道键和值之间的关系)和对 TKey 的 IComparable 约束。如果是特定于用例的实现,其中键也是值(例如,BST 用于确定它是否包含指定的键),我建议使用基于键的 API。

    【讨论】:

    • 如果将其开发为通用用途,那么不开发键/值关系是否有意义,以便通用类型可以指定 KeyValuePair ?
    • 但是 KeyValuePair 没有提供明确的方法来比较它所持有的键(它对键没有任何限制)或对本身(KeyValuePair 没有实现 IComparable)。当然,您可以使用 Comparer.Default 之类的东西,但这仍然使 API 变得模糊,因为很难说如何比较对。
    【解决方案3】:

    这取决于您实际需要什么。如果您需要关联数据结构,则必须实现基于键值的实现。否则,如果您只是将元素放入已排序的集合中,我认为不需要为每个元素设置单独的键。只需确保所有元素都实现 Comparable,或者您可以传递自定义 Comparator 实现(如在 TreeSet/TreeMap 中),或任何明确定义的具有 BST 元素的total ordering 的方案。

    【讨论】:

      【解决方案4】:

      不,需要键才能运行的数据结构不需要其他任何东西。这仅取决于您要如何实现它。大多数时候使用基于键值对的系统是最方便的,但在某些实现中,您可能希望让数据结构的用户指定一个比较函数,并让每个节点存储一个“值”(一个用户定义类的实例)。此类可能包含密钥等内容,但您不必知道类的格式,因为用户指定的比较函数会处理所有事情。

      我能想到的一个例子是in the Windows kernel

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多