b树java代码,java b树和b+树区别
java里同时出现b[]和b[][]
因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,
创新互联建站服务项目包括黄岛网站建设、黄岛网站制作、黄岛网页制作以及黄岛网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,黄岛网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到黄岛省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
B树(B-tree)是一种树状数据结构能够用来存储排序后的数据。这种数据结构能够让查找数据、循序存取、插入数据及删除的动作,都在对数时间内完成。
Rust编程语言里的B树map
rust编程语言里的btreemap
和HashMap不同
HashMap的数据顺序是不确定的
当你运行同一段
初始化HashMap的代码
然后打印输出元素的顺序是不同的
btreemap的数据是按键排序好了的
它是基于B树创建出来的
目前支持少量数据创建btreemap
它用线性查询
性能比较高
它实现了ord特性
可以用来比较
取最大最小值
所以按照范围查询数据
效率也高
rust里的btreemap提供了
和HashMap类似一致的方法
可以像HashMap一样
new一个btreemap
然后insert一键值对
还可以用from函数
从数组创建btreemap
想要获取一个数据时
可以用get方法传入键
返回option包装的值
可以用索引的方式
给btreemap传入一个键
会直接得到值
如果键不存在
会报错
所有这种方式取值需先判断
和HashMap类似
可以用entry方法
存入键值对
它也有一些HashMap没有的方法
pop_first可以删除第一个键值对
并返回option包装的这个数据
这个键是最小的
last_key_value返回最后的
最大键的option包装的键值对
last_entry方法返回和上面方法一样
只不过是entry包装键值
pop_last方法删除并返回
最后一个用option包装的元素
append方法可以用来
合并两个btreemap
range方法可以用来
取一段键范围的数据
数据结构B树的设计与实现
B树的插入算法在编写过程中还是觉得比较难写的,主要的问题是,结点的分裂,
对叶子结点的分裂和对非叶节点的分裂不一样,还有就是当ptr-parent==NULL,
需要新建父结点,而新建的结点始终是树的根结点,还有结点分裂过程中子树指
针的变化还是很复杂的,不过终于实现了,分享一下我的代码,可以直接运行,
本程序没有包含我编写的其他头文件,代码如下,大家多多讨论:
另外,由于B树不同于其他的树,所有我考虑了一下,还是采用缩进格式来显示
B树了,因为每个结点有多个关键码,所以用广义表形式不显示不好。
#ifndef BTREE_H
#define BTREE_H
#includeiostream.h
#includestdlib.h
const int maxValue=10000;
/////////////////////////////////////////////////
//BTreeNodeTB树的结点的定义
/////////////////////////////////////////////////
templateclass T
struct BTreeNode
{
int n; //结点中关键码的个数
BTreeNodeT* parent; //当前结点的父结点的指针
T* key; //m+1个元素存放关键码,其中key[0]和key[m]没有用
BTreeNodeT** //子树指针的结点数组(一共有m棵子树),m+1个元素
subTree; //最后一个元素subTree[m]在插入溢出的时候使用
int** recptr; //每个索引项中指向数据区相应记录起始地址的指针数组
BTreeNode(int m) //构造函数
{
n=0; //关键码个数初始化为0
parent=NULL; //父结点指针初始化为空
key=new T[m+1]; //开辟关键码数组的空间
subTree=new //开辟子树的指针数组的内存空间
BTreeNodeT*[m+1]; //从p0,p1,p2,...p(m-1)共m棵子树
for(int i=0;i=m;i++)
subTree[i]=NULL; //子树数组先全部初始化为空
};
bool Insert(const T x //把一个关键码插入到当前的B树结点中
,BTreeNodeT* p) //也把附带的新建的右子树的指针插入subTree[]中
{
for(int i=1;i=n;i++) //寻找插入关键码的位置
{
if(xkey[i])
break;
};
for(int j=n;j=i;j--) //挪处新的插入位置来
key[j+1]=key[j];
key[i]=x; //插入结点
n++;
for(j=n;j=i;j--) //把新分裂开来的右子树结点插入subTree[]中
subTree[j+1]=subTree[j];
subTree[i]=p;
return true;
};
void Display() //显示当前结点所有关键码
{
for(int i=1;i=n;i++)
coutkey[i]" ";
};
};
/////////////////////////////////BTreeT定义结束
/////////////////////////////////////////////////
//TripleT结构 返回搜索结果用的三元组
/////////////////////////////////////////////////
templateclass T
struct Triple
{
BTreeNodeT* r; //结点指针
int i; //关键码在当前结点中的序号
int tag; //tag=0:搜索成功,tag=1:搜索失败
};
////////////////////////////////TripleT结构结束
/////////////////////////////////////////////////
//BTreeT B树的定义;
//m阶B树的根至少有两个子树,
//其他的结点至少应该有int(m/2)+1个子树
//所有的失败结点都在一个层次上
/////////////////////////////////////////////////
templateclass T
class BTree
{
private:
BTreeNodeT* root; //树根结点指针
int m; //即B树的阶数
public:
BTree(int x) //空构造函数,构造一棵空x路的搜索树
{root=NULL;m=x;};
BTree(int x,BTreeNodeT* r)
{root=r;m=x;}; //用指定的树根来初始化当前的m路搜索树
void Insert( //在树指定父结点的情况下插入一个结点
BTreeNodeT* pa, //指定要出入的位置的父结点
BTreeNodeT* subTree, //要插入的结点的指针
int i); //表示插入到pa的第i个子树的位置
TripleT //搜索指定关键码x对应的结点
Search(const T x);
void RootFirst( //递归:以先根的方式遍历当前的搜索树
BTreeNodeT* subTree);
void RootFirst() //调用上面的递归函数
{RootFirst(root);};
bool Insert(const T x); //B树的插入操作
void Display(
BTreeNodeT* p,int i); //递归:以缩进的格式显示当前的B树
void Display() //调用上面的递归函数
{cout"*****当前B树的缩进结构显示*****:"endl;
Display(root,1);};
};
//////////////////////////////////////B树声明结束
/////////////////////////////////////////////////
//RootFirst()公有成员函数
//以先根的方式递归遍历当前B树
/////////////////////////////////////////////////
templateclass T
void BTreeT::RootFirst(BTreeNodeT* st)
{
if(st!=NULL)
{
int n=st-n;
cout"当前结点有"n
"个关键码:"endl;
for(int k=1;k=n;k++) //输出当前结点的所有的关键码
coutst-key[k]" ";
coutendlendl;
for(int i=0;i=n;i++) //递归输出所有的子树
RootFirst(st-subTree[i]);
};
};
//////////////////////////////RootFirst()函数结束
/////////////////////////////////////////////////
//Search()公有成员函数 搜索具有指定关键码的
//的结点并且以三元组的形式进行返回,如果没有搜索
//成功就把该关键码插入到当前驻留的结点中去
/////////////////////////////////////////////////
templateclass T
TripleT BTreeT::Search(const T x)
{
TripleT result; //结果三元组
BTreeNodeT* ptr=root; //从根结点开始搜索
BTreeNodeT* pre;
/*从根结点开始往下查找*/
int i;
while(ptr!=NULL)
{
for(i=1;i=ptr-n;i++) //在结点内部进行顺序搜索
{
if(ptr-key[i]==x) //如果找到
{
result.r=ptr; //当前查找驻留的结点指针
result.i=i; //查找成功的关键码
result.tag=1; //是否查找成功
return result;
};
if(ptr-key[i]x) //查找失败
break;
};
pre=ptr;
ptr=ptr-subTree[i-1]; //从失配的关键码左边的子树继续查找
};
/*如果查找失败*/
result.r=pre;
result.i=i; //可以在i-1和i之间进行插入
result.tag=0; //查找失败
return result;
};
/////////////////////////////////Search()函数结束
/////////////////////////////////////////////////
//Insert()公有成员函数 B树的插入操作
//把指定的关键码插入到B树中,使得仍然满足B树的要求
//首先对B树进行搜索,如果关键码已经存在则插入失败,
//否则执行插入,并按B树要求进行调整
//一般来说,执行插入的肯定是在叶子结点上进行
//但是如果查找成功的话,可能在非叶子结点上就结束了
/////////////////////////////////////////////////
templateclass T
bool BTreeT::Insert(const T x)
{
/*如果当前的B树是空的,就新建之*/
if(root==NULL) //如果当前的B树是空的
{
root=new BTreeNodeT(m); //新建一个结点
root-Insert(x,NULL); //把关键码插入到key[]数组第一个位置
return true;
};
/*如果当前的B树不空,就搜索该树*/
TripleT Tp; //查找结果三元组
Tp=Search(x);
int IsIn=Tp.tag;
if(IsIn==1) //关键码已经存在
{
cout"关键码已存在!"endl;
return false; //插入失败
};
/*插入关键码直到结点关键码不溢出为止*/
BTreeNodeT* ptr=Tp.r; //查找失败而驻留的结点
int loc=Tp.i-1; //在k[loc]后进行插入
int pkey=x;
BTreeNodeT* p=NULL; //随关键一起要插入的右子树的根结点
do
{
ptr-Insert(pkey,p); //把关键码和相关的新分裂的右结点插入当前结点
if(ptr-nm-1) //如果关键码溢出,则需要进行调整
{
/*以下处理结点的分裂*/
int k=ptr-key[m/2+1]; //提取出要上提的关键码
BTreeNodeT* right //建立分裂后右边的结点
=new BTreeNodeT(m);
right-n=ptr-n-m/2-1; //右结点的关键码个数
for(int i=m/2+2;i=ptr-n;i++)
right-key[i-m/2-1] //把右半边的关键码复制进入右结点
=ptr-key[i];
for(i=m/2+1;i=ptr-n;i++)
{
right-subTree[i-m/2-1]
=ptr-subTree[i]; //把相应的分裂后的右结点子树指针复制入新结点
}
ptr-n=m/2; //修改原结点使之成为左结点
right-parent
=ptr-parent; //新分裂的结点
p=right; //p是随k一起上提的新建分裂右结点指针
pkey=k;
/*如果当前的结点没有父结点*/
if(ptr-parent==NULL) //如果当前结点没有父结点,就新建父结点
{
BTreeNodeT* newp //新建一个父结点
=new BTreeNodeT(m);
newp-key[1]=k; //插入新关键码
newp-subTree[0] //新关键码左边的子树
=ptr;
newp-subTree[1] //新关键码右边的子树
=right;
newp-n=1; //新关键码个数为1
ptr-parent=newp; //设置父结点指针
right-parent=newp;
root=newp;
return true; //插入成功并结束
}
else //如果有父结点存在
ptr=ptr-parent; //把上提的关键码继续插入父结点
}
else //不溢出则插入成功
return true;
}while(ptr!=NULL);
return true;
};
/////////////////////////Insert()公有成员函数结束
/////////////////////////////////////////////////
//Display()公有成员函数
//递归:显示当前B树的缩进格式
/////////////////////////////////////////////////
templateclass T
void BTreeT::Display(BTreeNodeT* p,int i)
{
if(p!=NULL)
{
for(int j=0;ji;j++)
cout" "; //控制缩进的格数
cout"当前结点是:关键码个数"p-n" "
"关键码的内容是";
for(int k=1;k=p-n;k++)//显示当前结点所有关键码
coutp-key[k]" ";
coutendl;
for(k=0;k=p-n;k++) //递归显示子树,递归向后缩进
Display(p-subTree[k],i+5);
};
};
////////////////////////////////Display()函数结束
#endif
#include"BTree.h"
/////////////////////////////////////////////////
//main()函数 测试B树的程序
/////////////////////////////////////////////////
int main()
{
BTreeint BT(3);
BT.Insert(53); //依此在B树中插入关键码
BT.Insert(75);
BT.Insert(139);
BT.Insert(49);
BT.Insert(145);
BT.Insert(36);
BT.Insert(101);
BT.Insert(150);
BT.Insert(170);
BT.Insert(25);
BT.Insert(13);
BT.Display(); //显示当前B树的内容
return 0;
};
///////////////////////////////////main()函数结束
怎样用Java来体现二叉树(顺便加上注释)
二叉树,和数据库的B树操作流程是一样的,例如:有如下字段
F,C,B,H,K,I;
如果要形成二叉树的话,则,首先取第一个数据作为根节点,所以,现在是 F ,如果字段比根节点小,则保存在左子树,如果比根节点大或者等于根节点则保存在右子树,最后按左---根-----右输出所以数据。
所以,实现的关键就是在于保存的数据上是否存在大小比较功能,而String类中compareTo()有这个能力,节点类要保存两类数据,左节点,右节点
class Node
{
private String data;
private Node left;
private Node right;
public Node (String data){
this.data = data;
}
public void setLeft(Node left) {
this.left = left;
}
public void setRight(Node right){
this.right = right;
}
public String getDate() {
return this.data;
}
public Node getLeft(){
return this.left;
}
public Node getRight(){
return this.right;
}
public void addNode(Node newNode){
if(this.data.compareTo(newNode.data)=0) {
if(this.left == null){
this.left = newNode;
}else {
this.left.addNode(newNode);
}
}else {
if(this.right == null) {
this.right = newNode;
} else {
this.right.addNode(newNode);
}
}
}
public void printNode(){
if(this.left!= null){
this.left.printNode();
}
System.out.println(this.data);
if(this.right != null){
this.right.printNode();
}
}
}
class BinaryTree
{
private Node root = null;
public void add(String data) {
Node newNode = new Node(data);
if(this.root == null) {
this.root = newNode;
}else{
this.root.addNode(newNode);
}
}
public void print() {
this.root.printNode();
}
}
public class Hello
{
public static void main (String args[]) {
BinaryTree link = new BinaryTree();
link.add("F");
link.add("C");
link.add("B");
link.add("H");
link.add("K");
link.add("I");
link.print();
}
}
你一看就英文就知道什么意思了,应该可以理解了
这个二叉树捉摸不透就别琢磨了,开放中一般用不上
}
Java编程中 什么是索引,有什么作用?
java 编程中索引是对数据库表中一列或多列的值进行排序的一种结构(B树-平衡多叉树)。
创建索引可以大大提高系统的性能。
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能
c++/java/c#请高手解惑,关于设计模式中“享元模式( Flyweight )”!
对文档编辑器,重点不是它内部状态的共享(字符基本特征),而是场景的共享,也就是你说的格式。
比方说:文档编辑器用BTree结构来管理内容,它会为你在文档中使用的每一种格式(字体、字号、粗斜、颜色等多项的组合)建立一个索引,为文档中格式相同的连续字块建立一个节点,每个节点指向一种格式索引。这样是不是节省的大量内存呢。
当然,我上面说的还是最简单的情况。事实上,我们将格式分为多级(比如将变化最小的字体作为第一级,变化较多的字号作为第二级,而将其它的作为第三级),每一级可以再建立索引,形成更加复杂的共享层次和共享组合。
而字块节点采用了BTree,利用B树的优点,能够进行快速查找、索引的建立、字块的归并。
下面的图可以帮你加深理解。
文本信息如下:
Btree结构可能如下图所示:
假设遍历到索引102。
目标1: 将“except”的字体设置为“Time 12”字体。
目标2: 在单词“expect”前用12-point Times Italic字体添加一个单词Don't(包含一个紧跟着的空格)。假定gc仍在索引位置102
本文标题:b树java代码,java b树和b+树区别
文章地址:http://scyanting.com/article/hoejep.html