数据结构&算法 第一章

数据结构的三要素:逻辑结构,存储结构,数据运算。

一、什么是数据结构

  1. 数据:数据是描述客观事物的符号,是信息的载体,它是能够被计算机识别、存储和加工处理的对象。
  2. 数据的基本单位成为数据元素。
  3. 一个数据元素可由若干个数据项组成,有时也把数据项成为数据元素的域,字段,关键字, 数据项是数据不可分割的最小单位
  4. 我们把具有相同性质的数据元素的集合称为数据对象,它是数据的一个子集。
  5. 数据结构:数据结构是指互相之间存在着一种或多种关系的数据元素的集合。
  6. 讨论数据结构的目的是为了在计算机中实现其所需的各种操作。基本的操作有以下几种:
    (1)插入
    (2)删除
    (3)修改
    (4)查找
    (5)排序
    可分为两种,加工型操作,改变结构的值,和引用型操作,不改变结构的值。

二、逻辑结构与物理结构

1.逻辑结构:是指数据元素之间的逻辑关系:

(1)集合结构:数据元素之间的关系是“属于同一个集合”;
(2)线性结构:数据元素之间存在着“一对一”的关系;
(3)树形结构:数据元素之间存在着“一对多”的关系,也称“层状结构”。
(4)图形结构:数据元素之间存在着“多对多”的关系,也称“网状结构”。

2.物理结构:也称存储结构,,是指数据的逻辑结构在计算机中的存储形式:

关键是要能正确反映数据元素之间的逻辑关系

(1)顺序存储结构:把数据元素存放在地址连续的存储单元中,其数据元素之间的逻辑关系物理位置一致。eg.数组:a[10];
(2)链式存储结构:把数据元素 存放在任意的存储单元中,这组存储单元可以连续也可以不连续,其数据元素之间的物理位置不能反映其逻辑关系,因此需要给每个数据元素附设指针字段来存放下一个数据元素所在的位置,也就是说用指针来反映数据元素之间的逻辑关系。eg.链表。

NULL:指针值为0

逻辑结构是面向问题的,而物理结构是面向计算机的,其基本目标就是将数据及其关系存储到计算机的内存中。

三、抽象数据类型

1.数据类型

(1)定义:数据类型是指一个值的集合和定义在这个值集上的一组操作的总称
(2)意义:在用高级语言编写的程序中,每个变量、常量或表达式都有一个它所属的确定的数据类型。数据类型显示地或隐式地规定了在程序执行期间变量或表达式所有可能的取值范围,以及在这些值上允许进行的操作。在计算机中,内存是有限的,要充分利用内存,就需要依据需求为应用分配大小合适的空间。总而言之,数据类型决定了数据占内存的字节数、数据的取值范围、可进行的操作

2.抽象数据类型

(1)定义:抽象数据类型是指一个数据模型以及定义在此数学模型上的一组操作,抽象数据类型需要通过固有的数据类型来实现。简单来说,抽象数据类型是将“数据”、“结构”连同对其的“处理操作”封装在一起而形成的复合体。抽象数据类型实际上就是对数据结构的逻辑定义

3.抽象数据类型的实现方法:

(1)封装法:将定义的数据及其操作封装成一个整体,如C++中的类

class Linklist{
  private:
    int c;
  public:
    int Insert();
    int Delete();
}

(2)分散法:将数据及其处理数据的函数各自分开。

(3)半封装法:将数据和为处理数据而定义的相关变量封装在一起形成一个结构有关处理函数定义在结构之外。这种方法仅做到了对数据存储结构的封装,其特点介于封装法和分散法之间。

四、算法

1、算法的基本概念:算法是对特定问题解决步骤的一种描述,是指定的有限序列,其中每一条指令表示一个或多个操作。(指令是能够被人或计算机等计算设备执行的,它可以是计算机指令,也可以是我们平时的语言文字。)

2、算法的特性:
(1)有穷性:一个算法必须在有穷步之后结束,必须在有限时间内完成。
(2)确定性:算法每一步必须无二义性,在任何情况下,算法只有唯一的一条执行路径,即对相同的输入只能得出相同的输出。
(3)可行性:算法的每一步都可通过已经实现的基本运算的有限次执行得以实现。
(4)输入:一个算法具有零个或多个输入。
(5)输出:一个算法具有一个或多个输出。

