2-3树的基本操作实现

C语言 2-3树 2-3树简介 实现过程 代码实现 2-3树简介 2-3树是最简单的B-树(或-树)结构,其每个非叶节点都有两个或三个子女,而且所有叶都在统一层上。 2-3树的模拟过程可以看链接:InsertSortion 实现过程 在2-3树中,一个结点只有一个值的我们称为2-结点,有两个值的称为3-结点,在2-3树中,一个结点最多只有两个值,即3-结点。 ... 阅读详情

            通过引入结点度大于2的查找树,可以得到一种插入算法和删除算法都比AVL树简单的树结构,且这些算法的时间复杂性是O(logn)。这种树结构称为2-3树。2-3树的名字反映了2-3树具有如下性质:一棵2-3树中每个内部结点的度或者是2,或者是3。其中度为2的结点称为2结点,度为3的结点称为3结点。

定义:一棵2-3树(2-3 Tree)是一棵查找树,该查找树或者为空,或者满足如下性质:

1,每个内部结点或者是一个2结点,或者是一个3结点。一个2结点存放一个元素,而一个3结点存放两个元素。

2,令lchild和mchild表示2结点的两个儿子,datal表示该节点存放的元素,且datal.key是该元素的关键字。以lchild为根的子树中所有结点的关键字都小于datal.key,而以mchild为根的子树中所有结点的关键字都大于datal.key。

3,零lchild,mchild和rchild表示3结点的三个儿子,datal和datar表示该节点存放的左右两个元素,且datal.key < datar.key。以lchild为根的子树的所有结点的关键字都小于datal.key,以mchild为根的子树的所有结点的关键子都大于datal.key而小于datar.key,而以rchild为根的子树中所有结点的关键字都大于datar.key。

4,所有外部结点位于同一层。

        2-3树的查询操作不用细说,实现比较容易,重点在于2-3树的插入和删除操作,2-3树的插入操作涉及结点拆分,删除操作涉及数据的转移(或者称为旋转吧)以及结点合并(三种情况的旋转以及三种情况的合并,详细见REF[1]的2-3树章节)等等操作。


具体的插入和删除的原理可以可以参考文章《2-3树删除和插入操作的小结》,后面的代码主要是对REF[1]中的算法的实现:

代码:

#include <iostream>
#include <stack>

using namespace std;

typedef struct Tree23Node * Tree23;

typedef struct Tree23Node {
	int datal;
	int datar;
	Tree23 lchild,mchild,rchild;
} Tree23Node;

#define  INT_MAX 0x3f3f3f3f

stack<Tree23> s;

int compare(int x, Tree23 t)
{
	if (x < t->datal)
		return 1;
	else if (x > t->datar)
		return 3;
	else if ( x < t->datar && x > t->datal)
		return 2;
	else 
		return 4; 
}

Tree23 createNode(int key)
{
	Tree23 t = new Tree23Node;
	t->datal = key;
	t->datar = INT_MAX;
	t->lchild = t->mchild = t->rchild = NULL;
	return t;
} 
void newRoot(Tree23 *root,int key,Tree23 midSub)
{
	Tree23 t = createNode(key);
	t->lchild = *root;
	t->mchild = midSub;
	*root = t;		
}

bool isleaf(Tree23 root)
{
	if (root && root->datal < INT_MAX && root->lchild == NULL && 
		root->mchild == NULL && root->rchild == NULL)
		return true;
	return false;
}

Tree23 findNode(Tree23 root, int key)
{
	Tree23 t = NULL;
	while (root){
		if (!isleaf(root))
			s.push(root);
		if (isleaf(root))
			t = root;
		switch (compare(key,root)) {
			case 1:	root = root->lchild;
					break;
			case 2:	root = root->mchild;
					break;
			case 3: root = root->rchild;
					break;
			case 4: return NULL;
		}
	}
	return t;
}

