1.1 数据结构的定义
1.2算法
1.3 认识程序设计
1.4 算法性能分析
对于一个有志于从事信息技部门(IT)领域的人员来说,数据结构是一门和计算机硬件与软件密切相关的学科,他的研究重点是在计算机的程序设计领域中探讨如何在计算机中组织和存储数据并进行高效的运用,涉及的内容包含算法、数据存储结构、排序、查找、程序设计概念、哈希函数。
我们可以将数据结构看成是在数据处理过程中的一种分析、存储、组织数据的方法与逻辑,它考虑到了数据间的特性与相互关系。简单来说,数据结构的定义就是一种程序设计优化的方法论,它不仅讨论到数据的存储,同时也考虑到彼此之间的关系与运算,目的是加快程序的执行速度、减少内存占用空间。(时间复杂度和空间复杂度)。。。数据结构就是对数据和算法的研究。
重要性:数据结构和相关的算法就是数据进入计算机进行处理的一套完整逻辑。在进行程序设计时,对于要存储和处理的一类数据,程序员必须选择一种数据结构来进行这类数据的添加、修改、删除、存储,如果在选择数据结构时做了错误的决定,那么程序执行起来将可能变得非常低效;如果选择错了数据类型,那么后果将不堪设想。
1.1.1 数据与信息
数据:一种未经过处理的原始文字、数字、符号或图形。他表达出来的只是一种没有评估价值的基本元素或表目。
信息:当数据经过处理(例如特定的方式系统的整理、归纳甚至进行分析)后,就成为了信息。
数据经过计算机的处理过程(整理+分析===算法+数据结构)就变成了信息。
1.1.2数据的特性
按照计算机中所存储和使用的对象,可将数据分为两大类:数值数据(运算符+数字);字符数据:(+、*、%|A、B……)
按照数据在计算机程序设计语言中的存在层次来分,基本数据类型;结构数据类型;抽象数据类型;
基本数据类型:不能以其他类型来定义的基本数据类型(标量数据类型),例如:int、float、bool、string、
结构数据类型:是一种比基本数据类型更高一级的数据类型string、array、pointer、list、file
抽象数据类型:比结构数据类型更高级,是指一个数学模型以及定义在此数学模型上的一组数学运算或操作。
1.1.3 数据结构的应用
计算机的主要工作是把数据(Data)经过某种运算处理成使用的信息(Information)
下面是一些常用的数据结构的应用:
1)树形结构:
是一种非常重要的非线性数据结构,广泛应用在人类社会的族谱,机关的组织机构、计算机的操作系统结构、平面绘图应用、游戏设计方面,常用的有:二叉树空间分割树、四叉树、八叉树等来代表分割场景的数据。
2)最短路径
是指在众多不同的路径中距离最短或者花费成本最少的路径。常见应用:公共交通系统的规划和网络的架设,都市公交系统、铁路运输系统、通信网络系统。
3)查找理论
所谓“搜索引擎”就是一种自动从因特网的众多网站中查找信息,然后经过一定的整理提供给用户进行查询的系统,如:百度、google、搜狗等。搜索引擎的信息来源主要有两种:一是用户或网站管理员主动登录;二是编写程序主动搜索网络上的信息。
用户在进行查找时,内部的程序设计就必须依赖不同的查找理论来进行,信息会由上而下列出,如果笔数过多,就分数页摆放,列出的方式则依照搜索引擎自行判断用户查找时最右可能的结果来摆放。用户使用搜素引擎的搜素功能时,搜素程序就是利用不同的搜素算法进行信息的查找。
1.2 算法
程序能否快速而高效地完成预定的任务,取决于是否选对了数据结构;而程序能否清楚而正确的把问题解决了,则取决于算法。数据结构+算法=可执行程序。
算法所必须符合的5个条件:
算法特性 | 内容与说明 |
输入 | 0个或者多个输入数据,这些输入有着清楚的描述或定义 |
输出 |
至少会有一个输出结果,不可能没有输出结果
|
明确性 | 每一条指令或者步骤必须是简明而明确的 |
有效性 | 步骤清楚且可行,能让用户用纸笔就可求出相应的答案 |
有限性 | 在有限步骤后一定会结束,不会产生无限循环。 |
常用的算法表示:
1)一般的文字描述
2)伪语言(pseudo-language)
3)表格或图形,例如:数组、树形图、矩阵图等
4)流程图:
5)程序设计语言:目前算法也能够直接以可读性高的高级设计语言来表示。例如:Visual Basic语言,C语言,C++语言,Java语言、Python语言
1.3 认识程序设计
在数据结构中,所探讨的目标是将算法向高效、可读性高的程序设计方向努力。简单来说,数据结构与算法必须通过程序的转换才能真正由计算机系统执行;所谓程序,是由合乎程序设计语言的语法规则的指令所组成的,而程序设计的目的就是通过程序的编写与执行来实现用户的需求。
1.3.1 程序开发流程
需求 -- 设计规则 -- 分析讨论 -- 编写程序 -- 测试检验
判断程序好坏的考虑方面:
1)可读性高:阅读与理解都相当容易
2)平均成本低:成本考虑不局限于编码的成本,还包括执行、编译、维护、学习、调试与日后更新等成本
3)可靠度高:所编写出来的程序代码稳定性高,不容易产生边界效应
4)可编写性高:针对需求所编写的程序相对容易。
1.3.2 结构化程序设计
在传统程序设计的方法中,主要是有:‘由下而上’与‘由上而下’的方法为主,由下而上:是指程序员先编写整个程序需求中最容易的部分,再逐步扩大来完成整个程序。而由上而下:将整个程序需求从上而下、从大到小逐步分解成较小的单元(或称模块),这样使得程序员可以针对各模块分别开发,不但可减少设计者负担,可读性高,也便于日后的维护。并且结构化程序设计的核心精神就是:‘由上而下设计’与‘模块化设计’
1.3.3 面向对象程序设计(Object-Oriented Programming,OOP)
该主要设计思想就是将存在于日常生活中随处可见的对象(object)概念应用在软件开发模式中.OOP让我们以一种更生活化、可读性更高的设计思路来进行程序的开发和设计,并且所开发出来的程序也更容易扩充、修改、维护。
面向对象程序设计强调:
程序的可读性
程序的重复使用性
程序的扩展性
还具备如下三种特性:封装性、继承性、多态性。
封装性:是利用‘类'来实现’抽象数据类型‘。类是一种用来具体描述对象状态与行为的数据类型,也可以看成是一个模型或蓝图,按照这个模型或蓝图产生的实例就被称为对象。所谓’抽象 ‘,就是将代表事物特征的数据隐藏起来,并定义一些方法来作为操作这些数据的接口,让用户只能接触到这些方法,而无法直接使用数据,也符合了信息隐藏的意义。
继承性:继承性是面向对象程序设计语言中强大的功能之一,因为他允许程序代码的重复性使用(code Reusability),同时可以表达树形结构中父代与子代的遗传现象。’继承‘类似于现实生活中的遗传,允许我们去定义一个新的类来继承现有的类,进而使用或修改继承而来的方法,并可在子类中加入新的数据成员与函数成员。。换句话说,,当程序开发人员以继承机制声明新增类时,它会先将所引用的父类中的所有成员完整地写入新增的类中。
多态性:多态最直接的定义就是让具有继承关系的不同类别对象可以调用相同名称的成员函数,并产生不同的反应效果。多态的功能可让软件在开发和维护时达到充分的延伸或扩展性。
1.4 算法性能分析
对于一个程序(算法)性能的评估,经常是从时间与空间两个维度来进行考虑。时间复杂度、空间复杂度。
空间复杂度:估算一个算法在运行过程中临时占用内存空间的大小,是一种渐近表示法。该部分的内存空间通常可分为:“固定空间内存”(包括基本程序代码、常数、变量)和“变动空间内存”(随程序运行时而改变大小的使用空间,例如引用类型变量)。
时间复杂度:可以就某个算法的执行步骤计数来衡量运行时间的标准,也是一种渐近表示法。时间复杂度只是执行次数的一个概略估算。例子详见书上p12-p13.
Big-Oh | 功能与说明 |
O(1) | 称为常数时间,表示算法的运行时间是一个常数倍数 |
O(N) | 称为线性时间,表示执行的时间会随着数据集合的大小而线性增长 |
O(log2n)
| 称为次线性时间,成长速度比线性时间慢,而比常数时间快 |
O(n^2) | 称为平方时间,算法的运行时间会以二次方的增长 |
O(n^3)
| 称为立方时间,算法的运行时间会以三次方的增长 |
O(2^n) | 称为指数时间,算法的运行时间会成2的n次方增长,例如解决非多项式问题算法的时间复杂度为O(2^n) |
O(nlog2n) | 称为线性乘对数时间,介于线性和二次方增长的中间模式 |
Big-Oh是运行时间估算的最坏情况,则就是运行时间估算的最好情况。综合版本情况
是一种比Big-Oh和
更精确的时间复杂度的渐近表示法。