【图解算法-C语言】-- 2.常用数据结构

第2章–常用数据结构

初步认识数据结构
数据与信息

数据:指的是一种未经处理的原始文字、数字、符号或图形可分为两大类:
1. 数值数据
2. 字符数据

信息:利用大量的数据,经过有系统的整理、分析、筛选处理而提炼出来的,且具有参考价格以及提供决策依据的文字、数字、符号或图标
数据处理:就是用人力或机器设备对数据进行系统的整理,如记录、排序、合并、计算、统计等,以使原始的数据符合需求,成为有用的信息。

数据结构:主要是表示数据在计算机内存中所存储的位置及其模式,分为以下三类:

  1. 基本数据类型:不能以其他类型来定义的数据类型或称为标量数据类型,如c语言中的float、int、double、char、void等
  2. 结构化数据类型:也称为虚拟数据类型,一种比基本数据类型更高一级的数据类型,例如:字符串、数组、指针、列表、文件等
  3. 抽象数据类型(Abstract Data Type):指一个数学模型以及定义在数学模型上的一组数学运算或操作。ADT 在计算机中表示的是一种”信息隐藏“的程序设计思想以及信息之间某一种特定的关系模式。
数据结构种类
数组(Array)

数组结构就是一排紧密相连的可数内存,并提供了一个能够直接访问单一数据内容的计算方法。数组的索引(下标)用来表示此内存起始位置的第几个区块。

  1. 一维数组:C语言中的声明方式 int score[5];表示名为score长度为5的整型数组

  2. 二维数组:声明方式数据类型 二维数组名 [行大小][列大小];例如int number [2][3] = {{1,2,3},{1,2,3}};

  3. 三维数组:C语言中的声明示例

    int num[2][3][3] = {
    					{{33,45,67},
    					{23,71,56},
    					{55,38,66}},
    					{{21,9,15},
    					{38,69,18},
    					{90,101,89}}
    					};
    
链表

Linked List 由许多相同数据类型的数据按特定顺序排列而成的线性表。链表的特性是各个数据项在计算机内存中的位置是不连续且随机存放的。优点是数据的插入和删除方便,缺点是设计数据结构时较为麻烦,并且查找数据时无法像静态数据那样随机读取数据,必须按序查找到该数据为止。

在动态分配内存空间时,最常使用的就是”单向链表“

  • 一个单向链表节点基本上是由数据字段和指针两个元素所组成的

  • 单向链表中第一个节点是”链表头指针“,指向最后一个节点的指针设为NULL,表示它是”链表尾“,不指向任何地方
    在这里插入图片描述

  • “链表头指针”非常重要,只要存在就能遍历整个链表、进行加入和删除节点等操作。注意:除非必要,否则不可移动链表头指针

堆栈

Stack 是一群相同数据形态和组合,所有动作均在顶端进行,具有”后进先出“(Last In First Out, LIFO)的特性

堆栈是一种抽象型数据结构,特性如下:

  • 只能从堆栈的顶端存取数据
  • 数据的存取符合”后进先出“的原则
队列

Queue 和堆栈都是有序列表,也属于抽象数据类型ADT,所有的加入与删除动作发生在不同的两端,符合”先进先出“(First In First Out)的特性。

