数据结构(c语言版)第一章绪论

自1946年第一台计算机问世以来,计算机产业的飞速发展已经远远超出人们对它的预料,在某些生产线上,甚至几秒钟就能生产出一台微型计算机,产量猛增,价格低廉,这就使得它的应用范围迅速扩展。如今,计算机已深入到人类社会的各个领域。计算机的应用不再局限于科学计算,而更多地用于控制,管理及数据处理等非数值计算地处理工作。与此对应,计算机加工处理地对象由纯粹的数值发展到字符,表格和图像等各种具有一定结构的数据,这就给程序设计带来了一些新的问题。为了编写出一个“好”的程序,必须分析待处理的对象的特性以及各处理对象之间存在的关系。这就是“数据结构”这门学科形成和发展的背景。

1.1 什么是数据结构

一般来说,用计算机解决一个具体问题时,大致需要经过下列几个步骤:

  1. 从具体抽象出一个适当的数学模型
  2. 设计一个解此数学模型的算法
  3. 编出程序,进行测试、调整直至得到最终解答

而寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。

例如,图书馆的书目检索系统自动化问题。列在一张卡片上的一本书的书目信息可由登录号,书名,作者名,分类号,出版单位和出版时间等若干项组成,每一本书都有唯一的登录号,但不同的书目之间可能有相同的书名,或者有相同的作者名,或者有相同的分类号。由此,在书目自动检索系统中可以建立一张按登录号顺序排列的书目文件和三张分别按书名,作者名和分类号顺序的索引表。由这四张表构成的文件便是书目自动检索的数学模型,计算机的主要操作便是按照某个特定要求(如给定书名)对书目文件进行查询。

1.2基本概念和术语

数据(data)是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。它是计算机程序加工的“原料”。

数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可由若干个数据项(data item)组成,例如,一本书的书目信息为一个数据元素,而书目信息的每一项(如书名,作者名等)为一个数据项。数据项是数据的不可分割的最小单位。

数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。例如,整形数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C="‘A’,‘B’,…,‘Z’}。

数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。在任何问题中,数据元素都不是孤立存在的,而是它们之间存在着某种特定关系,这种数据元素之间的关系称为结构(structure)。根据数据元素之间关系的不同特性,通常有下列四类基本结构:(1)集合 结构中的数据元素之间除了”同属于一个集合“的关系外,别无其它关系;(2)线性结构 结构中的数据元素之间存在一个对一个的关系;(3)树形结构 结构中的数据元素之间存在一个对多个的关系;(4)图状结构或网状结构 结构中的数据元素之间存在多个对多个的关系。

数据结构的形式 定义为:
数据结构是一个二元组Data_Structure = (D,S)
其中:D是数据元素的有限集,S是D上关系的有限集。
例如,在计算机科学中,复数可取如下定义:复数是一种数据结构
Complex = (C,R)
其中:C是含两个实数的集合{c1,c2};R={P},而P是定义在集合C上的一种关系{<c1,c2>},其有序偶<c1,c2>表示c1是复数的实部,c2是复数的虚部。

上述数据结构的定义仅是对操作对象的一种数学描述,换句话说,是从操作对象抽象出来的数学模型。数据定义中的”关系“描述的是数据元素之间的逻辑关系,因此又称为数据的逻辑结构

数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包含数据元素的表示和关系的表示。在计算机中表示信息的最小单位是二进制数的一位,叫做。在计算机中,我们可以用一个又若干位组合起来形成的一个位串表示一个数据结构(如用一个字长的位串表示一个整数,用一个八位二进制数表示一个字符等),通常称这个位串为元素(element)或结点(node)。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域(data field)。因此,元素或结点可看成是数据元素在计算机中的映像。

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像非顺序映像,并由此得到两种不同的存储结构:顺序存储结构链式存储结构。顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像的特点是借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。任何一个算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。

