数据结构05数组和广义表

第五章 数组 和 广义表

数组广义表可以看成是线性表在下述含义上的扩展:表中的数据元素本身也是一个数据结构。

 

5.1 数组的定义

n维数组中每个元素都受着n个关系的约束,每个元素都有一个直接后继元素。

可以把二维数组看成是这样一个定长线性表:它的每个数据元素也是一个定长线性表。

数组一旦定义,它的维数和维界就不再改变。因此,除了结构的初始化销毁之外,数组只能有存取元素修改元素值的操作。

 

5.2 数组的顺序表示和实现

次序约定:

1、列序为主序 column major order  FORTRAN

2、行序为主序 row major order     C

 

假设每个数据元素占L个存储单元,则二维数组A中的任一元素aij的存储位置可由下式确定:

LOC(i,j) = LOC(0,0) + (b2 * i + j)*L

LOC(i,j)是存储位置  LOC(0,0)称为基地址或基址

 

n维数组定位公式

Array[b1][b2]...[bn]

LOC(j1,j2,...,jn) = LOC(0,0,...,0) + (jn +jn-1*bn+jn-2*bn-1*bn + ... +j2*b3*...*bn +j1*b2*...*bn)*L

 

数组元素的存储位置是其下标的线性函数。

由于计算各个元素存储位置的时间相等,所以存取数组中任一元素的时间也相等,称具有这一特点的存储结构为随机存储结构。

    

5.3 矩阵的压缩

如何存储矩阵的元,使矩阵的各种运算能有效的进行。

二维数组可以存储矩阵的元。

有的程序设计语言中还提供了各种矩阵运算。

 

压缩存储:为多个值相同的元只分配一个存储空间;对零元不分配空间。

应用压缩的两种情况:

1、特殊矩阵:值相同的元素或者零元素在矩阵中的分布有一定规律;

2、稀疏矩阵

 

对称矩阵:aij= aji  1 <= i,j <= n 称为n阶对称矩阵

可以为每一对对称元分配一个存储空间,即将n2个元压缩存储到n(n+1)/2个元空间中

以行序为主序,存储其下三角。

以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元aij之间存在一一对应的关系:

K = 

i(i - 1)/2 - 1 + j  当i>=j

j(j - 1)/2 - 1 + i  当i < j  //下标谁大谁除2,一维大是下三角内容,二维大是上三角内容

以上存法同样适用于三角矩阵。

 

三角矩阵:上/下三角中的元均为常数c或0的n阶矩阵(不含对角线)。

除了和对称矩阵一样,只存储其上/下三角中的元之外,再加一个存储常数c的存储空间即可。

对角矩阵:所有非零元集中在以主对角线为中心的带状区域中。即除了主对角线上和直接在对角线上、下方若干条对角线上的元之外,所有其他的元皆为零。

 

以上特殊矩阵,非零元的分布都有一个明显的规律,从而可以将其压缩存储到一维数组中,并找到每个非零元在一维数组中的对应关系。

 

稀疏矩阵:非零元较零元少,而且分布没有一定规律。

稀疏因子:矩阵中非零元个数与全部个数之比。

通常认为稀疏因子小于等于0.05时称为稀疏矩阵。

按照压缩存储的概念,只存储稀疏矩阵的非零元。

稀疏矩阵可由表示非零元的三元组 及其行列数唯一确定。

 

三种数据结构:三元组顺序表、行逻辑链接的顺序表、十字链表

1、三元组顺序表:以行序为主序顺序排列。

转置算法:

1、将矩阵的行列值相互交换;

2、将每个三元组中的i和j相互调换;

3、重排三元组之间的次序;

方法一:找到原矩阵的列序来进行转置。为了找到M的每一列中所有的非零元素,需要对其三元组表从第一行起整个扫描一遍。O(列数*非零元数)

方法二:先求出原矩阵每一列中非零元的个数,进而求得每一列第一个非零元在转置矩阵中应有的位置。 O(列数+ 非零元数)

三元组顺序表,又称为有序的双下标法。

特点:非零元在表中按行序有序存储,便于进行依行顺序处理的矩阵运算。

若需按行号存取某一行的非零元,则需从头开始进行查找。

2、行逻辑链接的顺序表

在三元组顺序表的基础上,加入指示各行第一个非零元的顺序表。

3、十字链表

可以按任意顺序输入非零元素。

链式存储结构,每个非零元用一个含5个域的结点表示,其中i、j、e分别表示该非零元所在的行、列和非零元的值,向右域right链接同一行中下一个非零元,向下域down链接同一列中下一个非零元。

