线性关系(线性结构):是指在数据元素的非空有限集合中有且仅有一个首元素的数据元素,有且只有一个尾元素的数据元素,其余的数据元素均有且只有一个直接前驱元素和一个直接后继元素
常见的线性结构:线性表,队列,栈,串,数组。

非线性结构:线性结构的元素之间具有线性关系,非线性结构中的元素之间不再是序列的关系,他们呈现的是更复杂的层次关系,即一个数据元素有且仅有一个直接前驱,但可有另个或者多个直接后继,显然比序列关系复杂
常见非线性结构:树,图

散列表

PHP中的hashtable就是哈希表就是由数组和链表组成,一个长度为16的数组中,每个元素存储的是一个链表的头结点。而HashMap和Hashtable就是哈希表结构

表(list)

操作PrintList,Find,Delete,Insert
1.使用数组(array)实现
定义一个数组的时候,通常需要对表的大小进行估计(因为数组的元素之间物理地址是相连续的,所以需要一次性分配),一般需要估计的大一些,自然会浪费掉一些空间。
PrintList和Find肯定是跟表的大小是相关的,也就是线性的。FindKth的花费就是常数时间
Insert和Delete的代价很大。比如在表的位置0插入(Insert)一个新元素,那么整个数组的元素都要后移一位。删除第一个元素也需要将后面的所有元素都向前移动一位。
所以表的结构使用数组来实现显然不是好的选择
2.使用链表(linked list)实现
链表是由一系列不必在内存中中相连的结构组成,每个结构都含有表元素和一个执行包含该元素的后继元素物理地址的结构的指针,称之为next指针。最后一个单元的next指针为NULL
PrintList(L)和Find(L,Key),我们只要将一个指针传递到该表的第一个元素,然后用一些next指针贯穿该表即可,花费时间是跟表的大小线性相关的。
FindKth(L,i)花费时间O(i)
Delete操作只是将被删除元素的前驱元素的next指针修改为被删除元素的next指针就可以了

Insert元素只需要一次malloc从系统申请一个新单元并且执行两次指针调整就可以了

对于大量的输入数据,链表的线性访问时间太慢。树的大部分操作的运行时间平均为O(logN)。一棵树是由N个节点和N-1条边的集合,其中一个节点是根结点,每条边都将某个节点连接到它的父亲,而除去根结点外每一个节点都有一个父亲
树的存储实现:
结点即为数据元素,存储比较简单和直接
分支描述的是关系,关系的存储是复杂而多样的,因此需要从存储分支信息的角度入手分析可能的解决方案。

1.双亲数组表示法
因为一条分支描述的是相邻两个结点(孩子和双亲的关系),所以就能在内存中存储所有结点信息和所有的双亲关系

2.孩子链表表示法
存储所有结点的信息和所有孩子的关系。
1>头节点结构

data域是数据域,用来存储结点信息;
first域为指针域,用来存储结点孩子链表的入口地址,此链表记录了结点的所有孩子信息
2>表节点结构

childno域用来存储某个孩子结点的编号
next域为指针域,用来执行结点的下一个孩子所对应的表结点

3.左孩子右兄弟表示法
将结点最左边的孩子(如果存在的话)成为结点的左孩子,将位于结点右边且紧挨着它的兄弟(若存在的话)称为该结点的右兄弟

二叉树
递归树的方式
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根
前序遍历中第一个数字总是根节点

线索二叉树
对一个二叉树线索化之后,可以得到某种遍历序列节点的前缀节点和后继节点。线索二叉树将一个二叉树变成了双向链表

哈夫曼树
在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现概率的方法得到的,出现概率高的字母使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的

B-Tree
来源维基百科:
Rudolf Bayer 和 Ed McCreight 于1972年,在Boeing Research Labs 工作时发明了B 树,但是他们没有解释B 代表什么意义(如果有的话)。Douglas Comer 解释说: 两位作者从来都没解释过B树的原始意义。正如我们所见,“balanced”, “broad” 或 “bushy” 可能适合。其他人建议字母“B”代表 Boeing。源自于他的赞助,不过,看起来把B树当作“Bayer”树更合适些

阶为M的B-树的特点(来自数据结构与算法分析-C语言描述):
--|树的根或者是树叶节点,或者其儿子数在2和M之间
--|除根外,所有非树叶节点的儿子数在M/2和M之间
--|所有树叶都在相同深度上
所有数据都存放在树叶节点上,当插入一个关键字,只有在访问路径上的那些内部节点才有可能发生变化。
对于一个M阶的树,比较困难情况发生在接收该关键字的节点已经有了M个关键字的时候,这个关键字是的该节点具有M+1个关键字,我们可以把它分裂成两个节点。
他们分别具有「(M+1)/2向下和(M+1)/2」向上个关键字。由于这个父节点多了一个儿子,我们必须检查这个节点是否被父节点接收,如果父节点已经有M个儿子,那么这个父节点就要被分裂成两个节点。我们重复这个过程
直到找到一个父节点具有少于M个儿子,如果我们分裂根节点,那么我们就要创建一个新的根,这个根有两个儿子。

参考资料:
线索二叉树:http://www.cnblogs.com/GumpYa...
哈夫曼编码:https://zh.wikipedia.org/zh/%...
数据库索引数据结构:http://www.cnblogs.com/zcy_so...

