首页
学习
活动
专区
圈层
工具
发布

C#属B+tree
EN

Stack Overflow用户
提问于 2011-06-26 15:43:29
回答 2查看 1.2K关注 0票数 1

我正在使用B+tree实现C#。

现在,据我所知,树节点应该包含许多(order - 1)键,以及指向记录或其他节点的指针的顺序数,也就是说,只有叶节点才能保存到记录的实际指针,而内部节点将保存指向其他节点的指针。

这个实现的问题在于C#泛型

Node类声明为:

代码语言:javascript
复制
class Node< K,V >
{
    K [] keys ;
    V [] values;
}

现在,当我尝试将一个节点放入值数组中时,

代码语言:javascript
复制
_root.Values[0] = left ; // left being of type Node<K,V> 

我得到以下错误:

不能隐式地将'BTree_Library.Node‘转换为'V’

因此,我试图找到一种解决这一问题的方法,另一种选择是更改实现,以保存一个节点数组和一个记录数组。

因此,结论是:

  1. In C I将使用:( void* values; ),我在寻找与C#中的类似的内容。在我们讨论这个主题时,我是否正确地理解了节点和记录对于节点指针可互换的B+tree结构?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-26 16:22:41

您希望您的叶节点和内部节点的行为有所不同,同时仍然能够将它们称为节点。它描述继承层次结构:

代码语言:javascript
复制
abstract class Node<K, V>
{
    public K[] Keys { get; protected set; }
}

class LeafNode<K, V> : Node<K, V>
{
    public V[] Values { get; protected set; }
}

class InnerNode<K, V> : Node<K, V>
{
    public Node<K, V> Children { get; protected set; }
}

另一种选择是使用C#等效的void*,即object,但这意味着代码不再是类型安全的,您必须在任何地方都进行强制转换。我不建议这么做。

话虽如此,你为什么要创建自己的B树呢?只有当数据保存在磁盘上,而不是在内存中时,它才有用。如果您这样做只是为了拥有关联数组,那么.Net中有一些类已经实现了它(比如Dictionary<K,V>SortedDictionary<K,V>),并且工作非常好。

票数 3
EN

Stack Overflow用户

发布于 2011-06-26 15:48:30

假设_root.Values[0] = left是从类中执行的,并且Values是一个等价于values的属性。

如果V始终是Node的一种类型,您可以尝试如下

代码语言:javascript
复制
interface INode {
}

class Node<K, V> : INode where V : INode {

}

这将迫使V从BTree_Library.Node派生,这将允许该行编译而不会出现任何错误。

如果V不会总是从Node派生出来,那么我认为泛型可能是解决这个问题的错误方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6484940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档