数据结构-第一章

数据结构


前言


一、介绍

计算机解决一个具体问题时,大致需要三个步骤:
  1.要从具体问题抽象出一个适当的数学模型。
  2.设计一个解此数学模型的算法。
  3.编写程序,进行调试、调整然后到最终解答。

二、基础概念和术语

2.1 数据

数据(data)是对客观事物的符号表示,在计算机程序中通常作为一个整体进行考虑和处理。
有时,一个数据元素可由若干个数据项组成。
数据对象是性质相同的数据元素的集合,是数据的一个子集。

2.2 数据结构

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
  数据元素都不是孤立存在的,而是在它们之间存在某种关系,这种数据元素之间的关系称为结构。根据数据元素之间关系的不同特性,通常有4类基本结构
  (1)集合 结构中的数据元素之间除了“同属于一个集合”关系外,别无其它关系。
  (2)线性结构 结构中的数据元素之间存在一个对一个的关系。
  (3)树形结构 结构中的数据元素之间存在一个对多个的关系。
  (4)图形结构或网状结构 结构中的数据元素之间存在多个对多个的关系。
  数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。

2.3 数据元素

  计算机中表示信息的最小单位是二进制数的一位,称为位(bit)。
  在计算机中我们可以用一个由若干位组合起来形成的一个位串表示一个数据元素(如用一个字长的位串表示一个整数,用8位二进制数表示一个字符等),通常称这个位串为元素(element)或**节点(**node)。
  当数据元素由若干数据项组成时,位串中对应各个数据项的子位串称为数据域(data field)。所以元素或节点可看成是数据元素在计算机中的映像。

2.4 数据元素之间的关系

  数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构
顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。
非顺序映像的特点是借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。
Note:任何一个算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。

2.5 数据类型

数据类型:和数据结构密切相关的一个概念,它最早出现在高级程序语言中,用以刻画(程序)操作对象的特性。
高级程序语言中的数据类型可分为两类:
  (1)非结构的原子类型:这种数据类型的值不可分解。如c语言中的基本类型(整形、实型、字符型、枚举类型)、指针类型和空类型。
  (2)结构类型:结构类型的值是由若干成分按某种结构组成的,因此也是可分解的并且它的成分可以是非结构类型的,也可是结构的
  抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。其定义取决于它的一组逻辑特性,而其在计算机内部如何表示和实现无关,意思就是不论其内部结构如何变化,只要其数学特性不变,都不影响其外部的使用。
  抽象数据类型和数据类型实质上是一个概念。抽象的意义在于数据类型的数学抽象特性。
  一个含抽象数据类型的软件模块通常应包含定义、表示和实现3个部分。
  抽象数据类型的定义由一个值域和定义在该值域上的一组操作组成。若按其值的不同特性,可细分为下列3种类型:
  (1)原子类型(atomic data type)属原子类型的变量的值是不可分解的。这类抽象数据类型较少,因为一般情况下,已有的固有数据类型足以满足需求,但有时也有必要定义新的原子数据类型,例如数位为 100的整数。
  (2)固定聚合类型(fixedaggregate data type)属该类型的变量,其值由确定数目的成分按某种结构组成。例如,复数是由两个实数依确定的次序关系构成。
  (3)可变聚合类型(variable aggregate data type)和固定聚合类型相比较、构成可变聚合类型“值”的成分的数目不确定。例如,可定义一个“有序整数序列”的抽象数据类型,其中序列的长度是可变的。
抽象数据类型可用三元组表示为:(D,S,P)
其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
多元数据类型:指其值得成分不确定得数据类型。

Note:抽象数据类型可通过固有数据类型来表示和实现,即利用处理器中已存在的数据类型来说明新的结构。

三、算法和算法分析

3.1 算法

算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还具有下列5个重要特性:
  (1)有穷性 一个算法必须总是(对任何合法的输人值)在执行有穷步之后结束,且每一步都可在有穷时间中内完成。
  (2)确定性 算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有惟一的一条执行路径,即对于相同的输入只能得出相同的输出。
  (3)可行性 一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
  (4)输入 一个算法有零个或多个的输人,这些输入取自于某个特定的对象的集合。
  (5)输出 一个算法有一个或多个的输出,这些输出是同输人有着某些特定关系的量。

3.2 算法设计的要求

通常设计一个“好”的算法应考虑达到以下目标。
  (1)正确性:算法应当满足具体问题的需求.
  (2)可读性:是人们阅读起来通俗易懂
  (3)健壮性:当输入数据非法时,算法也能够适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
(4)效率和低存储量需求

3.3 算法效率的度量

3.3.1 时间复杂度

  一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记为:T(n)=O(f(n)) 它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称为渐近时间复杂度,也称时间复杂度。
我们常见有O(1)、O(n)、O(n2)

3.3.2 空间复杂度

  类似于算法的时间复杂度空间复杂度(space complexity)作为算法所需有储空间的量度,记作S(n)=O(f(n))
  其中n为问题的规模(或大小)。一个上机执行的程序除了需要存储空间来寄存本身所用指令、常数、变量和输人数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的额外空间,否则应同时考虑输入本身所需空间(和输入数据的表示形式有关)。若额外空间相对于输人数据量来说是常数,则称此算法为原地工作。

总结

期待大家和我交流,留言或者私信,一起学习,一起进步!

Guess you like

Origin blog.csdn.net/CltCj/article/details/118440740