数据类型(data type) 是一个值的集合和定义在这个值上的一组操作的总称。例如,C语言中的整型变量,其值集为某个区间上的整数(区间大小依赖于不同的机器),定义在其上的操作为加减乘除和取模等算术运算。

数据类型可分为两类:一类是非结构的原子类型。原子类型的值是不可分解的,例如C语言中的基本类型(整型,实型,字符型和枚举类型),指针类型和空类型。另一类是结构类型,结构类型的值是由若干成分按某种结构组成的,由此是可以分解的,并且它的成分可以是非结构的,也可以是结构的。

抽象数据类型(Abstract Data Type,简称ADT)是指一个数学模型以及定义在该模型上的一组操作。
抽象数据类型的形式可用以下三元组来表示
(D,S,P)
其中,D是数据对象,S是D上的基本操作集。
ADT抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT抽象数据类型名
基本操作的定义格式为
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>

1.3 抽象数据类型的表示与实现

(1)预定义常量和类型:

//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;

(2)数据结构的表示(存储结构)用类型定义(typedef)描述。数据元素类型约定为Elem Type,由用户在使用该数据类型时自行定义。

(3)基本操作的算法都用以下形式的函数描述:

函数类型 函数名(函数参数表){
//算法说明
语句序列
}//函数名

一般而言,a,b,c,d,e等用作数据元素名,i,j,k,l,m,n等用作整型变量名,p,q,r等用作指针变量名。当函数返回值为函数结果状态代码时,函数定义为Status类型。

(4)赋值语句有
简单赋值 变量名 = 表达式;
串联赋值 变量名1 = 变量名2 = … = 变量名k = 表达式;
成组赋值 (变量名1,…, 变量名k) = (表达式1,…, 表达式k);
结构名 = 结构名;
结构名 = (值1,…,值k);
变量名[ ] = 表达式;
变量名[起始下标…终止下标] = 变量名[起始下标…终止下标];
交换赋值 变量名<–>变量名;
条件赋值 变量名 = 条件表达式?表达式T:表达式F;

(5)选择语句有
条件语句1 if(表达式)语句;
条件语句2 if(表达式)语句;
else 语句;
开关语句1 switch(表达式){
case 值1:语句序列1;break;

case值n:语句序列n;break;
default:语句序列n+1;
}
开关语句2 switch {
case 值1:语句序列1;break;

case值n:语句序列n;break;
default:语句序列n+1;
}

(6)循环语句有
for语句 for(赋初值表达式序列;条件;修改表达式序列)语句;
while语句 while(条件)语句;
do-while语句 do{
语句序列;
}while(条件);

(7)结束语句有
函数结束语句 return 表达式;
return;
case结束语句 break;
异常结束语句 exit(异常代码);

(8)输入和输出语句有
输入语句 scanf([格式串],变量1,…,变量n);
输出语句 printf ([格式串],表达式1,…,表达式n);

(9)注释
单行注释 // 文字序列

(10)基本函数有
求最大值 max(表达式1,…,表达式n)
求最小值 min(表达式1,…,表达式n)
求绝对值 abs(表达式)
求不足整数值 floor(表达式)
求进位整数值 ceil(表达式)
判定文件结束 eof(文件变量)或eof
判定行结束 eoln(文件变量)或eoln

(11)逻辑运算约定
与运算&&:对于A&&B,当A的值为0时,不再对B求值
或运算||:对于A||B,当A的值为非0时,不再对B求值

1.4 算法和算法分析

1.4.1 算法

算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还具有下列5个重要特性:

  1. 有穷性 一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
  2. 确定性 算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
  3. 可行性 一个算法时能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
  4. 输入 一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
  5. 输出 一个算法有一个或多个的输出,这些输出时同输入有着某种特定关系的量。

1.4.2 算法设计的要求