同一行的非零元通过right域链接成一个线性链表,

同一列的非零元通过down域链接成一个线性链表,

每个非零元即是某个行链表中的一个结点,又是某个列链表中的一个结点整个矩阵构成一个十字交叉的链表。

用两个分别存储行链表的头指针和列链表的头指针的一维数组表示十字链表。

 

矩阵加法:4种情况:

(1)aij+ bij 

(2)aij  插入元素

(3)bij   插入元素

(4)aij+ bij = 0 删除元素

 

从一个结点看,进行比较、修改指针所需的时间是一个常数;

整个运算过程是对A和B的十字链表逐行扫描,其循环次数主要取决于A和B矩阵中非零元素的个数ta和tb,由此算法时间复杂度为O(ta + tb)。

 

5.4广义表

广义表是线性表的推广,列表 lists

广泛地用于人工智能等领域的表处理语言LISP语言,把广义表作为基本的数据结构,就连程序也表示为一系列的广义表。

广义表一般记作

LS = (a1,a2,...,an )

LS是广义表的名称,n是它的长度。

广义表中的元素可以是单个元素,也可以是广义表,分别称为广义表的原子子表

广义表的定义是一个递归的定义。

当广义表非空时,称第一个元素为LS的表头(Head),其余元素组成的表是LS的表尾(Tail)

任何非空列表其表头可能是原子,也可能是列表,但其表尾必定为列表。

 

5.5 广义表的存储结构

由于广义表的数据元素可以是原子,也可以是列表,因此难以用顺序存储结构表示,通常采用链式存储结构,每个数据元素可用一个结点表示。

 

需要两种结构的结点:

一种是表结点,用以表示列表;

标志域 + 表头指针域 + 表尾指针域

一种是原子结点,用以表示结点。

标志域 + 值域

两种方式:

 

enum ElemTag {ATOM,LIST};
typedef struct GLNode
{elemTag tag;union{AtomType atom;struct{GLNode *hp, *tp;}ptr;};
}*GList;

 

 

enum ElemTag {ATOM,LIST};
typedef struct GLNode1
{elemTag tag;union{AtomType atom;GLNode1 *hp;};GLNode1 *tp;
}*GList;

 


 

 

第一种结构:一个列表由表头和表尾组成,表头是一个表,表尾是另一个表。

第一种结构不直观,建议采用第二种结构!

第二种结构:一个列表由表头和表尾组成,表头是原子或列表,表尾是原子或列表。

 

5.7 广义表的递归算法

在对问题进行分解、求解过程中得到的是和原问题性质相同的子问题。

分治法(Divide and Conquer)进行递归算法的设计。

递归定义由基本项归纳项两部分组成。

基本项:描述一个或几个递归过程的终结状态。

归纳项:描述了如何实现从当前状态到终结状态的变化。

 

在设计递归函数时

(1)首先应书写函数的首部和规格说明,严格定义函数的功能和接口;

(2)对函数中的每一个递归调用都看成是一个简单的操作,只要接口一致,必能实现规格说明中定义的功能,切忌想的太深太远。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s的ingress使用

ingress 可以配置一个入口来提供k8s上service从外部来访问的url、负载平衡流量、终止SSL和提供基于名称的虚拟主机。 配置ingress的yaml&#xff1a; 要求域名解析无误 要求service对应的pod正常 一、test1.domain.com --> service1:8080 apiVersion: extensions/v1beta1…

JDK1.8中如何用ScriptEngine动态执行JS

JDK1.8中如何用ScriptEngine动态执行JS jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能&#xff0c;毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机…

数据结构06树和二叉树

第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集。 任意一棵非空树中&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根&#xff08;root&#xff09;的结点&#xff1b; &#xff08;2&#xff09;当n>1时&#xff0c;其余结点可…

2019.03.20 mvt,Django分页

MVT模式 MVT各部分的功能: M全拼为Model&#xff0c;与MVC中的M功能相同&#xff0c;负责和数据库交互&#xff0c;进行数据处理。 V全拼为View&#xff0c;与MVC中的C功能相同&#xff0c;接收请求&#xff0c;进行业务处理&#xff0c;返回响应。 T全拼为Tem…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中&#xff0c;提供了一些非常有用的辅助类来帮助我们进行并发编程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我们就来学习一下这三个辅助类的用法。以下是本文目录大纲&#xff1a;一.CountDownLatch用法二.CyclicBarrie…

数据结构07排序