void put(Tree23 *root, int key,Tree23 q)
{
	if (key < (*root)->datal){
		(*root)->datar = (*root)->datal;
		(*root)->datal = key;
		(*root)->rchild = (*root)->mchild;
		(*root)->mchild = q;
	}
	else {
		(*root)->datar = key;
		(*root)->rchild = q;
	}
} 

void split(Tree23 p,int *key,Tree23 *q)
{
	Tree23 t = createNode(INT_MAX);
	 
	if (*key < p->datal) {
		t->datal = p->datar;
		/*swap *key and p->datal */
		p->datar = *key;
		*key = p->datal;
		p->datal = p->datar;
		/* set p->datar to non sense */
		p->datar = INT_MAX; 
	}
	else if (*key > p->datar) {
		t->datal = *key;
		*key = p->datar;
		p->datar = INT_MAX;
	}
	else {
		t->datal = p->datar;
		p->datar = INT_MAX;
	}
	t->lchild = p->rchild;
	p->rchild = NULL;
	t->mchild = *q;
	*q = t;
}

Tree23 del()
{
	if (!s.empty()){
		Tree23 t = s.top();
		s.pop();
		return t;
	}
	return NULL;
}

void insert23(Tree23 *root,int key)
{
	Tree23 p,q,temp;
	
	if (*root == NULL) {
		/* tree is empty */
		newRoot(root,key,NULL);
	}
	else {
		/* insert into an empty tree */
		p = findNode(*root,key);
		if (p == NULL) {
			cout<<"The key is currently in the tree."<<endl;
			return;
		}
		q = NULL;
		for(;;) {
			if (p->datar == INT_MAX) {
				/* two sub node */
				put(&p,key,q);
				break;
			} 
			else {
				/* three sub node */
				split(p,&key,&q);
				if ( p == *root) {
					/* split the root */
					newRoot(root,key,q);
					break;
				}
				else 
					/* remove a node from stack */
					p = del();
			}
		}
	}
}

void visit(Tree23 T)
{
	if (T->datar < INT_MAX) {
		cout<<"("<<T->datal<<","<<T->datar<<") ";
	} 
	else if (T->datal < INT_MAX) {
		cout<<"("<<T->datal<<",) "; 
	}
	else cout<<"(,) "; 
} 
void inOrder(Tree23 T)
{
	if(T)
	{ 
		visit(T);
		//cout<<endl;
		if (T->lchild == NULL)
			return;
		cout<<"(";
		inOrder(T->lchild);
		cout<<",";
		inOrder(T->mchild);
		cout<<",";
		inOrder(T->rchild); 
		cout<<")";
	} 

}

Tree23 search23(Tree23 root,int key)
{
	while (root) {
		s.push(root);
		switch (compare(key,root)) {
			case 1:	root = root->lchild;
					break;
			case 2: root = root->mchild;
					break;
			case 3: root = root->rchild;
					break;
			case 4: return root;
		}
	} 
	return NULL;
}
Tree23 min23(Tree23 root)
{
	while(root->lchild){
		s.push(root);
		root = root->lchild;
	}
	s.push(root);
	return root;
}

void deletex(Tree23 t,int key)
{
	/* delete key from node t */
	if(key == t->datal){
		/* delete first key */
		if(t->datar < INT_MAX){
			/* three sub node*/
			t->datal = t->datar;
			t->datar = INT_MAX;
		}
		else
			/* two sub node */
			t->datal = INT_MAX;
	}
	else
		/* delete second key */
		t->datar = INT_MAX;
}

void leftRotate(Tree23 &p,Tree23 &q,Tree23 &r)
{
	p->datal = r->datal;
	r->datal = q->datal;
	q->datal = q->datar;
	q->datar = INT_MAX;
	
	p->mchild = q->lchild;
	q->lchild = q->mchild;
	q->mchild = q->rchild;
	q->rchild = NULL;
}