3、算法&程序的区别:
一个程序不一定满足有穷性。例如操作系统,只要整个系统不遭破坏,它将永远不会停止,即使没有作业需要处理,它仍处于动态等待中,因此操作系统不是一个算法

4、一个好算法的要求:

(1)正确:算法的“正确”分为四个层次:
是所设计的程序没有语法错误;
是所设计的程序对于几组输入数据能够得出满足要求的结果;
是所涉及的程序对于精心选择的典型、苛刻而且带有刁难性的几组输入数据能够得到满足要求的结果;
是所涉及的程序对于一切合法的输入数据都能产生满足要求的结果。
(2)可读:一个优秀的算法应当思路清晰,层次分明,简单明了,易读易懂。
(3)健壮:当输入不合法的数据时,应能适当的做出正确反映或进行相应的处理,而不至于产生一些莫名其妙地输出结果。
(4)高效率低存储:算法效率通常指算法的执行时间。所谓存储量的要求,是指算法在执行过程中所需要的最大存储空间

五、算法的性能评价

1.算法效率的度量方法

(1)事后统计法:利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
(2)事前分析估算法:如果抛开与计算机相关的软、硬件因素,一个特定算法的运行工作量的大小就只依赖于问题的规模(通常用正整数n表示),或者说它是问题规模的函数。所谓问题规模,就是指输入量的大小。

//  阶nxn矩阵相乘的算法:
for(int i=0;i<row;i++)                     执行row+1{
  for(int j=0;i<col;j++)                   执行(col+1*row次
  {
  c[i][j]=0;                               执行col*col次
  for(k=0;k<row;k++)                       执行(row+1)*col*row次
     c[i][j]=c[i][j]+a[i][k]*b[k][i];      执行row*col*row次
  }
}
即总共执行(n+1)+n(n+1)+()+(n+1)+=2+3+2n+1

可以看出,算法执行时间与语句的执行次数成正比,我们可以用语句的执行次数来描述算法的执行之间。可以看出,算法的执行时间是问题规模n的函数f(n),n就是给定的问题规模。

2.算法的时间复杂度

(1)定义:一个算法是有控制结构和原操作构成的,则算法执行时间取决于两者的综合效果。以该原操作重复执行的次数作为算法的时间度量。一般情况下,算法中原操作重复执行的次数是规模n的某个函数T(n),若要分析T(n)随n的变化并确定T(n)的数量级,在这里,我们用“O”来表示数量级,则算法的时间复杂度,记作:T(n)=O(f(n))
(2)如果得出了基本操作执行的次数的函数f(n),判断一个算法效率时,函数f(n)中的常数和其他次要项常常可以忽略,关注最高阶的项即可
(3)推导大O的方法:
第一步,找出原操作的执行次数
第二步,用常数1取代运行时间中的所有加法常数
第三步,在修改后的执行次数中,只保留最高阶项
第四步,如果最高阶项存在与这个项相乘的常数,则去掉这个常数

3.算法的最优、最差与平均时间复杂度

(1)最优时间复杂度是指在输入规模为n时,算法在最优情况下的时间复杂度
(2)最差时间复杂度是指在输入规模为n时,算法在最差情况下的时间复杂度。书中讨论的各种算法的时间复杂度均指最坏情况下的时间复杂度。

4.空间复杂度
(1)定义:一个程序的空间复杂度是指程序运行从开始到结束所需的存储量。是算法所需存储空间的量度。记作:S(n)=O(f(n)),其中n为问题的规模。
(2)程序运行所需的存储空间包括以下两部分:
一是固定部分,主要包括程序代码,常量,简单变量,定长成分的结构变量所占的空间。与所处理数据的大小和个数无关,即与问题的实例的特征无关。
二是可变部分,这部分空间大小与算法在某次执行中处理的特定数据的大小和规模有关。

算法的执行时间上的节省一定是以增加空间存储为代价的,反之亦然。

六、算法描述

1.使用自然语言
2.使用流程图
3.使用某种程序设计语言
4.使用类程序设计语言:如书中采用的是类C语言作为算法描述的工具,类C语言是一种伪代码语言,需按照C语言的规范修改之后才可在计算机上运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值