顺序结构

顺序栈(Sequence Stack)

1

2

3

4

5

6typedef struct {

ElemType *elem;

int top;

int size;

int increment;

} SqSrack;

队列(Sequence Queue)1

2

3

4

5

6typedef struct {

ElemType * elem;

int front;

int rear;

int maxSize;

}SqQueue;

非循环队列

SqQueue.rear++

循环队列

SqQueue.rear = (SqQueue.rear + 1) % SqQueue.maxSize

顺序表(Sequence List)

1

2

3

4

5

6typedef struct {

ElemType *elem;

int length;

int size;

int increment;

} SqList;

链式结构1

2

3

4typedef struct {

ElemType data;

struct *next;

} LNode, *LinkList;

链队列(Linked Queue)

线性表的链式表示

单链表(Linked List)

双向链表

循环链表

哈希表

概念

哈希函数:H(key): K -> D , key ∈ K

构造方法直接定址法

除留余数法

数字分析法

折叠法

平方取中法

冲突处理方法链地址法:key相同的用单链表链接

开放定址法线性探测法:key 相同 -> 放到 key 的下一个位置,Hi = (H(key) + i) % m

二次探测法:key 相同 -> 放到 Di = 1^2, -1^2, ..., ±(k)^2,(k<=m/2)

随机探测法:H = (H(key) + 伪随机数) % m

线性探测的哈希表数据结构

1

2

3

4

5

6

7

8

9

10

11

12typedef char KeyType;

typedef struct {

KeyType key;

}RcdType;

typedef struct {

RcdType *rcd;

int size;

int count;

bool *tag;

}HashTable;

递归

概念

函数直接或间接地调用自身。

递归与分治分治法问题的分解

问题规模的分解

折半查找(递归)

归并查找(递归)

快速排序(递归)

递归与迭代迭代:反复利用变量旧值推出新值

折半查找(迭代)

归并查找(迭代)

广义表

头尾链表存储表示

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16typedef enum {ATOM, LIST} ElemTag;

// ATOM==0:原子,LIST==1:子表

typedef struct GLNode {

ElemTag tag;

// 公共部分,用于区分原子结点和表结点

union {

// 原子结点和表结点的联合部分

AtomType atom;

// atom 是原子结点的值域,AtomType 由用户定义

struct {

struct GLNode *hp, *tp;

} ptr;

// ptr 是表结点的指针域,prt.hp 和 ptr.tp 分别指向表头和表尾

} a;

} *GList, GLNode;

扩展线性链表存储表示

1

2

3

4

5

6

7

8

9

10

11

12

13

14// 广义表的扩展线性链表存储表示

typedef enum {ATOM, LIST} ElemTag;

// ATOM==0:原子,LIST==1:子表

typedef struct GLNode1 {

ElemTag tag;

// 公共部分,用于区分原子结点和表结点

union {

// 原子结点和表结点的联合部分

AtomType atom; // 原子结点的值域

struct GLNode1 *hp; // 表结点的表头指针

} a;

struct GLNode1 *tp;

// 相当于线性链表的 next,指向下一个元素结点

} *GList1, GLNode1;

二叉树

性质非空二叉树第 i 层最多$2^{i-1}$个结点 (i >= 1)

深度为 k 的二叉树最多$2^k-1$个结点 (k >= 1)

度为 0 的结点数为$n_0$,度为 2 的结点数为 $n_2$,则$n_0 = n_2+1$

有 n 个结点的完全二叉树深度 k = ⌊ log2(n) ⌋ + 1

对于含 n 个结点的完全二叉树中编号为 i(1 <= i <= n) 的结点若i = 1,为根,否则双亲为⌊ i / 2 ⌋

若2i > n,则i 结点没有左孩子,否则孩子编号为 2i

若 2i + 1 > n,则i结点没有右孩子,否则孩子编号为 2i + 1

存储结构1

2

3

4

5typedef struct BiTNode

{

TElemType data;

struct BiTNode *lchild, *rchild;

}BiTNode, *BiTree;

顺序存储

链式存储

遍历方式先序遍历

中序遍历

后续遍历

层次遍历

分类满二叉树

完全二叉树(堆)大顶堆:根 >= 左 && 根 >= 右