void leftCombine(Tree23 &p,Tree23 &q,Tree23 &r) 
{
	p->datal = r->datal;
	p->datar = q->datal;
	p->mchild = q->lchild;
	p->rchild = q->mchild;
	delete q;
	if (r->datar == INT_MAX){
		/* r is two sub node*/
		r->datal = INT_MAX;
		r->mchild = NULL;
	}
	else{
		r->datal = r->datar;
		r->datar = INT_MAX;
		r->mchild = r->rchild;
		r->rchild = NULL; 
	}
} 


void middleRotate(Tree23 &p,Tree23 &q,Tree23 &r)
{
	p->datal = r->datal;
	r->datal = q->datar;
	q->datar = INT_MAX;
	p->mchild = q->rchild;
	q->rchild = NULL;
}

void middleCombine(Tree23 &p, Tree23 &q, Tree23 &r)
{
	q->datar = r->datal;
	q->rchild = p->lchild;
	delete p;
	if(r->datar < INT_MAX) {
		r->datal = r->datar;
		r->datar = INT_MAX;
		r->mchild = r->rchild;
		r->rchild = NULL;
	}
	else {
		r->datal = INT_MAX;
		r->mchild = NULL;
	}
	
}

void rightRotate(Tree23 &p,Tree23 &q,Tree23 &r)
{
	p->datal = r->datar;
	r->datar = q->datar;
	q->datar = INT_MAX;
	p->mchild = q->rchild;
	q->rchild = NULL;
}

void rightCombine(Tree23 &p,Tree23 &q,Tree23 &r)
{
	q->datar = r->datar;
	r->datar = INT_MAX;
	q->rchild = p->lchild;
	delete p;
	r->rchild = NULL;
}
bool delete23(Tree23 *root, int key)
{
	Tree23 t = search23(*root,key);
	Tree23 p;
	Tree23 r ;
	Tree23 q = NULL;
	if (t == NULL)
		return false;
	else{
		if (!isleaf(t)){
			if (t->datal == key){
				p = min23(t->mchild);
				t->datal = p->datal;
				key = p->datal;
			}
			else{
				p = min23(t->rchild);
				t->datar = p->datal;
				key = p->datal;
			}
			
		}
		else
			p = t;
		
		deletex(p,key);
		del();
		for(;;){
			if (p->datal == INT_MAX && p->datar == INT_MAX){
				r = del();
				if (r == NULL)
					break;
				if (r->lchild == p){
					/* */
					q = r->mchild;
					if (q->datar < INT_MAX){
						/* rotate when p is the left child of r */
						leftRotate(p,q,r);
					}
					else{
						/* combine when p is the left child of r*/
						leftCombine(p,q,r);
					}
				}
				else if (r->mchild == p) {
					q = r->lchild;
					if (q->datar < INT_MAX){
						middleRotate(p,q,r);
					}
					else{
						middleCombine(p,q,r);
					}
					
				}
				else {
					q = r->mchild;
					if (q->datar < INT_MAX){
						rightRotate(p,q,r);
					}
					else{
						rightCombine(p,q,r);
					}
				}
				p = r;
			}
			else 
				break;
			
		}
		if (p->datal == INT_MAX){
			*root = p->lchild;
			delete p;
		}	
		
	}
	
}
int main()
{
	Tree23 tree = NULL;
	for(int i = 0; i < 11; i++){
		insert23(&tree,i);
		inOrder(tree);
		cout<<endl;
		cout<<"-----------------------------------------"<<endl;
	}
	insert23(&tree,8);
	inOrder(tree);
	cout<<endl; 
	cout<<"--------------------------------------------"<<endl;
	
	while(!s.empty())
		s.pop();
	delete23(&tree,10);
	inOrder(tree);
	cout<<endl;
	
	cout<<"--------------------------------------------"<<endl;
	
	while(!s.empty())
		s.pop();
	delete23(&tree,9);
	inOrder(tree);
	cout<<endl;
	
	cout<<"--------------------------------------------"<<endl;
	
	while(!s.empty())
		s.pop();
	delete23(&tree,8);
	inOrder(tree);
	cout<<endl;
	
	cout<<"--------------------------------------------"<<endl;
	
	while(!s.empty())
		s.pop();
	delete23(&tree,7);
	inOrder(tree);
	cout<<endl;
	
	cout<<"--------------------------------------------"<<endl;
	
	while(!s.empty())
		s.pop();
	delete23(&tree,6);
	inOrder(tree);
	cout<<endl;
	
	cout<<"--------------------------------------------"<<endl;
	
	for(int i = 5;i >= 0; i--){
		while(!s.empty())
		s.pop();
		delete23(&tree,i);
		inOrder(tree);
		cout<<endl;
	
		cout<<"--------------------------------------------"<<endl;
		
	}
} 

