程序=数据结构+算法

1 数据结构的研究内容


计算机求解问题的步骤:①具体问题抽象为数学模型(实质为分析问题,提取操作对象,找出操作对象之间的关系,用数学语言描述);②设计算法;③编程、调试、运行。
随着计算机应用领域的发展,计算机越来越多地用于非数值计算。
例1:学生学籍管理系统

操作对象:每位学生的信息(学号、姓名、性别、籍贯、专业)
操作算法:查询、插入、修改、删除等;
操作对象之间的关系:线性关系;
数据结构:线性数据结构、线性表。
类似的还有图书管理系统、人事管理系统、仓库管理系统、通讯录等等。
例2:人机对弈问题

操作对象:棋局的状态;
操作算法:走棋,即选择一种策略使棋局状态发生变化;
操作对象之间的关系:非线性关系;
数据结构:树。
例3:地图导航—求最短路径

操作对象:点和线(位置与路径);
操作算法:求最短路径;
操作对象之间的关系:网状结构(非线性关系);
数据结构:图。
小结:数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。

2 基本概念及术语

2.1 数据、数据元素、数据项和数据对象

2.1.1 数据(Data)

在将具体问题抽象为数学模型的时候,我们需要将要处理的信息抽象到计算机内部以保证计算机能够识别到信息。因此,数据的定义为:能输入计算机且能被计算机处理的各种符号的集合。特点:①信息的载体;②是对客观事物符号化的表示;③能够被计算机识别、存储和加工。数据包括数值型数据(整数、实数等)和非数值型数据(文字、图像、图形、声音等)。

2.1.2 数据元素(Data Element)

是数据的基本单位,通常作为一个整体进行考虑。简称为元素(记录或节点),一个数据元素通常由多个数据项组成。

例如:学生表中的第二个学生就是一个数据元素,这个数据元素由(学号、姓名、性别、籍贯等数据项组成)。

2.1.3 数据项(Data Element)

构成数据元素的不可分割的最小单位。
数据、数据元素和数据项三者的关系:
数据>数据元素>数据项(数据由数据元素组成,数据元素由数据项组成,学生表>个人信息>学号、姓名…)

2.1.4 数据对象(Data Object)

是性质相同的数据元素的集合,是数据的一个子集。(整数、字母和学籍表)
数据元素——组成数据的基本单位,是集合的个体;
数据对象——性质相同的数据元素的集合,是集合的子集。

2.2 数据结构(Data Structure)

数据在计算机内的存储往往存在着一种关系,数据元素之间的关系称为结构。那么数据结构就是指相互之间存在一种或多种特定关系的数据元素的集合(带结构的数据元素的集合)。

2.2.1 数据结构的三个内容

1.数据元素之间的逻辑关系,也称为逻辑结构;
2.数据元素及其关系在计算机内存中的表示(也称映像),称为数据的存储结构或物理结构;
3.数据的运算与实现:即对数据元素可以施加的操作以及这些操作在物理结构上的体现。

2.2.2 数据结构的两个层次

1.逻辑结构:①描述了数据元素之间的逻辑关系;②与物理结构无关,独立与计算机;③是从具体问题抽象出来的数学模型。
2.物理结构:①数据元素及其关系在计算机存储器中关系(存储方式);②是数据结构在计算机中的表示。
3.两者关系:①存储结构是逻辑关系的映像与元素本身的映像;②逻辑结构是数据结构的抽象,存储结构是数据结构的实现;③两者综合起来建立了数据元素之间的结构关系。

2.2.3 逻辑结构的种类

1.线性结构和非线性结构
线性结构:有且仅有一个开始和结尾结点,其余所有节点仅有一个直接前驱结点和一个直接后继结点。(线性表、栈、队列、串)
非线性结构:一个节点可能有多个前驱结点和后继节点。(图、树)
2.四种基本的逻辑结构
集合结构:结构中的数据元素之间除了同属于一个集合外,无其他任何关系;
线性结构:结构中的数据元素之间存在着一对一的线性关系;
树形结构:结构之间的数据元素之间存在着一对多的层次关系;
图状结构或网状结构;结构的数据元素之间存在着多对多的任意关系。

2.2.3 存储结构的种类

四种基本的存储结构:顺序存储、链式存储、索引存储、散列存储。
1.顺序存储:用一组连续的存储单元依次存储数据,数据元素之间的逻辑关系由元素的存储位置来表示。

2.链式存储:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。

3.索引存储

4.散列存储

2.3 数据类型和抽象数据类型

高级语言中的数据类型规定了在程序执行期间变量的取值范围以及这些数值所允许进行的操作。(约束取值范围,约束操作)
一些基本的数据结构可以直接通过类型来实现(数组、字符串),而另一些常用的数据结构(栈、队列、树、图等),不能直接用数据类型来表示。

2.3.1 数据类型(Data Type)

定义:数据类型是一组相同性质的值的集合以及定义于这个值集合上的一组操作的总称(数据类型=值的集合+值集合上的一组操作)。

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

