您的位置:首页 > 理论基础 > 数据结构算法

数据结构入门----数据结构与算法基本概念

2020-07-07 00:04 465 查看

什么是数据结构

数据结构

研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等

用途

计算机内的数值运算依靠数学方程,而非数值运算(如表、树、图等)则要依靠数据结构。
同样的数据对象,用不同的数据结构来表示,运算效率可能有明显的差异。
程序设计的实质是对实际问题选择一个好的数据结构,加之设计一个好的算法。而好的算法在很大程度上取决于描述实际问题的数据结构。 

  程序=数据结构+算法

  ①提高复杂程序设计的能力
  ②培养算法设计能力
  ③为后继课程打基础

基本概念和术语

数据(data):对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的集合。——计算机操作对象的总称。例如:数字、字符、汉字、图形、图像、声音等信息 。
数据对象(data object):性质相同的数据元素的集合,是数据的一个子集。例如:整数、实数、书、学生等。
注意:性质相同的数据元素是指数据元素具有相同数量和类型的数据项。
数据元素(data element):是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 (又称元素、结点,顶点、记录等)
数据项(Data item):构成数据元素的项目,是数据的不可分割的最小单位(又称字段、域、属性等)。

基本概念
相互之间存在一种或多种特定关系的数据元素的集合。数据结构的形式定义(逻辑结构)

S=(D, R);D={ a, b, c, d, e, f };R={(a,e), (b,c), (c,a), (e,f), (f,d)}

线性结构:
S=(D,  R);D={di | 1≤i≤5};R={(di , dj ), i<j}

非线性结构:

按数据元素之间关系的不同特性,通常有4类基本结构
(1)集合:结构中的数据元素除了“同属于一个集合”外,别无其它关系。
(2)线性结构:结构中的数据元素之间存在一对一的关系。
(3)树型结构:结构中的数据元素之间存在一对多的关系。
(4)图状结构或网状结构:结构中的数据元素之间存在多对多的关系。
                     
数据结构从逻辑上分为四类:

数据结构的形式定义(逻辑结构)

存储结构--逻辑结构在计算中的映象(表示)亦称物理结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。——依赖于计算机。存储结构实质上是内存分配,在具体实现时,依赖于计算机语言。
存储结构可分为4大类:顺序存储结构、链式存储结构、索引、散列
1. 顺序存储结构
用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
实现:用数组
补充:内存单元和内存单元地址
程序:      char  w[5]

2. 链式存储结构:
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示 。
实现:用结构体,指针
Typedef struct Lnode {
    ElemType         data;         //数据域
     struct Lnode   *next;        //指针域
}

基本运算:在数据的逻辑结构上定义的操作算法。它在数据的存储结构上实现。最常用的数据运算有5种:插入、删除、修改、查找、排序

总结:数据的逻辑结构和存储结构的关系

(1) 数据的逻辑结构是数据的机外表示,数据的存储结构是数据的机内表示。

(2) 一种数据的逻辑结构可以用多种存储结构来存储。

(3) 数据结构的基本操作是定义于逻辑结构,实现于存储结构。

(4) 采用不同的存储结构,其数据处理的效率往往是不同的。

(5)存储结构的描述方法随编程环境的不同而不同,如:通常用一维数组类型描述顺序存储结构,用指针描述链式存储结构。

抽象数据类型的表示和实现

数据类型(Data Type):一组值的集合以及定义于这个值集上的一组操作的总称。——规定了该类型数据的取值范围和对这些数据所能采取的操作。 例如:C++中的整型变量   表示范围:如果是两个字节:-215—215-1,如果是四个字节:-231—231-1 。

操作:加,减,乘,除,求模,比较,赋值等

原子类型:int,float,double,char,bool

结构类型:数组:每个值类型必须相同

记录类型:每个值类型可以不相同

[code]Struct  worker{
int id;
Char name[20];
Float wage;
}

抽象数据类型(Abstract Data Type,ADT):  指一个数学模型(数据结构)以及定义在该模型上的一组操作。 ADT实质上和数据类型是一个概念

数据类型和抽象数据类型的区别: 数据类型:高级程序设计语言支持的基本数据类型; ADT:用户自定义的数据类型。定义数据部分和操作部分,只定义到数据的逻辑结构和操作说明,不考虑存储结构和具体实现。

其中基本操作的定义格式为: 注:初始条件可以为空,并可省略。

由于数据结构是和它的操作分不开的,因此以后我们对数据结构的定义均包括它的操作,也就是说定义为一个抽象数据类型的定义。

参数表基本操作有两种参数: 赋值参数只为操作提供输入值; 引用参数以&打头, 除了可以提供输入值外,还将返回操作结果。