测试结果:

Key  =   0  inserted:
(0,) 
---------------------------------------------------------------------
Key  =   1  inserted:
(0,1) 
---------------------------------------------------------------------
Key  =   2  inserted:
(1,) ((0,) ,(2,) ,)
---------------------------------------------------------------------
Key  =   3  inserted:
(1,) ((0,) ,(2,3) ,)
---------------------------------------------------------------------
Key  =   4  inserted:
(1,3) ((0,) ,(2,) ,(4,) )
---------------------------------------------------------------------
Key  =   5  inserted:
(1,3) ((0,) ,(2,) ,(4,5) )
---------------------------------------------------------------------
Key  =   6  inserted:
(3,) ((1,) ((0,) ,(2,) ,),(5,) ((4,) ,(6,) ,),)
---------------------------------------------------------------------
Key  =   7  inserted:
(3,) ((1,) ((0,) ,(2,) ,),(5,) ((4,) ,(6,7) ,),)
---------------------------------------------------------------------
Key  =   8  inserted:
(3,) ((1,) ((0,) ,(2,) ,),(5,7) ((4,) ,(6,) ,(8,) ),)
---------------------------------------------------------------------
Key  =   9  inserted:
(3,) ((1,) ((0,) ,(2,) ,),(5,7) ((4,) ,(6,) ,(8,9) ),)
---------------------------------------------------------------------
Key  =   10  inserted:
(3,7) ((1,) ((0,) ,(2,) ,),(5,) ((4,) ,(6,) ,),(9,) ((8,) ,(10,) ,))
---------------------------------------------------------------------
The key is currently in the tree.
Key  =   8  inserted:
(3,7) ((1,) ((0,) ,(2,) ,),(5,) ((4,) ,(6,) ,),(9,) ((8,) ,(10,) ,))
--------------------------------------------------------------------------
Key  =   10  deleted:
(3,) ((1,) ((0,) ,(2,) ,),(5,7) ((4,) ,(6,) ,(8,9) ),)
--------------------------------------------------------------------------
Key  =   9  deleted:
(3,) ((1,) ((0,) ,(2,) ,),(5,7) ((4,) ,(6,) ,(8,) ),)
--------------------------------------------------------------------------
Key  =   8  deleted:
(3,) ((1,) ((0,) ,(2,) ,),(5,) ((4,) ,(6,7) ,),)
--------------------------------------------------------------------------
Key  =   7  deleted:
(3,) ((1,) ((0,) ,(2,) ,),(5,) ((4,) ,(6,) ,),)
----------------------------------------------------------------------------
Key  =   6  deleted:
(1,3) ((0,) ,(2,) ,(4,5) )
---------------------------------------------------------------------------
Key  =   5  deleted:
(1,3) ((0,) ,(2,) ,(4,) )
---------------------------------------------------------------------------
Key  =   4  deleted:
(1,) ((0,) ,(2,3) ,)
---------------------------------------------------------------------------
Key  =   3  deleted:
(1,) ((0,) ,(2,) ,)
---------------------------------------------------------------------------
Key  =   2  deleted:
(0,1) 
---------------------------------------------------------------------------
Key  =   1  deleted:
(0,) 
---------------------------------------------------------------------------
Key  =   0  deleted:

---------------------------------------------------------------------------


