数据结构基础一

记于实习期间,临近考研从老师项目组退出来后就一直在总结和反思,当时为了进入项目组花了2个星期的时间去熟悉Ionic+cordova+、Angluar+WebApi对于这些框架就开始做需求写代码,但对其中的每一个都没有进入过深入了解过,完全是面向bing编程。其实自己越写越清楚,自己对这些框架语言的了解只停留在了表面,没有基础根本无法深入,无论是算法还是语言都需要。故记此警己!

数据结构01---基本概念和术语

数据(data)

    数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。数据的含义极为广泛,如图像、声音等都可以通过编码而归之于数据的范畴。

数据元素(data element)

    数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可由若干个数据项组成。例如一本书的书目信息为一个数据元素,而书目信息中的每一项(如书名,作者名等)为一个数据项。数据项是数据的不可分割的最小单位。

数据对象(data object)

    数据对象是性质相同的数据元素的集合,是数据的一个子集。如,整数数据对象是集合N={0,±1,±2,……}。

数据对象(data object)

    数据结构是互相之间存在一种或多种特定关系的数据元素的集合。在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在某种关系,这种数据元素相互之间的关系称为结构。通常有下列4类基本结构:

  1.     集合     结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系。
  2.     线性结构     结构中的数据元素之间存在一对一的关系。
  3.     树形结构     结构中的数据元素之间存在一对多的关系
  4.     图状结构网状结构    结构中的数据元素之间存在多对多的关系

    数据结构的形式定义为:数据结构是个二元组如下

Data Structure = ( D , S )
//D是数据元素的有限集
//S是D上关系的有限集

    数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构

    数据元素之间的关系在计算机中有两种不同表示方式:顺序映像非顺序映像

    即两种不同的存储结构:顺序存储结构链式存储结构

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

    非顺序映像:借助指示元素存储地址的指针表示数据元素之间的逻辑关系。

抽象数据类型(Abstract Data Type,简称ADT)

    ADT是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。

    抽象数据类型的定义由一个值域和定义在该值域上的一组操作组成。可细分为下列3种类型:

  1.     原子类型  属原子类型的变量的值是不可分解的。这类抽象数据类型较少,因为一般情况下,已有的固有数据类型足以满足需求。但有时也有必要定义新的原子数据类型,例如数位为100的整数。
  2.     固定聚合类型  属该类型的变量,其值由确定数目的成分按某种结构组成。例如,复数是有两个实数以确定的次序关系构成。
  3.     可变聚合类型  和固定聚合类型相比较,构成可聚合类型“值”的成分的数目不确定。例如,可定义一个“有序整数序列”的抽象数据类型,其中序列的长度是可变的。

    显然,后两种类型可统称为结构类型,和数据结构的形式定义,抽象数据类型可用以下三元组表述

(D,S,P)
D是数据对象,S是D上的关系集,P是对D的基本操作集。

ADT 抽象数据类型{
    数据对象:(数据对象的定义)
    数据关系:(数据关系的定义)
    基本操作:(基本操作的定义)
}ADT抽象数据类型名

其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为

     基本操作名(参数表)

            初始条件:(初始条件描述)

            操作结果:(操作结果描述)

算法

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还具有下列5个重要特性:

(1)有穷性 一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。

(2)确定性 算法中每一条指令必须有确切的含义,即阅读时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径 ,对相同的输入只能得出相同的输出。

(3)可行性 一个算法是能行的,即算法中的描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。

(4)输入 一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。

(5)输出 一个算法哟一个或多个的输出,这些输出是同输入有着某些特定关系的量。

且算法设计的要求

(1)正确性 算法应当满足具体问题的需求。

(2)可读性 算法主要是为了人的阅读与交流,其次才是机器执行。可读性好有助于程序的维护。

(3)健壮性 当输入数据非法时,算法也能适应地作出反应或进行处理,而不会产生莫名其妙的输出结果。

(4)效率和低存储量需求 通俗地说,效率指的是算法执行的时间。存储量需求指算法执行过程中所需要的最大存储空间。

算法效率的度量

度量一个程序的执行时间通常有两种方法。

(1)事后统计法 通过内部计时功能去分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。

(2)事前分析估算:一个程序在计算机上运行时所消耗的时间取决于下列因素:

  1. 依据的算法选用何种策略;
  2. 问题的规模,例如求100以内还是1000以内的素数;
  3. 书写程序的语言,对于同一个算法,实现语言的级别越高,执行效率越低;
  4. 编译程序所产生的机器代码的质量;
  5. 机器执行指令的速度。

一般情况下,算法中基本操作重复执行的次数是问题规模N的某个函数f(n),算法的时间度量记作

T(n) = O(f(n))

它表示随问题规模N的增大,算法执行时间的增长率相同,称为算法的渐进时间复杂度,简称时间复杂度

空间复杂度作为算法所需存储空间的量度,记作

S(n) = O(f(n))

其中N为问题的规模。若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值