定义:从具体问题中抽象出的数学模型以及在此数学模型上的一组操作。
特点:①从具体问题抽象出的数学模型(逻辑结构);②包括定义在数学模型上的一组抽象运算(相关操作);③不考虑计算机内具体的存储结构以及运算算法的具体实现。
抽象数据类型的形式定义:可用(D,S,P)三元组表示。D表示数据对象,S是D上的关系集,P是对D的基本操作集。

基本操作的格式说明:
参数表:赋值参数:只为操作提供输入值;引用参数:以&开头,提供输入值,并返回操作结果(类似于C语言中的传址调用);
初始条件:描述操作之前数据结构与参数应该满足的条件;
操作结果:操作完成之后,数据结构的变化状况和应返回的结果。

举例1:复数的定义

ADT Complex{数据对象:D={r1,r2|r1,r2均为实数}数据关系:R={<r1,r2>|r1是实部,r2是虚部}基本操作:Assign(&C,v1,v2)初始条件:空的复数C已经存在操作结果:构造复数C,r1,r2的值为v1,v2Destroy(&C)初始条件:复数C存在操作结果:复数C已销毁GetReal(&C,&realPart)初始条件:复数C存在操作结果:用realPart返回复数C的实部值GetImag(&C,&imagPart)初始条件:复数C存在操作结果:用imagPart返回复数C的虚部值}ADT Complex

3. 抽象数据类型的表示与实现

顾名思义,将抽象数据类型在计算机上实现,变为一个能用的具体的数据类型。
例如:抽象数据类型复数的实现

typedef struct Complex
{float realPart;float imagPart;
};void AssignComplex(Complex *p,float a,float b);
void AddComplex(Complex* p, Complex a, Complex b);
void SubComplex(Complex* p, Complex a, Complex b);
void MulComplex(Complex* p, Complex a, Complex b);
void DivComplex(Complex* p, Complex a, Complex b);
void ShowComplex(Complex p);int main()
{Complex c1, c2, c3;AssignComplex(&c1, 1, 2);AssignComplex(&c2, 3, 4);AssignComplex(&c3, 5, 6);ShowComplex(c1);ShowComplex(c2);ShowComplex(c3);return 0;
}void AssignComplex(Complex* p, float a, float b)
{assert(p != NULL);p->realPart = a;p->imagPart = b;
}void AddComplex(Complex* p, Complex a, Complex b)
{assert(p != NULL);p->realPart = a.realPart + b.imagPart;p->imagPart = a.imagPart + b.imagPart;
}void SubComplex(Complex* p, Complex a, Complex b)
{assert(p != NULL);p->realPart = a.realPart - b.imagPart;p->imagPart = a.imagPart - b.imagPart;
}void MulComplex(Complex* p, Complex a, Complex b)
{assert(p != NULL);p->realPart = a.realPart * b.imagPart;p->imagPart = a.imagPart * b.imagPart;
}void DivComplex(Complex* p, Complex a, Complex b)
{assert(p != NULL);p->realPart = a.realPart / b.imagPart;p->imagPart = a.imagPart / b.imagPart;
}void ShowComplex(Complex p)
{printf("%f + %f", p.realPart, p.imagPart);printf("i \n");
}

3. 算法与算法分析

3.1 算法

算法的定义:解决问题的方法和步骤(对特定问题求解方法和步骤的一种描述,它是指令的有限序列。)
算法的描述:①自然语言:英文、中文;②流程图:传统流程图、NS程图;③伪代码:类C语言;④程序代码:C语言程序、JAVA语言程序。
算法与程序的关系:
算法是解决问题的一种方法或过程,一个问题可以有多种算法。
程序是用某种设计语言对算法的具体实现。

算法的特性:
①有穷性:算法的执行步骤是有限的,且每一步所需的时间都是有穷的;
②确定性:算法的每一条指令都有确切的含义,在任何条件下,只有唯一的执行路径,即对于相同的输入都能得到相同的输出;
③可行性:算法是可执行的,算法描述的操作可以实现;
④输入:一个算法有零个或多个输入;
⑤输出:一个算法有一个或多个输出。
算法设计的要求:
①正确性:程序对于精心选择的、典型的、苛刻且带有刁难性的几组结果能够得出满足要求的结果;
②可读性:算法应易于人的理解;
③健壮性:当输入非法数据时,算法能够恰当的作出反应而不是产生莫名其妙的输出结果(处理出错的方法,不应是程序停止执行,而应是返回一个表示错误或者错误性质的值);
④高效性:花费尽量少的时间和尽量低的存储需求。

3.1 算法分析

算法分析的目的:判断算法是否可行,并比较同一问题的多种算法的性能,以便从中挑选较优的算法。
算法的效率从以下两个方面来考虑:①时间效率:执行算法所耗费的时间;②空间效率:执行算法所耗费的存储空间。(时间效率和空间效率有时候是矛盾的)
算法效率的度量分为事后统计和事前分析。由于事后统计的结果依赖于计算机的软硬件等环境因素,因此我们使用事前分析来进行度量。

3.2 算法的时间复杂度

