2011-06-26 112 views
1

我正在使用C#实现B +树。现在据我所知,一个树节点应该保存一些(order-1)键,并且指向记录或其他节点的指针数量,也就是说,只有叶节点会保存实际指向记录的指针,并且内部节点将保存指向其他节点的指针。C#通用B +树

我正在与该实现遇到的问题是与C#泛型

节点类被声明为:

class Node< K,V > 
{ 
    K [] keys ; 
    V [] values; 
} 

现在,当我尝试将节点放入值数组作为这样

_root.Values[0] = left ; // left being of type Node<K,V> 

我收到以下错误:

Cannot implicitly convert type 'BTree_Library.Node' to 'V'

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

所以,结论是:

  1. 在C我会用:(void* values;) 我正在寻找的,在C#中的等价。

  2. 虽然我们在这个问题上,我是否正确理解B +树结构 参考节点和记录是否可以互换节点指针?

+0

使用列表而不是阵列 - 你将无法将项目添加到阵列。 –

+0

@Martin,这就是B树的要点,每个节点都有一个不断计数的键和值,但其中一些可以是空的。 – svick

回答

3

您希望您的叶节点和内部节点的行为不同,同时仍可以将它们都称为节点。这说明一个继承层次:

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>),并且工作得很好。

+0

10X,这是使用继承 我所做的最终使用对象是个好主意,虐待尝试,现在改变你的建议。 我做一类项目巫婆需要我创造我自己的DBMS 我想保持一个CSV文件中的记录,但没有得到该部分呢,首先我要创造我自己的B +树(也为我自己的丰富),我会标记你的答案,但我没有得到它的说唱,欣赏帮助。 –

1

假设_root.Values[0] = left被从类中执行的,并且Values相当于values的性质。

,如果V将永远是一个类型的Node,你可以尝试像

interface INode { 
} 

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

} 

这将迫使V2从BTree_Library.Node推导,这将使该行没有任何错误编译。

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

+0

它应该是其中V:节点

+0

我认为仿制药正是这里的正确途径。你还会推荐什么? – svick

+0

我发现我在树类,并在节点 类 类节点< K,V >加入约束的溶液,其中V:类类B树< K,V >其中V:类 在主我声明 B树<整型,对象>树=新BTree (3); –