数据结构:基本概念

1,数据结构的基本概念

1.1,数据结构

软件设计是计算机学科的的核心内容之一。软件设计时要考虑的首要问题是数据的表示、组织和处理方法。

数据结构是软件设计的重要理论和实践基础。数据结构设计和算法设计是软件系统设计的基础和核心。

数据结构+算法=程序设计

数据:是描述客观事物的数字、字符以及所有能输入到计算机中并能被计算机接受的各种符号集合的统称。 数据包括:数值数据、非数值数据(字符串、图形、图像、音频、视频

数据元素:表示一个事物的一组数据称为一个数据元素结点、顶点、记录);数据元素是数据的基本单位。一个数据元素中能够识别该元素的一个或多个数据项称为关键字,能够唯一识别数据元素的关键字称为主关键字

数据项 数据项(字段、域、属性)是数据元素中有独立含义的、不可分割的最小标识单位。

数据结构是指数据元素之间存在的关系。一个数据结构是由nn≥0)个数据元素组成的有限集合,数据元素之间具有某种特定的关系。

1.2,数据的逻辑结构

数据的逻辑结构指数据元素之间的逻辑关系,用一个数据元素的集合和定义在此集合上的若干关系来表示。K上的关系R可以用序偶来表示:<x,y>(x,y属于K)x元素为y元素的直接前驱y元素为x元素的直接后继

数据的逻辑结构可以用图示法表示:

(1)线性结构:每个数据元素有且仅有一个直接前驱元素(第一个元素除外),有且仅有一个直接后继元素(最后一个元素除外), 即元素之间11关联。

(2)树结构:每个数据元素有且仅有一个直接前驱元素(树根元素除外),但可以有任意多个直接后继元素。即元素之间1NN≥0)关联。

(3)图结构:每个数据元素可以有任意多个直接前驱元素,也可以有任意多个直接后继元素。即元素之间NMN,M≥0)关联

1.3,数据的存储结构 

数据元素及其关系在计算机中的存储表示或实现称为数据的存储结构(物理结构)。数据的存储结构分为:1)顺序存储结构。2)链式存储结构。

(1)顺序存储:使用一组连续的内存单元依次存放数据元素,元素在内存中的物理存储次序体现它们的逻辑次序。(注:通常使用程序设计语言中的数组来实现)

(2)链式存储:使用若干地址分散的存储单元存储数据元素,逻辑上相邻的数据元素在物理位置上不一定相邻。数据元素间的逻辑关系通过结点间的链接关系来体现。(注:通常使用指针记载直接前驱元素或直接后继元素的存储地址)

1.4,数据操作 

数据操作指对一种数据结构中的数据元素进行各种运算或处理。每种数据结构都有一组数据操作。

数据操作定义在数据的逻辑结构上;数据操作的实现依赖于数据的存储结构。

  • 初始化。
  • 判断是否空状态。
  • 求长度:统计元素个数。
  • 包含:判断是否包含指定元素。contain
  • 遍历:按某种次序访问所有元素,每个元素只被访问一次。traverse
  • 取值:获取指定元素值。
  • 置值:设置指定元素值。
  • 插入:增加指定元素。
  • 删除:移去指定元素。

数据的逻辑结构、数据的存储结构操作这三方面是一个整体,缺一不可。

存储结构是数据结构不可缺少的一个方面。同一逻辑结构的不同存储结构可冠以不同的数据结构名称来标识。

  • 【例线性表是一种逻辑结构,若采用顺序存储,可称其为顺序表;若采用链式存储,则可称其为链表;若采用散列存储,则可称为散列表

操作也是数据结构不可分割的一个方面。在给定了数据的逻辑结构和存储结构之后,按定义的操作集合及其操作的性质不同,也可能导致完全不同的数据结构。

  • 【例若对线性表上的插入、删除操作限制在表的一端进行,则该线性表称之为;若对插入限制在表的一端进行,而删除限制在表的另一端进行,则该线性表称之为队列。更进一步,若线性表采用顺序存储(或链式存储)作为存储结构,则对插入和删除操作做了上述限制之后,又可分别得到顺序栈(或链栈)顺序队列(或链队列)。

1.5,数据类型和抽象数据类型

类型type)是具有相同逻辑意义的一组值的集合。

数据类型是指一个类型和定义在这个类型上的操作集合。数据类型定义了数据的性质、取值范围以及对数据所能进行的各种操作

数据类型与数据结构的不同之处:

  • 数据类型研究的是每种数据所具有的特性,以及对这种特性的数据能够进行哪些操作。
  • 数据结构研究的是数据元素之间具有的相互关系。
  • 数据结构与数据元素的数据类型无关,也不随数据元素值的变化而变化。

