首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何表示B-tree节点?

如何表示B-tree节点?
EN

Stack Overflow用户
提问于 2012-02-04 01:37:34
回答 3查看 11.1K关注 0票数 12

我们在课堂上学习B树,并被要求在代码中实现它们。老师把编程语言的选择留给了我们,我想尝试用C#来做。我的问题是下面的结构在C#中是非法的,

代码语言:javascript
复制
unsafe struct BtreeNode
        {
            int key_num;        // The number of keys in a node
            int[] key;          // Array of keys
            bool leaf;          // Is it a leaf node or not?
            BtreeNode*[] c;     // Pointers to next nodes
        }

具体来说,不允许创建指向结构本身的指针。有没有什么变通或者替代的方法我可以使用?我相当确定在托管代码中一定有办法做到这一点,但我不能确定。

编辑:Eric的回答给我指明了正确的方向。这是我最终使用的方法,

代码语言:javascript
复制
class BtreeNode
{
        public List<BtreeNode> children;       // The child nodes
        public static int MinDeg;               // The Minimum Degree of the tree
        public bool IsLeaf { get; set; }        // Is the current node a leaf or not?
        public List<int> key;                   // The list of keys 
...
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-04 02:06:56

巧合的是,我刚刚在C#中为一个个人项目实现了一个btree。这很有趣。我构建了一个按字典顺序排列的可变大小(最多64字节)键的btree,这带来了许多挑战,特别是在找出存储页面太满或太空的时候。

我的建议是,构建一个抽象层,只捕获最抽象形式的btree算法,作为一个抽象基类。在获取了该表单中捕获的所有btree规则后,我以几种不同的方式指定了基类:作为常规的固定密钥大小为2-3的btree,作为我奇特的可变大小密钥btree之一,等等。

首先,在任何情况下,你都不应该使用指针。不安全的代码很少是必要的,也从来都不容易。只有最高级的C#程序员才应该关闭安全系统;当你这样做的时候,你是在对程序的类型和内存安全负责。如果你不愿意这样做,就让安全系统打开。

其次,没有理由让它成为一个结构。在C#中,结构是按值复制的;btree节点不是值。

第三,您不需要在节点中保留键的数量;键的数组知道其中有多少键。

第四,我会使用List<T>而不是数组;它们更灵活。

第五,您需要决定键是位于节点中还是位于父节点中。任何一种方式都可以工作;我的首选是键位于节点中,因为我认为键与节点相关联。

第六,知道btree节点是否是根节点很有帮助;您可以考虑使用两个bool,一个是“这是叶吗?”还有一个“这是根吗?”当然,只有一项的btree只有一个节点,既是叶节点又是根节点。

第七,您可能会将这个东西构建为可变的;通常情况下,不会在C#类上创建公共可变字段。您可以考虑将它们设置为属性。此外,子列表可以增大和缩小,但其标识不会更改,因此应将其设置为参照只读:

因此,我可能会将我的基本节点构造为:

代码语言:javascript
复制
class Node
{
    public int Key { get; set; }
    public bool IsRoot { get; set; }
    public bool IsLeaf { get; set; }
    private List<Node> children = new List<Node>();
    public List<Node> Children { get { return this.children; } }
}

讲得通?

票数 29
EN

Stack Overflow用户

发布于 2012-02-04 01:39:36

使用类而不是结构。然后抛出指针。

代码语言:javascript
复制
class BtreeNode
{
    int key_num;        // The number of keys in a node
    int[] key;          // Array of keys
    bool leaf;          // Is it a leaf node or not?
    BtreeNode[] c;      // Pointers to next nodes
}

当您声明一个类类型的变量时,它隐式地是一个引用(非常类似于c中的指针),因为每个类都是一个引用类型。

票数 14
EN

Stack Overflow用户

发布于 2012-02-04 01:40:38

你只需要意识到C中的指针与C#中的引用“有些相似”。(有各种不同之处,但出于本问题的目的,您可以专注于相似之处。)两者都允许一定程度的间接性:值不是数据本身,它是获取数据的一种方式。

上面的等价物类似于:

代码语言:javascript
复制
class BtreeNode
{
    private int keyNumber;
    private int[] keys;
    private bool leaf;
    private BtreeNode[] subNodes;

    // Members (constructors etc)
}

(我对B树不太记得,但是如果这里的“subNode”数组对应于每个键的"keyNumber“值,那么您可能根本不需要keys变量。)

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

https://stackoverflow.com/questions/9132944

复制
相关文章

相似问题

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