数据结构与算法(一)——相关概念

引子

Algorithms + Data Structures = Programs (算法+数据结构=程序)

程序设计包括算法,数据结构和程序设计语言三部分.算法是求解问题的过程描述,数据结构是对所要求解问题中的数据的存储和算法策略实现的支持,程序设计语言是使用计算机求解问题,是在计算机上实现算法和数据结构.

 

数据结构研究什么?

数据结构研究数据之间的关系,还要研究对给定数据可能存在的操作,以及如何组织数据才能够高效地实现这些操作。

 

相关概念:

数据:数据是对客观事物的符号表示,是信息的载体;

数据元素:数据元素是数据集合中的一个个体,是计算机程序加工处理的基本单位;

数据项:数据元素由多个数据项组成;

数据对象:具有相同性质的数据元素的集合;

数据结构:带有结构的数据元素的集合。数据结构可以用一个四元组来表示:Data_Structure=(D,L,S,O)

                D(Data):数据元素的有限集,是存储和操作的对象;

                L(Logical Structure):数据元素集合D中数据元素之间客观存在的关系的有限集,称为逻辑结构;

                S(Storage Structure):数据元素集合D和数据元素之间的关系集合L在计算机中的存储表示,称为存储结构或物理结构;

                O(Operation):是在数据元素集合D上规定的一组操作.也称为运算.数据结构的基本操作通常有数据结构的创建和销毁,数据元素的查找,插入,删除,遍历和排序等.

*也常定义为二元组(D,R),其中D(Data)是数据元素的有限集,R(Relationship)是D中数据元素之间客观存在的关系的有限集.

逻辑结构:数据元素之间客观存在的关系,与数据在计算机中如何存储无关.通常也把数据的逻辑结构简称为数据结构.

     逻辑结构的划分(一) 
        I. 线性结构:有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。 
     例如:线性表、栈、队列、串 
        II.非线性结构:一个结点可能有多个直接前趋和直接后继。 
     例如:树、图等。

     逻辑结构的划分(二) 
     I. 集合:结构中的数据元素除了同属于一种类型外,别无其它关系。 
     II. 线性结构:结构中的数据元素之间存在一对一的关系。 
     III. 树型结构:结构中的数据元素之间存在一对多的关系。 
     IV. 图状结构(网状结构):结构中的数据元素之间存在多对多的关系。

存储结构:数据的存储结构也称为物理结构,指的是数据结构在计算机中的存储表示,包括数据结构中元素的表示及元素间关系的表示.

     存储结构的划分:

     I. 顺序存储结构:把逻辑上相邻的元素存储在物理结构相邻的存储单元中;特点是借助于数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系.常借助于程序设计语言中的数组来实现.

     II.链式存储结构:在数据元素中添加地址域或辅助结构,用来存放数据元素之间的关系.借助于指示数据元素地址的指针表示数据元素之间的逻辑关系.不要求逻辑上相邻的元素在存储器中的位置也相邻.常借助于程序设计语言中的指针类型或索引结构来实现.

     III.散列存储结构:也称哈希结构.通过对关键字直接计算得到数据元素的存储位置.对数据元素的存储和查找都是通过对关键字直接计算得到的.

     注:同样的逻辑结构可以使用不同的存储结构来实现.存储结构的选择主要考虑算法的实现以及算法的时间与空间要求.各种基本的存储结构既可以单独使用,也可以组合起来使用.

数据类型及抽象数据类型

数据结构可以理解为是程序设计语言自身实现了的数据结构.在高级程序设计语言中,数据类型可分为:原子类型和结构类型.原子类型是不可以再分解为多个数据类型的数据类型,如C中的整型,字符型,浮点型,双精度型等数据类型.而结构类型是可分解为多个数据类型的数据类型,其成分可以是原子类型,也可以是结构类型.

抽象数据类型(Abstract Data Type)一般包含数据元素,数据元素之间的关系以及操作三个要素.表示为ADT=(D,R,O). D是数据对象,R是D上的关系集,O是对D的基本操作集。

抽象性:将定义与实现分离.定义时只考虑数据类型的数学抽象特性,实现时再给出这些数据元素的表示及其操作的实现细节.

可扩展性:不再局限于计算机中已定义并实现的基本数据类型,用户可以通过ADT来用已有的数据类型扩展出尚未实现的数据类型.

Eg:银行账户问题的抽象数据类型定义:

ADT BankAccount{
    /*数据元素定义:用基本的数据类型String,int和float定义了三个数据项,
      银行账户中的每个数据元素即每个账户包含这三个数据项*/
    String ownerName;   //用户名
    int accountNumber;  //帐号
    float balance;     //余额
    /*数据元素的关系定义:该部分省略表明数据元素同属于一个银行账户,数据元素之间的关系是集合结构*/
    /*基本操作定义:定义了对数据元素的7个基本操作*/
    String getOwnerName();  //查询用户名
    int getAccountNumber(); //查询用户帐号
    float getBalance();  //查询余额
    String openAccount(String newName); //开户
    void cancelAccount(int newNum); //销户
    float deposit(float anAmount); //存款并返回新余额
    float withdraw(float anAmount); //取款并返回取款额
}ADT BankAccount

算法

算法是求解特定问题的步骤的有限序列.

算法特性:

I.功能性:算法都是用来求解特定问题的,不解决问题的步骤序列不是算法.

II.有穷性:算法由有限步骤组成,经过有限步骤后,算法要达到终止状态,要结束.

III.确定性:算法步骤执行的顺序是确定的,每步的任务是无二义性的.

IV.可行性:算法的每一步所描述的任务是明确的,是可以用基本步骤或已有的算法来实现的.

一个好的算法应该具备以下特性:

I.正确性:算法能够正确求解问题是首要的,也是最基本的.

II.可读性:好的算法应该思路清晰,层次分明,阅读和修改容易.

III.健壮性:健壮性是对算法在异常情况下处理能力的评价.好的算法在出现异常或非法数据时,以及在操作不当时,都能够作适当处理.

IV.高效性:好的算法应该是高效的,即求解问题所占用的存储空间少,执行时间短.

 

 

 

你可能感兴趣的:(数据结构与算法)