数据结构与算法( C语言版)-概论

学习视频链接

一、数据结构的研究内容

用计算机解决实际问题时,大致需要以下几个步骤:
(1)从具体问题抽象出一个适当的数学模型。
(2)设计求解数学模型的算法
(3)编程、运行并调试程序,直到解决实际问题。

二、数据的逻辑结构

1、有关概念与术语

(1)数据
数据是指所有能输入到计算机中并被计算机程序处理的符号的表示。所谓数据就是计算机加工处理的对象,它可以是数值数据,也可以是非数值数据。
(2)数据元素
数据元素(即结点)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可以由若干个数据项组成。

  • 数据是由数据元素组成的数据元素是由数据项组成的,即数据>数据元素>数据项。
    (3)数据对象
    是性质相同的数据元素的集合。
  • 数据元素与数据的关系:是集合中的个体。
  • 数据对象与数据的关系:集合的子集。
    (4)数据结构
    按某种逻辑关系组织起来的一批数据,按一定的映像方式把它存放在计算机存储器中,并在这些数据上定义一个运算的集合。
    数据结构包含以下3方面内容:
  • 数据元素之间的逻辑关系,即数据的逻辑结构。
  • 数据元素及其关系在计算机存储器内的表示,即数据的存储结构。
  • 数据的运算,即对数据施加的操作。

2、数据的逻辑结构

(1)定义
数据的逻辑结构是指数据元素之间逻辑关系描述。
(2)数据的逻辑结构的分类

  • 集合。结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系,这是一种最简单的数据结构。
  • 线性结构。结构中的数据元素之间存在着“一对一”的关系。线性结构的特点:表中数据元素之间是一种先后关系,对于表中任一结点,与它相邻且在它前面的结点(即直接前驱)最多只有一个;与表中任一结点相邻且在其后的结点(即直接后继)也最多只有一个。
  • 树形结构。结构中的数据关系“一对多”的关系。树形结构的特点:数据元素之间是一对多关系,即一个数据元素向上和一个数据元素相连(即双亲结点),向下和多个数据元素相连(即孩子结点)。
  • 图形结构或网状结构。结构中任意数据元素之间都可以有关系,元素之间存在着“多对多”的关系。图形结构的特点:图中数据元素在着多对多的任意关系。一个结点可能有多个直接前驱和直接后继。

三、数据的存储结构

数据在计算机中的存储表示称为数据的存储结构。即物理结构。数据的存储结构是逻辑结构在计算机存储器中的实现。
数据的逻辑结构和存储结构的关系是:存储结构是逻辑关系的映像与元素本身映像,是数据结构的实现;逻辑结构是数据结构的抽象。
1、顺序存储结构
顺序存储结构:借助元素在存储器中的相对位置来表示数据元素间的逻辑关系。
(1)可实现对各数据元素的随机访问。
(2)不利于修改,在对数据元素进行插入、删除运算时可能要移动一系列的数据元素。
·2、链式存储结构
链式存储结构特点是借助指示元素存储地址的指针表示数据元素的逻辑关系。
(1) 利于修改,在对数据元素进行插入、删除运算时,仅需修改数据元素的指针字段值,而不必移动数据元素。
(2)由于逻辑上相邻的数据元素在存储位置中不一定相邻,因此,链式存储结构不能对数据元素进行随机访问。
3、索引存储结构
索引存储是在原有的存储结构的基础上,附加建立一个索引表,索引表中的每一项都由关键字和地址组成。例如:通讯录。
4、散列存储结构
散列存储是通过的构造散列函数来确定数据存储地址或查找地址。

四、算法和算法分析

1、算法概念

(1) 算法的定义
算法是由若干条指令所组成的有穷序列,其中每条指令表示计算机的一个或多个操作。

2、算法的特性

一个好的算法应该具有以下5种特性。
(1)有穷性。一个算法必须(对任何合法的输入值)在执行有限时间内完成,不能形成无穷循环。
(2)确定性。算法中每一条指令必须有确切的含有,不能有二义性。
(3)可行性。 算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
(4)输入。 一个算法有零个或者多个输入,这些输入取自于某个特定对象的集合。
(5)输出。 一个算法必有一个或多个输出,这些输出是与输入有着一定关系的量。
3、好算法应达到的目标
(1)正确性。 要求算法能够正确地执行预先规定的功能,并达到所期望的性能要求。
(2)可读性。为了便于理解、测试和修改算法,算法应该具有良好的可读性。
(3)健壮性。 当输入非法的数据时,算法应能恰当地做出反应或进行相应处理,而不是产生莫名其妙的输出结果。并且处理错误的方法不应是中断程序的执行,而是返回一个表示错误的错误性质的值,以便更高的抽象层次上进行处理。
(4)高效性。 要求算法的执行时间要尽可能地短,算法的效率就越高。
(5)低存储量。完成相同的功能,执行算法时所占用的附加存储空间要尽可能地少。

3、算法的效率评价

(1)时间复杂度
一个算法所需的运算时间通常与所解决的问题的规模大小有关。表示为T(n),当n逐渐增大时T(n)的极限情况,一般称为时间复杂度。即T(n)=O(n)。
算法时间复杂度数量级越大,表示该算法的效率越低,反之越高。例如,O(1)为常数数量级,即算法的时间复杂度与输入规模n无关。
对于复杂度的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,即:

  • 加法法则
    T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
  • 乘法法则
    T(n)=T1(n)*T2(n)=O(f(n))+O(g(n))=O(f(n)*g(n))
    例1、分析以下算法的时间复杂度。
x=0;y=0;
for(k=1;k<=n;k++)
  x++;
for(i=1;i<=n;i++)
 for(j=1;i<=n;j++)
    y++;

本题,第一个循环执行n次,第二个循环它嵌套了一个循环,即外层循环执行n+1次,内层循环执行n*(n+1)=n^2+n则第一加第二得 T(n)=n+n^2+n+n根据定理 n趋近于无穷大即T(n)=O(n^2)。
例2、分析以下算法的时间复杂度。

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

本题,是一个while循环 当循环一次时i=2^1,…………第x次即i等于2的x次方。
即2^x<=n,所以T(n)=O(log2n)。
例3、求两个矩阵相乘的函数的时间复杂度。

for(i=0;i<n;i++){
    for(j=0;j<n;j++){
         c[i][j]=0;
       for(k=0;k<n;k++){
         c[i][j]+=a[i][k]*b[k][j];
       }
    }
}

本题,有三层循环第一层n+1次,第二层n*(n+1),第三次nn(n+1),即T(n)=O(n^3)。

  • 时间复杂度是嵌套最深的语句频度决定的。
    -基本方法:找出语句频度最大的那条语句作为基本语句;计算基本语句的频度得到问题规模n的某个函数f(n);取其数量级用符号“O”。
  • 最坏时间复杂度:指在最坏情况下,算法的时间复杂度。
  • 平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
  • 最好时间复杂度:指在最好情况下,算法的时间复杂度。
    (2)算法的时间效率的比较
  • 当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬赏。
    在这里插入图片描述
    时间复杂度T(n)按数量级递增即:

在这里插入图片描述
(3)空间复杂度
一个算法的空间复杂度是指程序运行开始到结束所需要的存储空间。包括算法本身所占有的存储空间、输入\输出数据占有的空间以及算法运行过程中的工作单元和实现算法所需要辅助空间。即S(n)=O(f(n))

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值