REF:

1,数据结构(C语言版) Ellis Horowitz等

2,http://blog.youkuaiyun.com/sumoyu/article/category/1054287

3,http://www.bkjia.com/Pythonjc/815204.html

2-3-4树的java实现 一、什么是2-3-4树 2-3-4树和红黑树一样,也是平衡树。只不过不是二叉树,它的子节点数目可以达到4个。 每个节点存储的数据项可以达到3个。名字中的2,3,4是指节点可能包含的子节点数目。具体而言: 1、若父节点中存有1个数据项,则必有2个子节点。 2、若父节点中存有2个数据项,则必有3个子节点。 3、若父节点中存有3个数据项,则必有4个子节点。 也就是说子节点的数目是父节点中数据 阅读详情

相关推荐

详解多路查找树(2-3树、2-3-4树、B树、B+树)以及python实现相关操作

多路查找树引言1、概述2、2-3树2.1 定义2.2 插入操作三级目录 引言 二叉树的局限性: \quad \quad二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多,就存在一下问题: 在构建二叉树时,需要多次进行i/o(存取)操作(海量数据存在数据库或文件中),节点数量,构建二叉树时,速度有影响。 节点数量,也会造成二叉树的高度很大,会降低操作速度 \quad \quad我们之前谈的树,都是一个节点可以有多个孩子,但是它自身只存储一个元素。二叉树限制更多,节点最多只

weixin_45666566的博客 1496

2-3树的插入和删除操作

2-3树之查找、插入和删除操作

m0_60435649的博客 2541

【大话数据结构C语言】59 2-3-4树

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取精品学习资源 程序员技术交流①群:736386324 程序员技术交流②群:371394777 2-3-4树 其实就是对2-3树的扩展,包括了4结点的使用 一个4结点包含中小大三个元素和四个孩子,一个4结点要不没有孩子,要不具有4个孩子 如果某个4结点有孩子的话,左子树包含小于最小元素的元素: 第二子树包含大于最小元素,小于第二元素的元素: 第三子树包含大于第二元素,小于最大元素的元素: 右子树包含大于最大元素的元素 ...

CodeAllen嵌入式 5788

2-3树的C实现

B树一个Node可以有N个key, N+1个下级Node, 二叉树就是简化版,一个key两个下级node 2-3树和2-3-4树的区不大,2-3树在插入时先找到叶子节点(没有子节点),然后插入,过程中如果已经是3Node(2 key)就分裂,向上冒泡,一直可能冒泡到顶上。 2-3-4树则在向下找叶子节点时就做调整,把4Node(3 key)提前分裂掉,为下级节点腾出空间,所以叶子节点插入后...

steeven 710

2-3树的实现

陈建二老师总结的2-3树讲课资料,主要适用于中南大学计算机系研究生的高级算法课程

新手必看:SMIC 0.18um PDK安装保姆级教程(附Cadence IC617环境配置)

本文提供SMIC 0.18um PDK在Cadence IC617环境下的详细安装教程,涵盖环境准备、文件解压、安装脚本运行、环境变量配置及Cadence集成验证等关键步骤,特别针对初学者常见问题提供解决方案,助力快速掌握芯片设计工具配置。

weixin_30522183的博客 490

数据结构和算法之美_23_二叉树