抽象数据类型ADT)是指一个数学模型(数据结构)以及定义在该模型上的一组操作。通常使用抽象数据类型描述数据结构的逻辑结构操作

用接口描述线性表的抽象数据结构

public interface LList<T>                   //线性表接口
{
    boolean isEmpty();      //判断线性表是否为空
    int length();           //返回线性表长度
    T get(int index);       //返回序号为index的对象
    T set(int index, T element);      //设置序号为index的对象为element,返回原对象
    boolean add(int index, T element);    //插入element对象,插入后对象序号为index
    boolean add(T element); //插入element对象,插入位置没有约定
    T remove(int index);    //移去序号为index的对象,返回被移去对象
    void clear();           //清空线性表
}

2,算法

2.1,什么是算法

算法定义:一个算法是一个有穷规则的集合,其规则确定一个解决某一特定类型问题的操作序列。

算法和数据结构:

  • 算法建立在数据结构之上,对数据的操作需用算法来描述。
  • 算法设计依赖数据的逻辑结构,算法实现依赖数据的存储结构。
  • 实现一种抽象数据类型,需要选择合适的存储结构。

算法的规则必须满足以下5个特性:

  • 有穷性:对任意一组合法的输入值,算法在执行有穷步骤之后一定能结束。即算法的操作步骤为有限个,且每步都能在有限时间内完成。
  • 确定性:对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何去执行。并且在任何条件下,算法都只有一条执行路径。
  • 可行性:算法中的所有操作都必须足够基本,都可以通过已实现的基本操作运算有限次实现之。
  • 有输入:算法有零个或多个输入数据。输入数据是算法的加工对象,既可以由算法指定,也可以在算法执行过程中通过输入得到。
  • 有输出:算法有一个或多个输出数据。输出数据是一组与输入有确定关系的量值,是算法进行信息加工后得到的结果,这种关系即为算法的功能。

算法设计目标:

  • 正确性:算法应确切地满足应用问题的需求,这是算法设计的基本目标。
  • 健壮性:即使输入数据不合适,算法也能做出适当处理,不会导致不可控结果。
  • 高时间效率:算法的执行时间越短,时间效率越高。
  • 高空间效率:算法执行时占用的存储空间越少,空间效率越高。
  • 可读性:算法表达思路清晰,简洁明了,易于理解。

算法描述:

  • 自然语言描述
  • 伪码描述
  • 传统流程图描述
  • 程序设计语言描述

2.2,算法分析

【问题】求解同一问题可能有许多不同的算法,如何去评价这些算法的优劣?

主要考虑如下三点:执行算法所耗费的时间执行算法所耗费的存储空间,其中主要考虑辅助存储空间算法应易于理解,易于编码,易于调试等等。

算法(执行效率)分析主要包括:时间复杂度、空间复杂度。

算法执行效率需通过依据该算法编制的程序在计算机上运行所消耗的时间或空间来分析其方法通常有两种:事后统计计算机内部进行执行时间和实际占用空间的统计事前分析(求出该算法的一个时间界限函数

与算法效率相关的因素有:依据算法选用何种策略、问题的规模、程序设计的语言、编译程序所产生的机器代码的质量、机器执行指令的速度。

撇开软硬件等有关部门因素,可以认为一个特定算法“运行工作量”的大小,只依赖于问题的规模(通常用n表示),或者说,它是问题规模的函数

2.3,时间代价分析

算法中基本操作重复执行的次数是问题规模n的某个函数,其时间量度记作   T(n)=O(f(n)),称作算法的渐近时间复杂度,简称时间复杂度。一般地,常用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。

表示时间复杂度的阶有:O(1) :常量时间阶;O (n):线性时间阶;O(㏒n) :对数时间阶;O(n㏒n) :线性对数时间阶;O (nk)k≥2 k次方时间阶;

(1)两个n阶方阵的乘法:由于是一个三重循环,每个循环从1n,则总次数为: n×n×n=n^3 时间复杂度为T(n)=O(n^3)。

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[k][j];
        }
    }
}

(2){++x; s=0 ;}:将x自增看成是基本操作,则语句频度为1,即时间复杂度为O(1) 。如果将s=0也看成是基本操作,则语句频度为2,其时间复杂度仍为O(1),即常量阶。

(3)for(i=1; i<=n; ++i){ ++x; s+=x ; } :语句频度为:2n,其时间复杂度为:O(n) ,即为线性阶。

(4)for(i=1; i<=n; ++i){for(j=1; j<=n; ++j){ ++x; s+=x ; }}:语句频度为:2n^2 ,其时间复杂度为:O(n^2) ,即为平方阶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕双嘤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值