数据结构与算法 学习笔记(1)绪论

数据结构的研究内容

研究非数值计算的称呼需设计问题中计算机的操作对象以及它们之间的关系和操作。

数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。

基本概念和术语

数据、数据元素、数据项和数据对象

数据:所有能输入到计算机中去描述的客观事物的符号。分为数值型数据和非数值型数据(多媒体信息处理)

数据元素:数据的基本单位,也称结点或者记录。用于完整的描述一个对象。

数据项:有独立含义的、组成数据元素的、不可分割的最小单位,也称域。

三者之间的关系:数据>数据元素>数据项  就好比学生表>个人记录>学号、姓名

数据对象:相同特性数据元素的集合,是数据的一个子集。只要集合内的元素性质均相同,都可称之为一个数据对象。

数据结构

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。即数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。数据结构包含逻辑结构和存储结构两个层次。

逻辑结构

逻辑结构是从逻辑关系上描述数据,它和数据的存储无关,是独立于计算机的,她是从具体问题抽象出来的数学模型。

逻辑结构可以划为为线性结构(线性表、栈、队列、串)和非线性结构(树、图)。

也可以划分为集合、线性结构(一个对一个,如线性表、栈、队列)、树形结构(一对多,如树)、图形结构(多个对多个,如图)。

存储结构

数据对象在计算机中的存储表示称为数据的存储结构,也成为物理结构。

数据元素在计算机中有两种基本的存储结构,分别为顺序存储结构和链式存储结构

顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。

链式存储结构是借助元素存储地址的指针表示数据元素间的逻辑关系。

数据的运算

逻辑结构和存储结构都相同,但运算不同,则数据结构不同。例如栈和队列。

对于一种数据结构,常见的运算有

插入,删除,修改,查找,排序

 数据类型和抽象数据类型

数据类型

定义:在一种程序设计语言中,变量所具有的数据种类。

数据类型是一组性质相同的值的集合,以及定义于这个集合上的一组运算的总称。

FORTRAN语言:整型、实型、和复数型

C语言基本数据类型: char  int  float  double  void

      构造数据类型:数组、结构体、共用体、文件

 抽象数据类型(ADTs:Abstract Data Types)

定义:抽象数据类型一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上的关系的集合以及数据对象的基本操作的集合。

ADT 常用定义格式

ADT抽象数据类型名{

        数据对象<数据对象的定义>

        数据关系<数据关系的定义>

        基本操作<基本操作的定义>

    } ADT抽象数据类型名

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

抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现。

它有些类似C语言中的结构(struct)类型,但增加了相关的操作

教材中用的是C语言(介于伪码和C语言之间)作为描述工具

1.预定义常量及类型

//函数结果状态代码

 #define OK 1

 #define ERROR 0

 #define OVERFLOW -2

 // Status是函数返回值类型,其值是函数结果状态代码。

      typedef  int  Status;

2.数据结构的表示

数据元素被约定为ElemType 类型,用户需要根据具体情况 ,自行定义该数据类型。 

3.算法描述

             函数类型 函数名(函数参数表)

             {

                语句序列;

             }

4.内存的动态分配与释放

使用newdelete动态分配和释放内存空间

          分配空间 指针变量=new数据类型;

          释放空间 delete指针变量;

5.赋值语句、选择语句、循环语句

6.使用的结束语句

          函数结束语句  return

          循环结束语句  break;

          异常结束语句  exit(异常代码

7.输入输出类型

                      输入语句   cin  (scanf( ))

                      输出语句   cout (printf( ))

8.扩展函数

                        求最大值  max

                        求最小值  min

算法与算法的分析

算法的定义及特性

算法定义

一个有穷的指令集,这些指令为解决某一个特定任务规定了一个运算序列。

算法描述

           自然语言

流程图

程序设计语言

伪码

算法的特性

1.输入      有0个或多个输入

 2.输出      有一个或多个输出(处理结果)

3.确定性  每步定义都是确切、无歧义的

4.有穷性  算法应在执行有穷步后结束

5.有效性  每一条运算应足够基本

评价算法的优劣的基本标准

正确性

可读性

健壮性

高效性(时间代价和空间代价)

算法的时间复杂度

衡量算法效率的方法主要有两类:事后统计法和事前分析估算法。

问题规模和语句频度

问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n来表示。
问题规模对不同的问题含义不同。

越大算法的执行时间越长
排序:n为记录数
矩阵:n为矩阵的阶数
多项式:n为多项式的项数
集合:n为元素个数树:n为树的结点个数
u图:n为图的顶点数或边数

一条语句的重复执行次数成为语句频度。
一个算法的执行时间大致上等于其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数和执行一次所需时间的乘积。
设每条语句执行一次所需的时间均是单位时间,则一个算法的执行时间可用该算法中所有语句频度之和来度量。

时间复杂度的渐进表示法

算法中 基本语句重复执行的次数 问题规模 n 的某个函数 f(n), 算法的时间量度记作: T(n)=O(f(n))  

表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐近时间复杂度

数学符号“O”的定义为:

T(n)f(n)是定义在正整数集合上的两个函数,则T(n) = O(f(n))表示存在正的常数Cn0,使得当nn0时都满足0T(n)Cf(n)

分析算法时间复杂度的基本方法

Ø 找出 语句频度最大 的那条语句作为 基本语句
Ø 计算 基本语句 的频度得到问题规模 n 的某个函数 f ( n )
Ø 取其数量级用符号“ O ”表示

x = 0;  y = 0;
for ( int k = 0; k < n; k ++ )
    x ++;
for ( int i = 0; i < n; i++ )
   for ( int j = 0; j < n; j++ )
      y ++;

f(n)=n^{2}  →T(n) = O(n2)

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

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

最好、最坏和平均时间复杂度

算法在最好情况下的时间复杂度称为最好时间复杂度,指的是算法计算量可能达到的最小值
算法在最差情况下的时间复杂度称为最坏时间复杂度,指的是算法计算量可能达到的最大值
算法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值
 

算法的空间复杂度

举例

for(i=0;i<n/2;i++)
      {   t=a[i];
           a[i]=a[n-i-1];
           a[n-i-1]=t;
       } 

 原地操作,S(n)=O(1)

for(i=0;i<n;i++)
       b[i]=a[n-i-1];
  for(i=0;i<n;i++)
       a[i]=b[i];
 

S(n)=O(n)

小结

 1、数据、数据元素、数据项、数据结构等基本概念

 2对数据结构的两个层次的理解

逻辑结构

存储结构

 3、抽象数据类型的表示方法

 4算法、算法的时间复杂度及其分析的简易方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值