队列在计算机领域的应用也相当广泛,如计算机的模拟、CPU的作业调度(Job Scheduling)、外围设备联机并发处理系统的应用与图像遍历的广度优先搜索算法(BFS

堆栈只需要一个顶端top, 指针执行堆栈顶端;而队列则必须使用front和rear两个指针分别指向队列前端和队列尾端,如下图:

在这里插入图片描述

树结构

Tree 由一个或一个以上的节点(Node) 组成。树中存在一个特殊的节点,称为树根(Root)。每个节点都是一些数据和指针组合而成的记录。

合法的树,节点间虽可以互相连接,但不能形成无出口的回路

树结构的专有名词

在这里插入图片描述

  • 度数(degree) : 每个节点的所有子树的个数。图中的B的度数为2,D的度数为3,F、K、I、J度数为0

  • 层数 (level) : 树的层数,假设树根A为第一层,那么B、C、D的层数为2,E、F、G、H、I、J的层数为3

  • 高度 (Height) : 树的最大层数,上图树的高度为4

  • 父节点 :与一个节点连接的上一层节点

  • 子节点:与一个节点连接的下一层节点

  • 祖先和子孙:所谓祖先,是指从树根到该节点路径上所包含的节点,而子孙则是在该节点往下追溯子树中的任一节点

  • 兄弟节点:有共同父节点的节点

  • 非终端节点:树叶以外的节点

  • 同代:在一棵树中具有相同层数的节点

  • 森林:n棵(n>=0)互斥树的集合,如图是包含三棵树的森林:

在这里插入图片描述

二叉树

一般树结构在计算机内存中的存储方式是以链表 (Linked List) 为主的。对于n叉树(n-way树)来说,因为每个节点的度数都不相同,所以我们必须为每个节点都预留存放n个连接字段的最大存储空间。

每个结点的数据结构如下:

在这里插入图片描述

这种n叉树十分浪费链接存储空间…

当n=2时,链接浪费率最低,为改善存储空间浪费的缺点,经常使用二叉树(Binary Tree)结构来取代其他树结构

二叉树(又称Knuth树)是一个由有限节点所组成的集合。此集合可以为空集,或者由一个树根及其左右两个子树所组成。简单地说,二叉树最多只能有两个子节点,就是度数小于或等于2。其计算机中的数据结构如下图:
在这里插入图片描述

二叉树和一般树的不同之处:

  1. 树不可谓空集合,但是二叉树可以
  2. 树的度数为d>=0,但是二叉树的节点度数为 0<= d<=2
  3. 树的子树间没有次序关系,二叉树则有
图论简介

图论(graph theory) :

图的定义

图是由“顶点”和“边”所组成的集合,通常用G=(V,E)来表示,其中V是所有顶点组成的集合,而E代表所有边组成的集合。

图的种类:

  1. 无向图(Graph):一种边没有方向的图,即具有相同边的两个顶点没有次序关系

在这里插入图片描述

V = {A,B,C,D,E}
E = {{A,B},{A,E},{B,C},{B,D},{C,D},{C,E},{D,E}}
  1. 有向图(Digraph):是一种每一条边都可以用有序对<V1,V2>(V1为尾端指向头部的V2)来表示的图

在这里插入图片描述

V = {A,B,C,D,E}
E = {<A,B>,<B,C>,<C,D>,<C,E>,<E,D>,<D,B>} 
哈希表

哈希表是一种存储记录的连续内存,通过哈希函数的应用,可以快速存取与查找数据。基本上,所谓哈希法(Hashing)就是将本身的键(Key),通过特定的数学函数运算或者其他方法,转换成对应的数据存储地址,如图所示。注:哈希法所使用的数学函数称为“哈希函数”。另外Key在不混淆“键-值对”时也可以称之为键值。

在这里插入图片描述

哈希函数相关名词:

  • Bucket(桶):哈希表中存储数据的位置,每一个位置对应唯一的地址(Bucket Address)。桶就好比存在一个记录的位置
  • Slot(槽):每一个记录中可能包含多个字段,Slot指的就是“桶”中的字段。
  • Collision(碰撞):两个不同的数据经过哈希函数运算后对应到相同的地址
  • 溢出:如果数据经过哈希函数运算后所对应的Bucket已满,就会使Bucket发生溢出
  • 哈希表:存储记录的连续内存。哈希表是一种类似数据表的索引表格,其中可分为n个Bucket,每个Bucket又可分为m个Slot,如下表所示

在这里插入图片描述

  • 同义词:当两个标识符通过哈希函数运算后所得的数值相同,就称这两个标识符对于此哈希函数是同义词
  • 加载密度:标识符的使用数目除以哈希表内槽的总数,
  • 完美哈希:没有碰撞也没有溢出的哈希函数

设计哈希函数时应该遵循以下原则:

  1. 避免碰撞和溢出的发生
  2. 哈希函数不宜过于复杂,越容易计算越佳
  3. 尽量把文字的键值转换成数字的键值,以利于哈希函数的运算
  4. 所涉及的哈希函数计算得到的值尽量能均匀地分布在每一通中,不要过于集中在某些桶中,这样既能降低碰撞又能减少溢出
  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值