【数据结构】的更多相关文章

  1. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  3. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  6. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

  7. ios – Swift指针算术和解除引用;将一些类似C的地图代码转换为Swift

    我有一点似乎没有工作的Swift代码……解决方法您正在指定locationPointer指向新位置,但仍在下一行中使用ptr,并且ptr的值尚未更改.将您的最后一行更改为:或者你可以改变指向var的指针并推进它:

  8. ios – 获取资产目录文件夹中所有图像的数组

    在iOS中,是否可以获取资产目录文件夹中的图像数组?我不确定为什么会对此进行投票.我真的不知道从哪里开始.我的另一种方法是创建文件夹中所有文件的plist,但它似乎是多余的.我无法添加任何代码,因为我会添加什么?

  9. ios – 如何防止Parse保存PFObject儿童?

    我正面临着Parse和iOS的一个非常普遍的问题.我有一个类POST,具有以下结构:>text(String)>图像(PFFile)>LikesUsers(StringofString)>LikesCount(Int)>从(发布到用户的指针)如果用户(已登录)喜欢帖子.我只是递增喜欢并将用户的Objectid添加到数组中例如:User-2喜欢User-1的帖子.问题在这里.我不能保存PostObj

  10. ios – 来自调试器的消息:由于内存问题而终止

    我的应用程序使用Geojson文件.我使用MapBoxSDK将MGLpolyline添加到地图中.但问题是我的文件太大,以至于应用程序崩溃并收到错误:来自调试器的消息:由于内存问题而终止.我在第一次循环时面对66234个对象.我试图将数组块化为新数组,但没有成功.请帮我解决问题.这是我在地图上绘制的代码,这里是我的testprojectongithubuseXcode8.1如果有任何不同的第三方可

随机推荐

  1. 【数据结构】单调栈

    显然,每个发射站发来的能量有可能被0或1或2个其他发射站所接受,特别是为了安全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计算出接收最多能量的发射站接收的能量是多少。输入输出格式输入格式:第1行:一个整数N;第2到N+1行:第i+1行有两个整数Hi和Vi,表示第i个人发射站的高度和发射的能量值。输入输出样例输入样例:34235610输出样例:7题解中有讲解代码实现

  2. BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】

    有长为N的数列,不妨设为a1,a2,…Input第一行两个整数N和P。第二行含有N个非负整数,从左到右依次为a1,aN,。表示把所有满足t≤i≤g的ai改为ai×c。操作2:“2tgc”。同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。Output对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。SampleInput7431234567512553242379313347SampleOutput2358HINT初始时数列为。对第5次操作,和为29+34+15+16=

  3. 陈越《数据结构》第一讲 基本概念

    陈越《数据结构》第一讲基本概念1什么是数据结构1.1引子例子:如何在书架上摆放图书?数据结构是:1.数据对象在计算机中的组织方式;2.数据对象必定与一系列加在其上的操作相关联;3.完成这些操作所用的方法就是算法。抽象数据类型数据类型-数据对象集;-数据集合相关联的操作集。抽象-与存放数据的机器无关;-与数据存储的物理结构无关;-与实现操作的算法和编程语言均无关。

  4. 陈越《数据结构》第二章 线性结构

    表中元素个数称为线性表的长度;线性表没有元素时,称为空表;表起始位置称表头,表结束位置称表尾。插入和删除操作只能在链栈的栈顶进行。

  5. 【数据结构】

    非线性结构:线性结构的元素之间具有线性关系,非线性结构中的元素之间不再是序列的关系,他们呈现的是更复杂的层次关系,即一个数据元素有且仅有一个直接前驱,但可有另个或者多个直接后继,显然比序列关系复杂常见非线性结构:树,图散列表PHP中的hashtable就是哈希表就是由数组和链表组成,一个长度为16的数组中,每个元素存储的是一个链表的头结点。

  6. 【数据结构】【C++STL】FIFO队列&优先队列

    首先都需要打头文件queueFIFO队列是先进先出的就好像排队一样STL定义FIFO队列优先队列的话是有优先级存在的STL定义优先队列定义方式都是大根堆FIFO队列和优先队列都有一些操作COYG

  7. 【数据结构】 堆

    自底向上://增加/减少已有节点值Heap_Increase_Key//向堆插入新的节点HeapInsert自顶向下://替换堆顶后,维持堆函数KeepHeap//弹出堆顶函数Pop

  8. 【数据结构】链表

    线性表的顺序存储结构有存储密度高及能够随机存取等优点,但存在以下不足:线性表的链式存储(单链表)的实现单向循环链表的实现

  9. 伸展树(SPLAY)个人总结+模板 [平衡树]【数据结构】【模板】

    前言最近3个月内,无论是现场赛还线上赛中SPLAY出现的概率大的惊人啊啊啊!!!然而不会的我就GG了,同时发现大家都会SPLAY,,,,然后就学习了一波。——————————————————————————-附上整体代码-md贴上来太卡了,去题解里看吧维护序列的维护一堆数的

  10. BZOJ 1895 & POJ 3580 supermemo [SPLAY]【数据结构】

    Ay}Ttimes.Forexample,performing“REVOLVE242”on{1,5}INSERTxP:insertPafterAx.Forexample,performing“INSERT24”on{1,5}DELETEx:deleteAx.Forexample,performing“DELETE2”on{1,5}MINxy:querytheparticipantwhatistheminimumnumberinsub-sequence{Ax…Ay}.Forexample,thecorrec

返回
顶部