数据结构拾遗

对于常见数据结构的一个个人容易忘记的重点总结,用于找工作的时候快速复习吧

链表

有一个head指针,插入与删除时候指定位置,

插入:

使用new分配内存,将插入节点执行深考贝。指定位置插入,用插入节点的next指向该位置的next,该位置的next指向插入节点。

删除:

指点位置删除,先找出前向节点,前向节点的next指向后向节点,delete删除节点的分配的内存。

有一个top指针,每次针对秋裤指针进行。实现方式有链表实现和循环数组实现。

二叉查找树

置空、查找、查最大、查最小、插入全部使用递归,记得递归函数要返回当前查找树。

删除:

分情况删除或者懒惰删除。分情况删除如下三点。懒惰删除是不删除当前节点,只是给其作上标记,记为已删除,此方法适用于删除不多的情况。
分情况删除,使用递归找到要删除的节点,按以下三种情况分析:
1、树叶:直接删除
2、有唯一子节点:将父节点指向唯一子结点,删除当前节点。
3、有两个儿子:将右子树的最小节点替换到当前位置。而右子树的最小节点不存在左子节点,故可将最小节点的删除情况按照情况1、2来处理。
由于总是用右子树的最小节点来替换要删除节点,久之将导致左子树比右子树深。在没有删除和懒惰删除的情况下,二叉查找树的所有操作平均运行时间为log(N)

AVL树

有平衡条件的二叉树:每个节点的左子树与右子树的高度最多差1。实际高度可由类似斐波那契数推出,比log(N)稍多。除去插入外,其它操作时间为log(N)。

插入:

由于插入可能破坏AVL树的特性,可以使用旋转来修正。对于需要重新平衡的节点a,可能存在四种情况:
1、对a的左子节点的左子树进行一次插入 插入发生在外部(左-左),可用单旋转
2、对a的左子节点的右子树进行一次插入 插入发生在内部(左-右),可用双旋转
3、对a的右子节点的左子树进行一次插入 插入发生在内部(右-左),可用双旋转
4、对a的右子节点的右子树进行一次插入 插入发生在外部(右-右),可用单旋转

伸展树

基本思想:当一个节点被访问后,它就经过一系列AVL树的旋转操作被放到根上。因为一个节点被访问,它很可能不久后会被再次访问。这种方法保证从空树开始任意连续M次对树的操作最多花费M*log(N)时间,即每次的摊还代价是log(N)。

B树

M阶B树是满足下列条件的树:
1、树的根或者是一片树叶,或者其儿子数在2和M之间
2、除根外,所有非树叶节点的儿子树在[M/2]和M之间
3、所有的树叶都在相同的深度上
所有数据都存储于树叶上,每一个内部节点上皆含有指向该节点各儿子的指针P1,P2……PM和分别代表在子树P2,P3……PM中发现的最小关键字的值k1,k2……k(M-1)。对于每一个节点,其子树P1中所有的关键字都小于子树P2的关键字。树叶所包含所有实际数据,这些数据或者是关键字本身,或者指向含 有这些关键字的记录的指针。
其最大深度是[log_[M/2]N](即log以[M/2]为底,N的对数)。查找使用logN时间,插入和删除使用M时间。
B树实际用于数据库,在那里树被存储在物理磁盘上而不是主存中,根节点存于主存中。虽然每次磁盘访问花费logM来确定分支方向,但执行该操作的时间一般比读存储器的区块(block)所花费的时间少得多。

插入:

困难发生于当前节点已有M个关键字时,我们应把它分裂为两个节点,而这使得父节点多了一个儿子,因而我们必须检查这个节点是否可被父节点所接受。如果父节点已有M个节点,则父节点要被分裂成两个节点。往上重复这个过程。当分裂到根节点时,则应创建一个新根,使它具有两个子节点。

B+树

在B-树基础上,为叶子结点增加链表指针,非叶子结点的子树指针与关键字个数相同;非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

优先队列(堆)最少可执行两种操作,插入与删除最小者。

通过数组来实现,而且通常浪费掉数组的x[0]位置以简便计算。用数组x[1]~x[n]总计n+1的数组来实现具有n个数据的堆。

二叉堆

底层上的元素从左到右完全填满的二叉树,叫完全二叉树。其可由一个数组、代表最大值的整数、当前堆的大小来实现。
满足堆序性的二叉树称为二叉堆。堆序性:所有子节点小于父节点,根节点最小。

插入:

采用的策略叫上滤。当前节点p通过反复的与其父节点位置p/2比较,当小于父节点时则交换,到最终停止。

删除最小者:

依次找出子节点中最小者补上。 (此方法不可行!!!)将破坏完全堆的形式
正确的方法应为:取出x[1]的值待用,赋值x[1]=x[n],再将x[1](此时为原x[n]的值)进行下滤。如此可保证是完全堆。
假设当前位置为i,设c=2*i。if c>n终止,if c+1<n 则比较x[c]与x[c+1],if x[c]>x[c+1]   则 c=c+1。比较x[i]与x[c],若x[i]>x[c]则下滤,否则则终止。

堆排序:
使用一个数组,全部入堆,再swap堆的第一位与最后一位,数组长度固定,左侧为堆,将通过删除最小者而不数缩减。而删除的最小者,都依次放于原堆的最后位置上,当所有元素依最小次序出堆,则数组将达到从右至左从小到大排序。
此种排序方法重用了数组空间。如下图,纵向从上往下为时间方向,横向为数组内容。可见最开始为空数组,入堆,后一边出堆一边排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值