通常设计一个“好”的算法应考虑达到以下目标。

  1. 正确性(correctness) 算法应当满足具体问题的需求。“正确”一词的含义在通常的用法中有很大差别,大体可分为以下4个层次:a.程序不含语法错误;b.程序对于几组输入数据能够得出满足规格说明要求的结果;c.程序对于精心选择的典型,苛刻而带有刁难性的几组输入数据能够给出满足规格说明要求的结果;d.程序对于一切合法的输入数据都能产生满足规格要求的结果。
  2. 可读性(readability) 算法主要是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对算法的理解;晦涩难懂的程序易于隐藏较多错误,难以调试和修改。
  3. 健壮性 当输入数据非法时,算法也能适当做出反应或进行处理,而不会产生莫名奇妙的输出结果。
  4. 效率与低存储量需求 通俗地说,效率指的是算法执行的时间。对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高。存储量需求指算法执行过程中所需要的最大存储空间。

1.4.3算法效率的度量

算法执行时间徐通过依据该算法编制的程序在计算机上运行所消耗的时间来度量。而度量一个程序的执行时间通常有两种方法。
(1)事后统计的方法 因为很多计算机内部都有计时功能,有的甚至可精确到毫秒级,不同的算法程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行算法编制的程序;二是所得时间的统计量依赖于计算机的硬件,软件等环境因素,有时容易掩盖算法本身的优劣。

(2)**事前分析估算的方法 **一个用高级程序语言编写的程序在计算机上运行是所消耗的时间取决于下列因素:

  1. 依据的算法选用何种策略;
  2. 问题的规模,例如求100以内还是1000以内的素数;
  3. 书写程序的语言,对于同一个算法,实现的语言级别越高,执行的效率就越低;
  4. 编译程序所产生的机器代码的质量;
  5. 机器执行指令的速度。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作
T(n) = O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度(asymptotic time complexity),简称时间复杂度。
显然,被称作问题的基本操作的原操作应是其重复执行次数和算法的执行时间成正比的原操作,多数情况下它是最深层循环内的语句中的原操作,它的执行次数和包含它的语句的频度相同。语句的频度 (frequency count)指的是该语句重复执行的次数,例如,在下列3个程序段中:
(a){++x;s = 0;}
(b)for(i=1;i<=n;++i){++x;s+=x;}
© for(j=1;j<=n;++j)
for(k=1;k<=n;++k){++k;s += x;}
含基本操作“x增1”的语句的频度分别为1,n和n的平方,则这三个程序段的时间复杂度分别为O(1),O(n)和O(n的平方) ,分别称为常数阶,线性阶和平方阶。

1.4.4 算法的存储空间需求

类似于算法的时间复杂度,我们以空间复杂度(space complexity)作为算法所需存储空间的度量,记作
S(n) = O(f(n))
其中n为问题的规模(或大小)一个上机执行的程序除了需要存储空间来寄存本身所用指令,常数,变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的额外空间,否则应同时考虑输入本身所需空间(和输入数据的表示形式有关)。若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。又如果所占空间量依赖于特定的输入,则除特别指示外,均按最坏情况来分析。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于您提到的《数据结构》一书,根据引用\[1\]和引用\[2\]的内容,这是一本关于数据结构的教材,作者是严蔚敏。该书的第一章是绪论,介绍了数据结构的基本概念和术语,以及算法和算法分析的内容。该书还包含习题集,其中第一章的习题包括算法设计题。此外,根据引用\[3\]的内容,书中还介绍了顺序栈的存储结构。至于是否有C语言的第一,我无法确定,因为引用的内容中没有提到具体的本信息。如果您需要获取该书的C语言第一,建议您查阅相关的图书出信息或者在网上搜索相关资源。 #### 引用[.reference_title] - *1* [【数据结构】01-绪论数据结构 C语言(严蔚敏、吴伟民)》](https://blog.csdn.net/TMT123421/article/details/84568290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [数据结构C语言严蔚敏(第二)超详细笔记附带课后习题](https://blog.csdn.net/chongyang_/article/details/109544719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值