小顶堆:根 <= 左 && 根 <= 右

二叉查找树(二叉排序树):左 < 根 < 右

平衡二叉树(AVL树):| 左子树树高 - 右子树树高 | <= 1

最小失衡树:平衡二叉树插入新结点导致失衡的子树:调整:LL型:根的左孩子右旋

RR型:根的右孩子左旋

LR型:根的左孩子左旋,再右旋

RL型:右孩子的左子树,先右旋,再左旋

其他树及森林

树的存储结构双亲表示法

双亲孩子表示法

孩子兄弟表示法

并查集

一种不相交的子集所构成的集合 S = {S1, S2, ..., Sn}

平衡二叉树(AVL树)

性质| 左子树树高 - 右子树树高 | <= 1

平衡二叉树必定是二叉搜索树,反之则不一定

最小二叉平衡树的节点的公式:F(n)=F(n-1)+F(n-2)+1 (1 是根节点,F(n-1) 是左子树的节点数量,F(n-2) 是右子树的节点数量)

最小失衡树

平衡二叉树插入新结点导致失衡的子树

调整:

LL 型:根的左孩子右旋

RR 型:根的右孩子左旋

LR 型:根的左孩子左旋,再右旋

RL 型:右孩子的左子树,先右旋,再左旋

红黑树

红黑树的特征是什么?节点是红色或黑色。

根是黑色。

所有叶子都是黑色(叶子是 NIL 节点)。

每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)(新增节点的父节点必须相同)

从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。(新增节点必须为红)

调整变色

左旋

右旋

应用关联数组:如 STL 中的 map、set

红黑树、B 树、B+ 树的区别?红黑树的深度比较大,而 B 树和 B+ 树的深度则相对要小一些

B+ 树则将数据都保存在叶子节点,同时通过链表的形式将他们连接在一起。

B 树(B-tree)、B+ 树(B+-tree)

特点一般化的二叉查找树(binary search tree)

“矮胖”,内部(非叶子)节点可以拥有可变数量的子节点(数量范围预先定义好)

应用大部分文件系统、数据库系统都采用B树、B+树作为索引结构

区别B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。

B+树中所有叶子节点都是通过指针连接在一起,而B树不会。

B树的优点

对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。

B+树的优点非叶子节点不会带上 ROWID,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。

叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动。

八叉树

八叉树(octree),或称八元树,是一种用于描述三维空间(划分空间)的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。一般中心点作为节点的分叉中心。

用途三维计算机图形

最邻近搜索

算法

排序排序算法

平均时间复杂度

最差时间复杂度

空间复杂度

数据对象稳定性

O(n2)

O(n2)

O(1)

稳定

O(n2)

O(n2)

O(1)

数组不稳定、链表稳定

O(n2)

O(n2)

O(1)

稳定

O(n*log2n)

O(n2)

O(log2n)

不稳定

O(n*log2n)

O(n*log2n)

O(1)

不稳定

O(n*log2n)

O(n*log2n)

O(n)

稳定

O(n*log2n)

O(n2)

O(1)

不稳定

O(n+m)

O(n+m)

O(n+m)

稳定

O(n)

O(n)

O(m)

稳定

O(k*n)

O(n2)

稳定

均按从小到大排列

k:代表数值中的 “数位” 个数

n:代表数据规模

m:代表数据的最大值减最小值

查找查找算法

平均时间复杂度

空间复杂度

查找条件

O(n)

O(1)

无序或有序

O(log2n)

O(1)

有序

O(log2(log2n))

O(1)

有序

O(log2n)

O(1)

有序

O(1)

O(n)

无序或有序

O(log2n)

2-3树

O(log2n - log3n)

B树/B+树

O(log2n)

图搜索算法图搜索算法

数据结构

遍历时间复杂度

空间复杂度

邻接矩阵

邻接链表

O(|v|2)

O(|v|+|E|)

O(|v|2)

O(|v|+|E|)

邻接矩阵

邻接链表

O(v|2)

O(|v|+|E|)

O(|v|2)

O(|v|+|E|)

其他算法算法

思想

应用

把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并

循环赛日程安排问题、排序算法(快速排序、归并排序)