第十章内部排序 10.1 概述 排序就是把一组数据按关键字的大小有规律地排列。经过排序的数据更易于查找。 排序前KiKj&#xff0c;且Ki在前: 排序方法是稳定的&#xff0c;若排序后Ki在前&#xff1b; 排序方法是不稳定的&#xff0c;如排序后Kj在前。 分类&#xff1a; 内…

数据结构08查找

第九章 查找 另一种在实际应用中大量使用的数据结构--查找表。 所谓查找&#xff0c;即为在一个含有众多的数据元素的查找表中找出某个“特定的”数据元素。 查找表 search table 是由同一类型的数据元素构成的集合。集合中的数据元素之间存在着完全松散的关系&#xff0c;故…

下载Centos7 64位镜像

下载Centos7 64位镜像 1.打开Centos官网 打开Centos官方网站地址&#xff1a;https://www.centos.org/&#xff0c;点击Get CentOS Now 2.点击Minimal ISO镜像 Minimal ISO镜像&#xff0c;与DVD ISO镜像的差别有很多&#xff0c;这里只说两点 1.Minimal ISO类似于Windows的纯净…

[Objective-C语言教程]结构体(17)

Objective-C数组可定义包含多个相同类型的数据项的变量类型&#xff0c;但结构体是Objective-C编程中的另一个用户定义数据类型&#xff0c;它可组合不同类型的数据项。 结构体用于表示记录&#xff0c;假设要图书馆中跟踪书籍信息。可能希望跟踪每本书的以下属性 - 标题作者学…

Scala01入门

第1章 可伸展的语言 Scala应用范围广&#xff0c;从编写脚本&#xff0c;到建立大型系统。 运行在标准Java平台上&#xff0c;与Java库无缝交互。 更能发挥力量的地方&#xff1a;建立大型系统或可重用控件的架构。 将面向对象和函数式编程加入到静态类型语言。 在Scala中&a…

架构师之路17年精选80篇

【架构必备】 《互联网架构如何实现“高并发”》4W 《TCP接入层的负载均衡、高可用、扩展性架构设计》2.2W 《配置中心架构设计演进》1.7W 《跨公网调用的大坑与架构优化》1.4W 《DNS在架构设计中的巧用》1.9W 《消息如何在网络上安全传输》1.2W 《10W定时任务&#xff0c;如何…

iphone手机型号获取

#import <sys/utsname.h> //手机型号 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java网络01基本网络概念

协议 Protocol&#xff1a;明确规则 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;数据如何分包&#xff1b; ... TCP/IP四层模型&#xff1a; 应用层 HTTP SMTP POP IMAP 传输层 TCP UDP 网际层 IP 主机网络层 host to host layer 数模、…

apache的产品分类说明

分类 项目名 说明 开发语言 服务器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服务器C/CTomcatJava的Web服务器JavaJames邮件服务器JavaSpamAssassin反垃圾邮件C/CPerlApache的Perl编程语言支持C/CTclTCL脚本语言C/CDirectory Server超级目录服务器JavaAxisW…

Java网络02基本Web概念

URI Uniform Resource Identifier 同一资源标识符 以特定语法标识一个资源的字符串 绝对URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分为&#xff1a; data file本地文件系统 ftp http telnet urn 统一资源名 scheme-specific-part为&am…

解决自建ca认证后浏览器警告

前一篇讲解了基本的建立证书的过程&#xff0c;但是建立后总是会在浏览器那里警告&#xff1a; 此链接不是私密链接 --谷歌浏览器 此证书颁发机构不可信 此证书不是这个网站的 --ie浏览器 总之证书是生成成功了&#xff0c;但是其中的内容填写错误了&a…

设计模式学习(三)——单例模式

在Java开发过程中&#xff0c;很多场景下都会碰到或要用到单例模式&#xff0c;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发童鞋都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…

Java网络03流

网络程序所做的很大一部分工作只是输入和输出&#xff1a;从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序开发的仿微信demo

(本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明&#xff1a; 基于微信小程序开发的仿微信demo 整合了ionic的样式库和weui的样式库 使用请查看使用必读! 更新日志请点击这里 目前功能 查看消息 网络请求获取数据&#xff08;download示例server…

设计模式之六大原则

设计模式之设计原则 这软件设计过程中&#xff0c;有六大设计原则&#xff1a; 单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则由于软件开发过程中&#xff0c;根据业务不同等因素形成了各种复杂的而不可预料的需求&#xff0c;遵守原则&#xff0c;让项…