带着问题去学习: 1、二叉树有哪几种存储形式?什么样的二叉树适合用数组去存储? 树(Tree) 比如下面这幅图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫做根节点,也就是图中的节点 E。我们把没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。 关于“树”,还有三个比较相似的概念:高度(Height)、深度(Depth)、层(Level)。 二叉树(

t765833631的博客 326

Android 13高通平台CTS camera部分fail项修改(续)

接着上一篇,有几个提了case高通也分析了很久的fail项,其中最离谱的是问题1,第一个接手case的人反反复复处理、内部排查踢皮球、要求log,折腾了很久,最终就给出个解不了的结论。后面还是靠着自己发现了一些蛛丝马迹,并且换了个case接手人才最终解决。

hkj887tg的博客 2059

2-3-4树

前有2-3树,2-3-4树的概念不

flyapy 859

Isaac Sim/Lab & ROS2 入门教程 —— 宇树人形机器人 H1 强化学习策略部署

本文介绍了如何通过ROS2和IsaacSim运行H1人形机器人的强化学习运动策略。主要内容包括:1)设置机器人关节配置和初始位置;2)添加IMU传感器;3)配置ROS2节点以发布观测数据和接收动作指令;4)创建模拟环境并发布ROS时钟;5)最终运行ROS2策略实现对机器人的键盘控制。文中详细说明了关节参数设置、传感器配置、ROS2节点创建等关键步骤,并提供了注意事项和验证方法。完成配置后,用户可通过键盘指令控制机器人在平坦地形上的运动。

2506_90492529的博客 2169

基于ZYNQ的HP总线与DDR交互:实现PL与PS高效数据传输的完整指南

本文将深入探讨如何通过AXI HP总线实现PL与PS的DDR交互,结合代码示例、硬件配置与创新优化,助力开发者掌握这一关键技术。ZYNQ内部通过AXI HP接口直接连接PL与DDR控制器,PL通过AXI协议发送读写请求,绕过PS的CPU直接操作DDR。通过AXI HP总线实现PL与PS的DDR交互,开发者可充分发挥ZYNQ异构架构的优势。在Xilinx ZYNQ系列芯片中,PS(Processing System)与PL(Programmable Logic)的协同设计是其核心优势。

QQ_778132974的博客 1223

第十五周项目3-B-树的基本操作

问题及代码: [cpp] view plain copy     *     * Copyright (c)2016,烟台大学计算机与控制工程学院     * All rights reserved.     * 文件名称:ccc.cpp     * 作    者:朱建豪 * 完成日期:2016年12月27日     * 版 

zhuzhuzhujianhao的博客 495

YOLOv13添加轻量化的EMA模块Faster_EMA,轻量又涨点!map50提升4.56个点,召回率提升9.66!

本文介绍了YOLOv13模型的优化移植方法,通过添加Faster_EMA模块和超参数调整,使模型性能显著提升。主要修改包括:1) 创建新的模型配置文件yolov13-Faster_EMA.yaml;2) 在tasks.py中添加新模块;3) 修改__init__.py和block.py文件,新增Partial_conv3和DropPath类。优化后模型mAP50提升4.56%,召回率提升9.66%,验证了改进方案的有效性。代码实现了局部卷积和随机深度等先进技术,为YOLO系列模型性能优化提供了新思路。

FJN110的博客 2604

第十五周项目3——项目3 - B-树的基本操作