通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,适用于有重叠子问题和最优子结构性质的问题

背包问题、斐波那契数列

一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法

旅行推销员问题(最短路径问题)、最小生成树、哈夫曼编码

python实现单链表快速排序升序linkedqueue_数据结构回顾相关推荐

  1. python实现单链表快速排序升序linkedqueue_数据结构1

    一. ( (本题 15 分)试设计一个结点数据类型为整型的带表头结点的有序单 链表,然后设计一个算法,该算法将这个有序单链表划分成两个单链表,使 得第一个单链表中包含原单链表中所有数值为奇数的结点, ...

  2. python实现单链表快速排序升序linkedqueue_同时对多个数组进行排序

    关于 同时对多个数组进行排序的搜索结果 回答 本人学习数据结构时看到的不错的总结,共享一下了 文件有一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字; 排序是将文件按关键字的递增(减) ...

  3. python实现单链表快速排序升序linkedqueue_LeetCode 总结 - 搞定 Linked List 面试题

    链表删除 [203] Remove Linked List Elements [19] Remove Nth Node From End of List [83] Remove Duplicates ...

  4. 数据结构与算法-python描述-单链表

    # coding:utf-8# 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元素 ...

  5. C语言单链表实现FCFS算法,数据结构与算法复习题(含答案).doc

    <数据结构与算法>2015-2016学年第1学期考试复习题 选择题(下面各小题有一个正确答案,请将正确答案的编号填写在各小题的括号内). 1.在一棵具有5层的满二叉树中结点总数为( A ) ...

  6. 数据结构--单链表single linked list数据结构C++实现

    2018年2月开始学习的 C++ Primer,到今天2019年3月已经整整一年了,非常感谢在一起交流的小伙伴,是你们的无私帮助和分享使得我能跨越很多技术的坑,感谢你们!期待我们2019年一起拿下&l ...

  7. python实现单链表与双向链表

    首先看单链表class Chain(): def __init__(self):self.first = Noneself.length = 0def is_empty(self):"&qu ...

  8. 排序算法——单链表快速排序(划分函数从一边划分)

    我们知道了普通的快速排序利用的划分函数是从两边向中间划分,但是对于单链表,这种划分函数可就显得不这么适用了.原因在于单链表每个节点只存在存放后一个结点的指针域,找到后一个节点容易,但是想要找到前一个结 ...

  9. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

最新文章

  1. a和a数值大小 计算机,Java求s=a+aa+aaa+aaaa+aa...a的值
  2. 将带空格的字符串去掉空格.join()函数
  3. ubuntu 内存占用解析
  4. randn函数加噪声_损失函数 (Loss Function)
  5. Java中数组的地址问题(hashCode解析):
  6. Hive之DDL数据定义
  7. OpenCV学习笔记七-创建滑动条
  8. 集合计数 (容斥原理)
  9. 关于操作 ASP.NET Web API的实例
  10. mysql 主键互换_MySQL-什么方法可以快速的交换两条记录的ID?
  11. SHA-256 加密原理
  12. 蓝桥杯dfs搜索专题
  13. Shiro框架中有三个核心概念:Subject ,SecurityManager和Realms。
  14. 小米手机用什么蓝牙耳机好?高颜值游戏专属蓝牙耳机推荐
  15. 谷歌浏览器 cococut version 视频下载插件配合倍速插件快速下载视频
  16. python大纲图_干货!!python自学大纲!
  17. firefly-rk3288开发板Linux驱动——AT24C02 E2PROM驱动
  18. java例题 汽油检测
  19. pgadmin数据输出不存在了?
  20. 蓝桥杯 试题 算法提高 阴谋(C++)

热门文章

  1. Unity的DrawCall
  2. (微信小程序)二 : 创建一个页面
  3. 终端中出现While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod错误的修改方法...
  4. SharePoint PowerShell使用Export-SPWeb和Import-SPWeb指令来导出和导入网站
  5. ImageButton 无法显示
  6. BIM工程信息管理系统-EF实体框架数据操作基类
  7. Nodejs模块初始化
  8. Oracle 11g-R2 SQL Developer连接MSSQL2008
  9. NSRunLoop 概述和原理
  10. Win7小工具“概念时钟”,v2.1.8.6