繁体   English   中英

Java B + tree实现

Java B+tree implementation

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我试图在Java中实现B + tree实现,并且尝试使用Internet上的帮助。 关于这个主题,几乎没有任何帮助,但是我能够在C ++中找到这段代码,并且试图将其转换为Java。 我的问题是这是b + tree的良好实现吗?

    /*
 * C++ Program to Implement B+ Tree
 */
#include<stdio.h>
#include<conio.h>
#include<iostream>
using namespace std;
struct B+TreeNode
{
    int *data;
    B+TreeNode **child_ptr;
    bool leaf;
    int n;
}*root = NULL, *np = NULL, *x = NULL;
B+TreeNode * init()
{
    int i;
    np = new B+TreeNode;
    np->data = new int[5];
    np->child_ptr = new B+TreeNode *[6];
    np->leaf = true;
    np->n = 0;
    for (i = 0; i < 6; i++)
    {
        np->child_ptr[i] = NULL;
    }
    return np;
}
void traverse(B+TreeNode *p)
{
    cout<<endl;
    int i;
    for (i = 0; i < p->n; i++)
    {
        if (p->leaf == false)
        {
            traverse(p->child_ptr[i]);
        }
        cout << " " << p->data[i];
    } 
    if (p->leaf == false)
    {
        traverse(p->child_ptr[i]);
    }
    cout<<endl;
}
void sort(int *p, int n)
{
    int i, j, temp;
    for (i = 0; i < n; i++)
    {
        for (j = i; j <= n; j++)
        {
            if (p[i] > p[j])
            {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }
    }
}
int split_child(B+TreeNode *x, int i)
{
    int j, mid;
    B+TreeNode *np1, *np3, *y;
    np3 = init();
    np3->leaf = true;
    if (i == -1)
    {
        mid = x->data[2];
        x->data[2] = 0;
        x->n--;
        np1 = init();
        np1->leaf = false;
        x->leaf = true;
        for (j = 3; j < 5; j++)
        {
            np3->data[j - 3] = x->data[j];
            np3->child_ptr[j - 3] = x->child_ptr[j];
            np3->n++;
            x->data[j] = 0;
            x->n--;
        }
        for(j = 0; j < 6; j++)
        {
            x->child_ptr[j] = NULL;
        }
        np1->data[0] = mid;
        np1->child_ptr[np1->n] = x;
        np1->child_ptr[np1->n + 1] = np3;
        np1->n++;
        root = np1;
    }
    else
    {
        y = x->child_ptr[i];
        mid = y->data[2];
        y->data[2] = 0;
        y->n--;
        for (j = 3; j < 5; j++)
        {
            np3->data[j - 3] = y->data[j];
            np3->n++;
            y->data[j] = 0;
            y->n--;
        }
        x->child_ptr[i + 1] = y;
        x->child_ptr[i + 1] = np3; 
    }
    return mid;
}
void insert(int a)
{
    int i, temp;
    x = root;
    if (x == NULL)
    {
        root = init();
        x = root;
    }
    else
    {
        if (x->leaf == true && x->n == 5)
        {
            temp = split_child(x, -1);
            x = root;
            for (i = 0; i < (x->n); i++)
            {
                if ((a > x->data[i]) && (a < x->data[i + 1]))
                {
                    i++;
                    break;
                }
                else if (a < x->data[0])
                {
                    break;
                }
                else
                {
                    continue;
                }
            }
            x = x->child_ptr[i];
        }
        else
        {
            while (x->leaf == false)
            {
            for (i = 0; i < (x->n); i++)
            {
                if ((a > x->data[i]) && (a < x->data[i + 1]))
                {
                    i++;
                    break;
                }
                else if (a < x->data[0])
                {
                    break;
                }
                else
                {
                    continue;
                }
            }
                if ((x->child_ptr[i])->n == 5)
                {
                    temp = split_child(x, i);
                    x->data[x->n] = temp;
                    x->n++;
                    continue;
                }
                else
                {
                    x = x->child_ptr[i];
                }
            }
        }
    }
    x->data[x->n] = a;
    sort(x->data, x->n);
    x->n++;
}
int main()
{
    int i, n, t;
    cout<<"enter the no of elements to be inserted\n";
    cin>>n;
    for(i = 0; i < n; i++)
    {
        cout<<"enter the element\n";
        cin>>t;
        insert(t);
    }
    cout<<"traversal of constructed tree\n";
    traverse(root);
    getch();
}
问题暂未有回复.您可以查看右边的相关问题.
1 用Java编写的B + Tree磁盘实现

有谁知道在哪里可以找到B + Tree磁盘实现? 我经历了谷歌向前和向后,不幸的是我找不到任何明智的东西。 其他线程建议可以从sqlite,sqljet或bdb中获取树,但这些树嵌套在整个数据库中,你不能真正“只”过滤掉B + Tree。 我真的只是在寻找一个磁盘上的B + Tree .. ...

2 B + Tree节点实现

我正在为一个班级实现一个B +树。 节点目前实现如下: 当我想向叶子节点添加元素时(通过访问LeafNode-&gt; data),我得到了 我想这是因为编译器不知道我正在访问的节点是内部节点还是叶子节点,尽管我首先使用isLeafNode()来检查它。 我无法将这两个类合并 ...

3 C中的B + tree简单实现

我正在一个有趣的项目中,我需要一个使用B + Trees的简单键/值存储。 几年前,我研究了它们,说实话,我不想重新发明轮子,所以我正在寻找b + tree的C语言的简单实现,可以将其包含在我的项目中。 我知道sqlite,dbm和tokyocabinet的那些,但是对于我的需求来说它们 ...

4 B-Tree数据库实现

目前,我正在致力于提高客户端的邮政编码搜索性能。 他们的网站只是蛮力搜索xml文件。 该计划是建立一个B树以使搜索更快。 尽管我对如何正确实施此方法感到困惑。 我当前的想法是使用对象创建一个库,该对象在创建时会从xml文件构建B树。 尽管这要求每次客户访问网站时都重新构建B树。 ...

5 R-Tree实现Java

最近几天,我一直在寻找R树的稳定实现,并支持无限制的尺寸(大约20个左右就足够了)。 我只找到了这个http://sourceforge.net/projects/jsi/,但是它们仅支持2维。 另一个选择是间隔树的多维实现。 也许我对问题使用R树或Intervall树的想法完全错 ...

6 比较B + tree实现:将内部节点存储在磁盘上

是否有将B + tree的内部节点也存储在磁盘上的实现方式? 我只是想知道是否有人知道这样的实现或看到这样做的真正优势? 通常,将叶子节点存储在磁盘上,并根据需要开发B +树。 但是也可以保存B + tree内部节点的当前状态(通过将指针替换为其指向的磁盘块号):我看到了其他挑战,例如 ...

7 c#中基于文件系统的B + Tree实现

在c#(开源)中是否存在基于文件系统的B + Tree实现。 我找到了一些项目,但那些不是基于文件(磁盘)的实现。 我特意寻找基于文件系统的B + Trees。 ...

2010-08-23 07:15:48 2 8147   c#/ b-tree
8 基于磁盘的B + -tree实现,具有固定大小的键和值

是否有任何库提供基于磁盘的B + -tree实现,专门针对所有键具有固定大小并且所有值也具有固定大小的场景(不一定与键的固定大小相同)? 注意:是的,我想实现另一个玩具,概念验证RDBMS。 我没有使用SQL DBMS是有充分理由的 。 结束了。 我并不特别介意库的编写语言。但是 ...

9 C++:实现B-tree的双向迭代器

我正在实现我的 B 树实现的双向迭代器。 (完整代码: https : //wandbox.org/permlink/i4UeEvE3OB6mVup3 ) 简而言之,我被困在扭转方向。 节点实现: 我正确的前向迭代器实现: 我尝试实现operator--失败: 因为it是std:: ...

10 我是否需要为此实现b-tree搜索?

我有一个整数数组,可能会遇到数十万(或更多),按数字上升排序,因为这是它们最初堆叠的方式。 我需要能够查询数组以尽可能有效地获得其首次出现数字&gt;=某些输入的索引。 我想知道如何在不考虑它的情况下做到这一点的唯一方法就是遍历测试条件的数组直到它返回true,此时我将停止迭代。 但是 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM