数据结构(c++版)笔记整理——第一章

来源:互联网 发布:大学生网络创业风险 编辑:程序博客网 时间:2024/06/05 19:12

  

第1章 绪论

程序设计的实质是数据表示和数据处理。

数据存储在计算机内存中,即数据表示,其核心是数据结构;

而处理数据,设计(算法)方案,即数据处理,核心是算法。

 

1.1数据结构在程序设计中的作用

图灵奖获得者沃斯:数据结构+算法=程序。

1.2本书讨论的主要内容

1)计算机求解问题分为:数值问题和非数值问题。

数值问题抽象出的数据模型——数学方程;

非数值问题抽象出的数据模型——线性表、树、图等数据结构。

2)非数值问题的数据组织和处理,主要内容有:

●数据的逻辑结构:

线性表、树、图等数据结构,其核心是如何组织待处理的数据及数据之间的关系。

●数据的存储结构:

将数据结构存储到计算机的存储器中,其核心是如何有效的存储数据及数据间的逻辑关系。

●算法:

如何基于数据的某种存储结构实现插入、删除、查找等基本操作,其核心是如何有效的处理数据。

●常用处理技术:

查找技术,排序技术,索引技术等。

1.3数据结构的基本概念

1.3.1数据结构

●数据:所有能输入到计算机中并能被计算机程序识别和处理的符号集合。包括数值数据(整数、实数等)和非数值数据(文字、声音、图像、图像等)。

●数据元素:数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

●数据项:构成数据元素的不可分割的最小单位。

●数据结构:相互之间存在一定关系的数据元素的集合。

按照视点的不同,数据结构分为逻辑结构和存储结构。

★★逻辑结构:

数据元素之间逻辑关系的整体。常用逻辑关系图表示,描述方法:将每一个数据元素看作一个结点,用圆圈表示,元素之间的逻辑关系用结点之间的连线表示,如果强调关系的方向性,则用带箭头的连线表示关系。

●根据数据元素之间逻辑关系的不同,数据结构分为:

1)集合:数据元素之间就是“属于同一个集合”,除此之外,没有任何关系。

2)线性结构:数据元素之间存在着一对一的线性关系。

3)树结构:数据元素之间存在着一对多的层次关系。

4)图结构:数据元素之间存在着多对多的任意关系。

树结构和图结构也称为非线性关系。

  ★存储结构(也称物理结构):

数据及其逻辑结构在计算机中的表示,换言之,存储结构除了存储数据元素外,必须隐式或显式地存储数据元素间的逻辑关系。包括:顺序存储结构和链式存储结构。

●数序存储结构的基本思想:用一组连续的存储单元依次存储数据元素,数据间逻辑关系由元素存储位置表示,占据存储空间少。

●链式存储结构的基本思想:用一组任意的存储单元存储数据元素,数据元素间逻辑关系用指针表示,占据存储空间多,灵活。

数据的逻辑结构是从具体问题抽象出的数据模型,是用户视图,面向问题,反映数据元素间的关联方式或邻接关系。数据的存储结构是面向计算机的,其基本目标是将数据及逻辑关系存储到计算机内存中,是具体实现的视图。

数据的操作:插入、删除、修改、检索、排序。

1.3.2抽象数据类型

1.数据类型(data type):

一组值的集合及定义与这个值集上的一组操作的总称,规定了该类型数据的取值范围和对这些数据所能采取的操作。

2.抽象(abstract):

抽出问题本质特征而忽略其非本质的细节,是对具体事物的一个概括。

3.抽象数据类型(ADT)

一个数据结构及定义在该结构上的一组操作的总称。

数据类型和ADT的区别在于:数据类型指高级程序设计语言支持的基本数据类型,ADT指自定义的数据类型。

1.4 算法及算法分析

1.4.1 算法及其描述方法

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

▲算法的重要特性:

(1)输入:一个算法有0或多个输入

(2)输出:一个算法有1或多个输出

(3)有穷性:一个算法必须在执行有穷不后结束,且每步在有穷时间内完成

(4)确定性:算法中每条指令必须有确切含义,在相同条件下,相同输入只能得到相同输出

(5)可行性:算法描述操作可通过已实现基本操作执行有限次来实现

程序:对一个算法使用某种程序设计语言的具体实现。

▲好的算法除了具有以上五个特性外,还好满足:

正确性、鲁棒性(健壮性)、简单性、抽象分级、高效性。

▲算法的描述方法有:

(1)自然语言

优点:容易理解;

缺点:容易出现二义性,且算法冗长。

(2)流程图

优点:直观易懂;

缺点:严密性和灵活性差。

(3)程序设计语言

优点:可由计算机直接执行;

缺点:抽象性差,使得算法设计者拘泥于描述算法的具体细节,忽略了好算法和正确逻辑的重要性,此外,还要求算法设计者掌握程序设计语言及其编程技巧。

欧几里得算法用C++语言编程如下:

#include <iostream>

intCommonFactor(int m,intn)

{

   int r=m%n;

   while (r!=0)

   {

      m=n;

      n=r;

      r=m%n;

   }

   return n;

}

int main()

{

   cout<<CommonFactor(63,54)<<endl;

   return 0;

}

(4)伪代码

介于自然语言和设计语言的方法,它采用某一程序设计语言的基本语法,操作指令可结合自然语言来设计。算法中自然语言有多少,取决于算法的抽象级别。抽象级别高的伪代码自然语言多一些;反之,则程序设计语言的语句多一些。

1.4.2 算法分析

◆◆度量算法效率的方法:

1)事后统计

先将算法实现,然后输入适当的数据运行,测算其时间和空间开销;

缺点:(1)编写程序实现算法将花费较多的时间和空间精力

     (2)所得结果依赖于计算机的软硬件等环境因素,有时易掩盖算法本身优劣

2)事前分析估算(渐进复杂度)

对算法所消耗资源的一种估算方法

◆◆

问题规模:输入量的多少

基本语言:执行次数与整个算法的执行次数成正比的语言

只考察当问题规模充分大时,算法中基本语句的执行次数在渐进意义下的阶,称为算法的渐进复杂度,简称时间复杂度,用大O(大欧)表示.

定义1—1 若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≤c×f(n),则称T(n)=O(f(n))(或称算法在O(f(n))中)。

 

最好情况:数组的第一个元素就是k,算法只需比较一个元素即可

最坏情况:数组的最后一个元素是k,算法需比较n-1个元素

平均情况:在数组中查找不同的元素k,假设数据等概率分布,则平均需比较n/2个元素

 

算法的空间复杂度:在算法执行过程中,需要的辅助空间数量。辅助空间是除算法本身和输入输出数据所占据的空间外,算法临时开辟的存储空间,通常记作:S(n)=O(f(n))

  算法分析举例

分析算法时间复杂度:找出所有语句中执行次数最大的那条语句作为基本语句,计算基本语句的执行次数,取其数量级放入大O中即可。

例1

++x;

时间复杂度:O(1),称为常量阶。

例2

for(i=1;i<=n;++i)

      ++x;

执行次数为n,时间复杂度为O(n),称为线性阶

例3

for(i=1;i<=n;i++)

for(j=1;j<=n;++j)

++x;

执行次数n2,时间复杂度O(n2),称为平方阶

例4

for(i=1;i<=n;++i)

      for(j=1;j<=n;++j)

      {

           c[i][j]=0;

           for(k=1;k<=n;++k)

                 c[i][j]+=a[i][k]*b[i][j];

      }

执行次数,时间复杂度O(n3),称为立方阶。

例5

for(i=1;i<=n;++i)

      for(j=1;j<=i-1;++j)

           ++x;

执行次数,时间复杂度O(n2

例6

for(i=1;i<=n;i=2*i)

      ++x;

执行次数,时间复杂度O(log2n),称为对数阶。

常见时间复杂度如下:

O(1)<O(log2n)<O(n)<O(n* log2n)<O(n2)<O(n3)<…<O(2n)<O(n!)

 

 

0 0