数据存储( 散列表,B+树,二叉排序树)一些知识回顾
2011-10-06 17:05
357 查看
2011-10-6日:数据存储;散列表,B+树,二叉排序树,平衡二叉树
计算机程序主要关注两个核心的东西,一个是数据的存储,一个是数据的计算。在不同的编程的层次上,这两个核心的概念对应的实现方式不一定相同。今天去图书馆看了会书,回顾了数据结构中的一些关于数据存储的内容。
常用的顺序存储方式没有回顾,主要回顾了一些高效的数据存储的数据结构。
1:散列表。散列表是用散列的方式存储数据的一种数据结构。是一种非常实用的数据结构。普通的程序员在程序设计中也经常实际用到。一些重要的概念:散列函数,冲突函数; 直接定址法,除留余数法,线性探测,二次探测,溢出表法,链地址法。
2:B+树。B+树是存储记录索引的方式之一(其他方式如多级索引)。这种在普通的程序设计中不经常使用,文件系统中,一种目录索引的组织方式就是B+树。一些自己组织大量的(如上亿个)记录的程序中,如果内存空间不足以存放这些记录,那么采用散列存储则不行,因为内存空间不够大,需要把记录放在外存储器上的时候,可能会需要自己在具体问题中去实现这种数据结构。
3:二叉排序树。二叉排序树也是组织数据结构的一种高效的方式。首先空树是二叉排序树;二叉排序树是这么一颗树,任何一个根结点,其左子树的任何一个元素小于根结点,右子树的任何一个元素大于根结点;同时任何一个根结点其左子树是二叉排序树,右子树也是二叉排序树。中序遍历二叉排序树得到的是有序的序列。二叉排序树的高度,就是查找的最大次数。 二分查找判定树,“快速排序生成树”都是一颗二叉排序树。。。
4:平衡二叉树。当然实际更实用的是二叉排序树的一种进化版-> 平衡二叉树。采用平衡二叉树,可以使得二叉排序树的查找时间复杂度接近二分查找。那为什么我们不只用二分查找呢?原因是因为二分查找适合于数据元素变动较少的情况;平衡二叉树适合于数据元素经常插入删除的“动态”情况。
其他一些点:
尾递归可以容易转化成非递归的原因是递归的语句是算法的最后一条,因此保存的返回地址和参数变量等不需要实用。因此可以直接用循环的方式把递归转换成非递归。二叉排序树的查找就是一种尾递归。
譬如二叉排序树的递归和非递归方式的关键语句如下:
BST* findx(BST* bst)//递归
{
if(bst==NULL)
return NULL;
else
{
if(bst->data==x)
return bst;
else if( bst->data < x)
return findx(bst->lchild)
else
return findx(bst->rchild)
}
}
BST* findx(BST *bst)//非递归
{
if(bst==NULL)
return NULL;
BST* p=bst;
while(p!=NULL)
{
if(p->data == x)
return p;
else if(p->data < x)
p=p->lchild;
else
p=p->rchild;
}
}
文件:流式文件;记录文件;
索引结构的组织方式问题;
计算机程序主要关注两个核心的东西,一个是数据的存储,一个是数据的计算。在不同的编程的层次上,这两个核心的概念对应的实现方式不一定相同。今天去图书馆看了会书,回顾了数据结构中的一些关于数据存储的内容。
常用的顺序存储方式没有回顾,主要回顾了一些高效的数据存储的数据结构。
1:散列表。散列表是用散列的方式存储数据的一种数据结构。是一种非常实用的数据结构。普通的程序员在程序设计中也经常实际用到。一些重要的概念:散列函数,冲突函数; 直接定址法,除留余数法,线性探测,二次探测,溢出表法,链地址法。
2:B+树。B+树是存储记录索引的方式之一(其他方式如多级索引)。这种在普通的程序设计中不经常使用,文件系统中,一种目录索引的组织方式就是B+树。一些自己组织大量的(如上亿个)记录的程序中,如果内存空间不足以存放这些记录,那么采用散列存储则不行,因为内存空间不够大,需要把记录放在外存储器上的时候,可能会需要自己在具体问题中去实现这种数据结构。
3:二叉排序树。二叉排序树也是组织数据结构的一种高效的方式。首先空树是二叉排序树;二叉排序树是这么一颗树,任何一个根结点,其左子树的任何一个元素小于根结点,右子树的任何一个元素大于根结点;同时任何一个根结点其左子树是二叉排序树,右子树也是二叉排序树。中序遍历二叉排序树得到的是有序的序列。二叉排序树的高度,就是查找的最大次数。 二分查找判定树,“快速排序生成树”都是一颗二叉排序树。。。
4:平衡二叉树。当然实际更实用的是二叉排序树的一种进化版-> 平衡二叉树。采用平衡二叉树,可以使得二叉排序树的查找时间复杂度接近二分查找。那为什么我们不只用二分查找呢?原因是因为二分查找适合于数据元素变动较少的情况;平衡二叉树适合于数据元素经常插入删除的“动态”情况。
其他一些点:
尾递归可以容易转化成非递归的原因是递归的语句是算法的最后一条,因此保存的返回地址和参数变量等不需要实用。因此可以直接用循环的方式把递归转换成非递归。二叉排序树的查找就是一种尾递归。
譬如二叉排序树的递归和非递归方式的关键语句如下:
BST* findx(BST* bst)//递归
{
if(bst==NULL)
return NULL;
else
{
if(bst->data==x)
return bst;
else if( bst->data < x)
return findx(bst->lchild)
else
return findx(bst->rchild)
}
}
BST* findx(BST *bst)//非递归
{
if(bst==NULL)
return NULL;
BST* p=bst;
while(p!=NULL)
{
if(p->data == x)
return p;
else if(p->data < x)
p=p->lchild;
else
p=p->rchild;
}
}
文件:流式文件;记录文件;
索引结构的组织方式问题;
相关文章推荐
- 【C#小知识】C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用
- 【C#小知识】C#中一些易混淆概念总结---------数据类型存储,方法调用,out和ref参数的使用
- 四种数据存储结构---顺序存储 链接存储 索引存储 散列存储
- Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结
- Android中一些数据存储函数的封装
- 关于android中数据持久化存储的方法的知识整理
- 数据存储知识(1)--关系型数据库
- 数据存储知识(2)--Mysql查看执行计划
- 一些关于数据存储和查询优化的想法
- Android有关JNI 学习(两)为JNI方法名称,数据类型和方法签名的一些知识
- JAVA基础知识回顾(基本数据类型,switch参数,equals与==的区别,Object有哪些公用方法)-1
- 透镜成像的一些知识回顾
- 如何得到应用的context以使用这个context 得到应用的安装目录下的files目录,将一些数据存储在这里
- 设计模式知识连载(39)---数据访问对象模式---本地存储DAO
- EDM数据营销的一些知识介绍
- 基础知识:android 数据存储--->文件存储
- android数据存储读取5:Sqlite一些要注意的地方
- 技术层--必备数据知识(2):数据仓库之数据存储
- 关于数据类型的一些知识
- 关于数据存储的一些琐事