/*   * Copyright (c)2016,烟台大学计算机与控制工程学院   * All rights reserved.   * 文件名称:wu.cpp   * 作    者:武昊   * 完成日期:2016年12月15日   * 版 本 号:v1.0    *问题描述:实现B-树的基本操作。基于序列{4, 9, 0, 1, 8, 6, 3, 5, 2, 7}完成测试。  

最好你搬过来 331

18年陕西省TI杯电赛无人机赛题视觉部分

更新: 相同任务另外两种不同的视觉方法: https://blog.youkuaiyun.com/qq_41895747/article/details/97613077 https://blog.youkuaiyun.com/qq_41895747/article/details/97614971 任务:识别前方的方框,无人机从方框中飞出去 视觉任务:识别特定方框,返回方框中心坐标 # -*- codin...

沉迷单车的追风少年 1506

25、压电泵致动器变形计算与测量及转弯腔射流特性的有限元分析

本文围绕压电泵致动器的变形计算与测量以及转弯腔射流特性的有限元分析展开研究。通过建立有限元模型和抛物线拟合方法,对压电泵致动器的位移和变形体积进行了详细计算,并探讨了其对传感器性能的影响。同时,利用ANSYS软件对转弯腔在不同角速率输入下的射流特性进行了仿真分析,揭示了流场分布随角速率变化的规律。研究成果为压电流体角速率传感器的设计优化提供了理论依据和技术支持。

ooo22的博客 125

2-3-4树(2)实现

为了简单起见,内部将不采用数组,而采用.net的List列表,此部分与用到的算法无关,所以可以忽略 Node的数据项操作 private static int MaxItems = 3; private List<int> itemArray = new List<int>(MaxItems); public bool IsFull { g...

weixin_30823001的博客 99

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

leetcode 树总结

下面对leetcode中tree类下面的一些题目进行了总结,其中包括top 100 liked qusetions和top interviewquestions.   1.  二叉树的基本操作 find,insert(递归、非递归方法), create, delete. 删除的节点带有左右孩子,可以用直接前驱(被删除节点最右分支的节点)或是直接后继(被删除节点最左分支的节点)代替被删除节点

李白-2017的博客 482

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

B-树的C++实现

发布一个B-树的代码 代码下载:http://bluedog.download.youkuaiyun.com B-<span style="font-family:宋体;mso-ascii-font-family:">树网上的代码很象不是很多,关于它的原理我觉得没有必要要谈了,书上网上太多了。这里我花了几天的时间写了一个,大家觉得有用的话就用吧,已经进行大量的测试,应该没有什么太大问题

BlueDog专栏 3915

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构—2-3树、2-3-4树、B树、B+树等多路查找树的原理详解

详细介绍了多路查找树中的2-3树、2-3-4树、B树、B+树的概念、原理以及区别,以及它们的应用场景。

终生学习践行者 4706

B-树中的2-3树的C实现代码

    《数据结构》中比较重要的一个结构就是树。其中就有一个B树,可细分为B树、B-树,B+树,B*树,红黑树等。下面列出的代码是B-树中的2-3树的实现代码,该代码也是在网上查找到的,但是发现网上80%的代码最是有问题的,可能最初的上传者没有注意,后来的复制者就狂复制,根本就没有调试过程序。下面笔者贴出正确的代码(这里的正确是指没有排版问题的)。该代码可以在Linux下,用gcc进行编译,也可以

lbs_263的专栏 4427

python实现B树及2-3树(自用笔记)

B树及2-3树的python实现 B树(或称B-树)是一种适用于外查找的树,它是一种平衡的多叉树。 阶为M的B树具有下列结构特征: 1.树的根或者是一片树叶,或者其儿子数在2和M之间。 2.除根节点外的所有非树叶节点儿子数在┌M/2┐和 M之间。 3.所有的树叶都在相同的高度。 4.节点中包括n个关键字,n+1个指针,一般形式为: (n,P0,K1,P1,K2,P2,…,Kn,Pn)。每个结点中关...

weixin_44222183的博客 1656

2-3 树的实现分析

在2-3树中,每个内部节点(非叶子节点)有两个或三个孩子,而且所有叶子都在同一级别上。例如,图1显示高度为3的2-3树。包含两个孩子的节点称为2-节点,二叉树中的节点都是2-节点;包含三个孩子的节点称为3-节点。 图1:高度为3的2-3树 2-3树不是二叉树,其节点可拥有3个孩子。不过,2-3树与满二叉树相似。若某棵2-3树不包含3-节点,则看上去像满二叉树,其所有内部节点都可有两个孩子,

598

2-3树与2-3-4树

2-3树   2-3树是一棵自平衡的多路查找树,它并不是一棵二叉树,具有如下性质: (1)每个节点有1个或2个key,对应的子节点为2个子节点或3个子节点; (2)所有叶子节点到根节点的长度一致; (3)每个节点的key从左到右保持了从小到大的顺序,两个key之间的子树中所有的key一定大于它的父节点的左key,小于父节点的右key。   如下图所示,   为什么会有2-3树这种数...

金发只是水一下的博客 8505
上一篇: 平衡二叉树AVL的基本操作之删除
下一篇: 2-3-4树
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值