数据结构(一) 简介

第一章 绪论

1.1 开场白

“为了将来要做一个优秀的程序员,向微软、Google的工程师们看齐,那么你应该要努力学好它”

1.2 你数据结构怎么学的?

“需要开发一个客服电话系统,他们项目经理安排小菜完成客户排队模块的代码工作”

  1. “用数据库设计了一张客户排队表,并且用一个自动递增的整型数字作为客户的编号。只要来一个客户,就给这张表的末尾插入一条数据。等客服系统一有空闲,就从这张表中取出最小编号的客户提交,并且删除这条记录”

  2. “实时的排队模块,用什么数据库呀,在内存中完成不就行了吗”

  3. “用数组变量重新实现了这个功能,因为考虑到怕数组不够大而溢出,于是他设计100作为数组的长度。”

  4. “这种实时的排队系统,通常用数据结构中的“队列结构”是比较好的,用数组虽然也可以,但是又要考虑溢出,又要考虑新增和删除后的数据移动,总的说来很不方便”

1.3 数据结构起源

计算机处理数据的功能:数值计算到非数值计算 催生了数据结构

“早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。

可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好地处理问题。所以数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。”

70年代初,出现了大型程序,软件也开始相对独立,结构程序设计成为程序设计方法学的主要内容,人们越来越重视“数据结构”,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。可见,数据结构在程序设计当中占据了重要的地位。

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

1.4 基本概念和术语

1.4.1 数据

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。”

比如:学生表中的性别,年龄,分数这些都是数据

1.4.2 数据元素

数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录”

比如在学生表,每一行记录就是数据元素

1.4.3 数据项

数据项:一个数据元素可以由若干个数据项组成。

数据项是数据不可分割的最小单位。在数据结构这门课程中,我们把数据项定义为最小单位,是有助于我们更好地解决问题。但真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。

比如学生表,每一行有id,name,sex,score,这些就是数据项

1.4.4 数据对象

“数据对象:是性质相同的数据元素的集合,是数据的子集

学生表中的,三行就是数据对象

1.4.5 数据结构

结构,简单的理解就是关系,比如分子结构,就是说组成分子的原子之间的排列方式。严格点说,结构是指各个组成部分相互搭配和排列的方式。在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构。那数据结构是什么?数据结构:是相互之间存在一种或多种特定关系的数据元素的集合

在计算机中,数据元素并不是孤立、杂乱无序的,而是具有内在联系的数据集合。数据元素之间存在的一种或多种特定关系,也就是数据的组织形式。

为编写出一个“好”的程序,必须分析待处理对象的特性及各处理对象之间存在的关系。这也就是研究数据结构的意义所在。

1.5 逻辑结构与物理结构

1.5.1 逻辑结构

逻辑结构:是指数据对象中数据元素之间的相互关系
逻辑结构分为以下四种:

1 . 集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。各个数据元素是“平等”的
2. 线性结构:线性结构中的数据元素之间是一对一的关系
3. 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
4. 图形结构:图形结构的数据元素是多对多的关系

1.5.2 物理结构

物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据元素的存储结构形式有两种:顺序存储和链式存储。”

1) 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的”

2)链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置”

“逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。”

1.6 抽象数据类型

1.6.1 数据类型

数据类型指一组性质相同的值的集合及定义在此集合上的一些操作的总称,这个概念容易混淆,数据类型或者抽象数据类型就是操作集合的总称

在计算机中,内存也不是无限大的,你要计算一个如1+1=2、3+5=8这样的整型数字的加减乘除运算,显然不需要开辟很大的适合小数甚至字符运算的内存空间。于是计算机的研究者们就考虑,要对数据进行分类,分出来多种数据类型。

在C语言中,按照取值的不同,数据类型可以分为两类:

  • 原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等。
  • 结构类型:由若干个类型组合而成,是可以再分解的。例如,整型数组是由若干整型数据组成的。”

“抽象是指抽取出事物具有的普遍性的本质。它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必需的信息。”

1.6.2 抽象数据类型

“抽象数据类型(Abstract Data Type,ADT):是指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。”

  1. 整型其实就是一个抽象数据类型,尽管它在上面提到的这些在不同计算机中实现方法上可能不一样,但由于其定义的数学特性相同,在计算机编程者看来,它们都是相同的。因此,“抽象”的意义在于数据类型的数学抽象特性”
  2. 在3D系统中还有z出现,既然这三个整型数字是始终在一起出现,我们就定义一个叫point的抽象数据类型,它有x、y、z三个整型变量,这样我们很方便地操作一个point数据变量就能知道这一点的坐标了。
  3. 根据抽象数据类型的定义,它还包括定义在该模型上的一组操作。就像“超级玛丽”这个经典的任天堂游戏,里面的游戏主角是马里奥(Mario)。我们给他定义了几种基本操作,走(前进、后退、上、下)、”
  4. 比如学生表的 增删查改就是抽象数据类型。

第二章 算法

2.1 算法定义

算法是描述解决问题的方法

算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。”

两种算法比较

1)

“int i, sum = 0, n = 100;
for (i = 1; i <= n; i++)
{
    sum = sum + i;
}
printf("%d", sum);”

2). 高斯算法 (1+100)*100/2

2.2 算法的特性

算法具有五个基本特性:输入、输出、有穷性、确定性和可行性

  • “这里有穷的概念并不是纯数学意义的,而是在实际应用当中合理的、可以接受的“有边界”。你说你写一个算法,计算机需要算上个二十年,一定会结束,它在数学意义上是有穷了,可是媳妇都熬成婆了,算法的意义也不就大了”

  • “确定性:算法的每一步骤都具有确定的含义,不会出现二义性。算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。算法的每个步骤被精确定义而无歧义。”

2.3 算法设计的要求

“应该具有正确性、可读性、健壮性、高效率和低存储量的特征。

2.4 算法效率的度量

“时间效率指的是算法的执行时间,对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率高,执行时间长的效率低。存储量需求指的是算法在执行过程中需要的最大存储空间,主要指算法程序运行时所占用的内存或外部硬盘存储空间。设计算法应该尽量满足时间效率高和存储量低的需求。在生活中,人们都希望花最少的钱,用最短的时间,办最大的事,算法也是一样的思想,最好用最少的存储空间,花最少的时间,办成同样的事就是好的算法。求100个人的高考成绩平均分,与求全省的所有考生的成绩平均分在占用时间和内存存储上是有非常大的差异的,我们自然是追求可以高效率和低存储量的算法来解决问题。”

2.4.1 时间复杂度

大O表示法 是事前估算算法的一种方法

时间复杂度所耗费时间从小到大依次

O(1)<O(N)<O(N2)<O(logN)<NlogN<N3<2N<O(n!)<O(NN)

一般情况下,时间复杂度都是最坏的时间复杂度

2.4.2空间复杂度

空间复杂度,其实算法一般不予考虑,都是考虑时间复杂度。

原文地址:https://www.cnblogs.com/chance0x1/p/13088737.html