一个算法的运行时间大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等)所需的时间与算法中进行简单操作次数的乘积。也就是每条语句的执行时间之和(每条语句的执行次数,又称语句频度)。

每条语句的执行时间,取决于机器的指令性能、速度以及编码的代码质量,由机器本身软硬件所决定,与算法无关。所以,我们假设执行每条语句所需的时间为单位时间,这样就可以独立于机器来分析算法性能了。

为了便于比较不同算法的效率,我们仅比较他们的数量级(所消耗的时间仅留下没有系数的最高次幂称为其数量级)。


算法中基本语句的执行次数是问题规模n的某个函数,算法的时间量度记作:T(n)=O(f(n))。它表示随着n的增大,算法执行时间的增长率和f(n) 的增长率相同,称为渐进时间复杂度。

3.2.1 分析时间复杂度的基本方法

定理:

基本方法:①找出语句频率最大的那条语句作为基本语句;②计算基本语句的频度得到问题规模n的某个函数f(n);③取数量级用“O”表示。





注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入集不同而不同。
例如:在数组中顺序查找为e的元素,那么最好的情况就是该元素在第一个位置,一次便找到;最坏的情况是该元素在最后一个位置,遍历了整个数组才找到。最好情况:1;最坏情况:n;平均时间复杂度:O(n)。

3.2.2 算法时间效率的比较



3.3 算法的空间复杂度



1.数据结构与算法—前言相关推荐

  1. 第一章 数据结构与算法-前言

    Hello,I'm 郭永峰,一名IT从业者,也是一名Java Sharer.Teacher.欢迎添加微信号或者QQ号,一起学习交流,微信与QQ同号(1030103135).目前在腾讯课堂也出了一些教程 ...

  2. vrp 节约算法 c++_数据结构和算法(Golang实现)(8.1)基础知识-前言

    基础知识 学习数据结构和算法.我们要知道一些基础的知识. 一.什么是算法 算法(英文algorithm)这个词在中文里面博大精深,表示算账的方法,也可以表示运筹帷幄的计谋等.在计算机科技里,它表示什么 ...

  3. JavaScript数据结构和算法简述——前言

    为什么要使用数据结构和算法(程序=数据结构+算法)         数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.包括数组.链表.栈.二叉树.哈希表等.        算法是对这些结构中 ...

  4. 01_JavaScript数据结构与算法(一)前言

    JavaScript 数据结构与算法(一)前言 什么是数据结构? 数据结构的定义 官方定义 无 民间定义 "数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系.这些 ...

  5. 资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

    数据结构 是掌握计算机编程必须具备的技能.通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表.栈.队列.字符串.动态数字.整数集合.树.图.搜索.排序等涉及的算法全部写一遍. ...

  6. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

  7. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  8. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  9. 数据结构与算法学习-开篇

    前言 数据结构和算法这门课一直是计算机专业最基础的一门课,大学时期掌握的不够好,毕业后长期写业务,也没有特别的花时间好好攻克一下,一直是自己的短板.这次在极客时间上订阅了两门数据结构和算法方面的专栏, ...

最新文章

  1. python笔记第二天
  2. cks子,间谍,局部Mo子和短管
  3. Range.EntireRow Property
  4. [转载] python中join的使用
  5. c语言超时自动退出,Golang实现for循环运行超时后自动退出的方法
  6. 超女复活赛,明星大补考
  7. 页面访问量统计java_java实现页面访问量统计的实例
  8. 360浏览器调试html5,360极速浏览器开发:调试指南
  9. 数据结构期末考试错点汇总
  10. python的matplotlib库
  11. 远程服务器登入信息,怎样查看服务器被远程登录的信息
  12. PDF免费转PPT值得您收藏使用的网站
  13. 树莓派连接笔记本电脑
  14. 如何把自己的网站免费发布到互联网
  15. 如何重键盘输入“勾”“打勾””√“这个符号
  16. 校园二手交易商城系统小程序-JAVA【数据库设计、源码、开题报告】
  17. 郑州东区鸿蒙学前班,新元鸿蒙教育智能学前班户外大课堂开始啦!
  18. 赵小楼《天道》深度解析(69)不要执著于豆豆和书,或寻找高人。更多的是要在意内容、内容、内容。你掌握之后,你也是高人
  19. 探秘2022亚运会主场馆丨“大小莲花”智慧升级,带你见证科技力量
  20. php 友盟推送角标,android集成友盟推送实现离线在线推送及桌面图标角标设置

热门文章

  1. Arduino 串口
  2. LabVIEW编程LabVIEW开发多功能IO测量接地信号源例程与相关资料
  3. 策略模式玩转步兵,骑士和弓箭手
  4. 现代密码学(Introduction to Modern Cryptography)
  5. matlab累积分布图绘制cdfplot
  6. 理解Avalon总线的静态地址对齐与动态地址对齐
  7. 免费5GB容量个人主页和@My.ID电子邮箱服务
  8. 中科大计算机科学与技术学院院长,王超 - 中国科学技术大学 - 计算机科学与技术学院...
  9. 揭秘威胁情报的王者Talos
  10. OpenCV的样本训练