初始条件:描述操作执行之前的数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。

操作结果:说明在操作正常完成之后,数据结构的变化状况和应返回的结果。

复数的ADT

矩形的ADT

抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现。 即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。

算法和算法分析

算法

算法是对特定问题求解步骤的一种描述,是指令的有限序列。

算法有5个基本特性:有穷性、确定性、可行性、输入和输出

(1)有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。

(2)确定性:算法中的每一条指令必须有确切的含义, 在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。

(3)可行性: 算法要足够基本,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。

(4)输入: 一个算法有零个或多个输入。

(5)输出: 一个算法有一个或多个输出。

算法设计的要求

设计算法时,通常应考虑达到以下目标:

(1) 正确性 (2) 可读性 (3) 健壮性 (4) 效率与低存储需求

正确性

首先,算法应当满足具体问题的需求。

其次,对算法是否“正确”的理解可以有以下四个层次:

a. 不含语法错误;

b. 对于某几组输入数据能够得出满足要求的结果;

c.  程序对于精心选择的典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果;

d. 程序对于一切合法的输入数据都能得出满足要求的结果.(算法维护阶段要解决的主要问题)

可读性

算法主要是为了人的阅读与交流,其次才是为计算机执行。因此算法应该易于人的理解;  

另一方面,晦涩难读的程序易于隐藏较多错误而难以调试;

程序设计阶段,程序编写阶段,都需要易于理解。

健壮性

当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。  

并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的   抽象层次上进行处理。

高效率与低存储量需求

效率指的是算法执行时间;

存储量指的是算法执行过程中所需的最大存储空间。

两者都与问题的规模有关。

算法效率的度量

度量算法效率的方法:

 事后统计:将算法实现,测算其时间和空间开销。

缺点:⑴ 必须执行程序,编写程序实现算法将花费较多的时间和精力;

⑵ 所得实验结果依赖于计算机的软硬件等环境因素。  

事前分析:对算法所消耗资源的一种估算方法。

和算法执行时间相关的因素:

1.算法选用的策略 2.问题的规模 3.编写程序的语言 4.编译程序产生的机器代码的质量 5.计算机执行指令的速度

使用绝对的时间单位衡量算法的效率是不合适的。

一个特定算法的 “运行工作量” 的大小,只依赖于问题的规模(通常用整数量n 表示),即它是问题规模的函数。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n)。

随着问题规模 n 的增长,算法执行时间的增长率和 f(n) 的增长率相同,则可记作:T (n) = O(f(n)),称T (n) 为算法的渐近时间复杂度。

算法 = 控制结构(顺序,分支和循环) + 原操作(固有数据类型的操作)

算法的执行时间 = ∑(原操作(i)的执行次数×原操作(i)的执行时间 )

算法的执行时间 与 原操作执行次数之和 成正比 

“基本操作” 指的是,该操作重复执行次数和算法的执行时间成正比。

算法的运行时间由算法中所有语句的频度之和构成。(该语句重复执行的次数)

算法的时间复杂度是由嵌套最深层语句的频度决定的。

说明: 在计算算法时间复杂度时,可以忽略所有低次幂和最高次幂的系数。

问题规模:输入量的多少。

基本语句:是执行次数与整个算法的执行次数成正比的操作指令。

问题规模:n           基本语句:x++           T (n) = O(f(n)) =O( n2)

显然,语句①的频度是1。设语句②的频度是log2n ,则有:T(n) = o(f(n))=  O(1+ log2n)=  O( log2n)

时间复杂度T(n)按数量级递增顺序为:

注:空间复杂度S(n)按数量级递增顺序也与上表类同。

有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同。例如冒泡排序,最好情况下,T(n) = O(1) 最坏情况下,T(n) = O(n2)。对这类算法的分析,一种解决办法是计算平均值,即考虑它对所有可能的输入数据集的期望值。 但是,很多情况下,各种输入数据集出现的概率难以确定。除特别指明外,讨论的时间复杂度均指最坏情况下的时间复杂度。

算法的存储空间需求

S(n) = O( g(n) )    表示随着问题规模 n 的增大,算法运行所需存储量的增长率与 g(n) 的增长率相同。

算法的存储量包括:1.输入数据所占空间; 2.程序本身所占空间; 3.辅助变量所占空间。

若输入数据所占空间只取决与问题本身,和算法无关,程序所占的空间是细微的,比较少,则只需要分析辅助变量所占额外空间。

原地工作:若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。例如:逆序存放数组A中的数据 算法1:前后两个数据互换,用到一个额外变量 算法2:再引入一个相同大小的数组B,然后依次倒序存放。

注:若额外空间所占空间量依赖于特定的输入,均按最坏情况来分析。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: