【从零开始的数据结构与算法基础学习之路】第一周:绪论、算法和算法分析

究竟什么是数据结构?为什么要学习数据结构?

相信许多初学者同我一样,在学习这门课程之前都会有这样的疑问。

那么什么是数据结构?

数据结构是数据之间存在一种或多种特定关系的数据元素集合。

数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间关系和操作的学科。 

数据结构是一种计算机科学技术领域广泛使用的专业术语,在很多书籍以及博客中,对数据结构的解释为数据在计算机的存储方式,很容易让人误以为数据结构只是一种数据的物理存储方式,其实不然,数据结构可以理解为:数据 + 结构数据是描述客观事物的符号,为程序操控,存储在计算机上,结构包括数据的逻辑结构和存储结构。

什么是数据结构

关于为什么学习数据结构,数据结构是计算机软件相关专业的基础课,作为一名软件工程的学生我应该学好这门课程。数据结构是一门核心的课程,处于承上启下的地位。数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。

Pascal语言之父——Nicklaus Wirth,曾说:“程序=数据结构+算法”。由此可见,想要写好程序就要学好数据结构。


基本概念和术语

 1.2.1

数据(Data)

数据是能输入计算机且能被计算机处理的各种符号的集合。数据是信息的载体、是对客观事物符号化的表示、能够被计算机识别、存储和加工。数据包括数值型的数据:整数、实数等;非数值型的数据:文字、图像、图形、声音等。

数据元素(Data element)

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。也简称为元素,或称为记录、结点或顶点。一个数据元素可由若干个数据项组成。

数据项(Data item)

数据项是构成数据元素的不可分割的最小单位

三者之间的关系:数据>数据元素>数据项

数据对象(Data Object)

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


1.2.2

数据结构(Data Structure)

数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构。数据结构是指相互之间存在一种或多种特定关系的数据元素集合,或者说,是带结构的数据元素的集合。

数据结构包括以下三个方面的内容:

1.数据元素之间的逻辑关系,也成为逻辑结构

2.数据元素及其关系在计算机内存中的表示(又称为映像),成为数据的物理结构或数据的存储结构

3.数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。

数据结构的两个层次

逻辑结构

描述元素之间的逻辑关系

与数据的存储无关,独立于计算机

是从具体的问题抽象出来的数学模型

物理结构(存储结构)

数据元素及其关系在计算机存储器中的结构(存储方式)

是数据结构在计算机中的表示

逻辑结构与存储结构的关系:

存储结构是逻辑关系的映像与元素本身的映像。

逻辑结构是数据结构的抽象,存储结构是数据结构的实现。

两者综合起来建立了数据元素之间的结构关系。

逻辑结构的种类

(1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。

(2)线性结构:结构中的数据元素之间存在着一对一的线性关系。

(3)树形结构:结构中的数据元素之间存在着一对多的层次关系。

(4)图状结构网状结构:结构中的数据元素之间存在着多对多的任意关系。

存储结构的种类

顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。C语言中用数组来实现顺序存储结构。

链接存储结构:用任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。C语言中用指针来实现链式存储结构。

索引存储结构:在存储结点信息的同时,还建立附加的索引表

散列存储结构:根据结点的关键字直接计算出该结点的存储地址。


1.2.3 

数据类型和抽象数据类型

在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。
例如,C语言中:
提供int,char, float, double等基本数据类型:数组、结构、共用体、权举等构造数据类型;还有指针、空(void)类型;用户也可用typedef自己定义数据类型。


一些最基本数据结构可以用数据类型来实现,如数组、字符串等;

而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。

数据类型(Data Type)

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

     数据类型=值的集合+值集合上的一组操作

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

是指一个数学模型以及定义在此数学模型上的一组操作。

·由用户定义,从问题抽象出数据模型(逻辑结构

·还包括定义在数据模型上的一组抽象运算(相关操作

·不考虑计算机内的具体存储结构与运算的具体实现算法

抽象数据类型的形式定义

抽象数据类型可用(D, S, P)三元组表示。                                                                                      其中:D是数据对象;S是D上的关系集;P是对D的基本操作集。

一个抽象数据类型的定义格式如下

ADT  抽象数据类型名{

数据对象:<数据对象的定义> 

数据关系:<数据关系的定义> 

基本操作:<基本操作的定义>

}ADT  抽象数据类型名

其中:··数据对象、数据关系的定义用伪代码描述 

           ··基本操作的定义格式为:···基本操作名(参数表)···初始条件:<初始条件描述> ···操作结果:<操作结果描述>

基本操作定义格式说明:

参数表:赋值参数 只为操作提供输入值。

               引用参数 以&打头,除可提供输入值外,还将返回操作结果。

初始条件:描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。若初始条件为空,则省略之。

操作结果:说明操作正常完成之后,数据结构的变化状况和应返回的结果。 

数据结构(C语言) 抽象数据类型的表示和实现                                                                    这篇文章的例子可以很好的帮助我们理解抽象数据类型的定义


1.3 算法和算法分析

算法的定义

对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。简而言之,算法就是解决问题的方法和步骤

算法的描述

·自然语言:英语、中文

·流程图:传统流程图、NS流程图

·伪代码:类语言:类C语言

·程序代码:C、JAVA······

算法与程序

算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。

程序是用某种程序设计语言对算法的具体实现。

算法的特性

·有穷性 一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。

·确定性 算法中的每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。

·可行性  算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。

·输入     一个算法有零个或多个输入。

·输出     一个算法有二个或多个输出。

算法设计的要求

•正确性(Correctness)

算法满足问题要求,能正确解决问题
算法转化为程序后要注意:
1、程序中不含语法错误:
2、程序对于几组输入数据能够得出满足要求的结果;
3、程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果;
4、程序对于一切合法的输入数据都能得出满足要求的结果。

通常以第三层意义上的正确性作为衡量一个算法是否合格的标准


•可读性(Readability)
1、算法主要是为了人的阅读和交流,其次才是为计算机执行,因此算法应该易于人的理解;
2、另一方面,晦涩难读的算法易于隐藏较多错误而难以调试。


•健壮性(Robustness)

1、指当输入非法数据时,算法恰当的做出反应或进行相应处理,而不是产生莫名其妙的输出结果。

2、处理出错的方法,不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。                                                                                     


•高效性(Efficiency) 

要求花费尽量少的时间和尽量低的存储要求

算法时间效率的度量可以用一句该算法编制的程序在计算机上执行所消耗的时间来度量。

两种度量方法:事后统计(将算法实现,测算其时间和空间开销);事前分析(对算法所消耗资源的一种估算方法) ps:第一种方法的缺点是编写程序实现算法将花费较多的时间和精力;所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣。

事前分析方法: 一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等)所需的时间与算法中进行的简单操作次数乘积。

算法运行的时间=一个简单操作所需的时间×简单操作次数 

也即算法中每条语句的执行时间之和 

算法运行时间= Σ 每条语句频度×该语句执行一次所需的时间

每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能、速度以及编泽的代码质量。是由机器本身软硬件环境决定的,它与算法无。所以,我们可以假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和了。

算法时间复杂度的渐进表示法

为了便于比较不同算法的时间效率,我们仅比较它们的数量级。若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度O是数量级的符号),简称时间复杂度。一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示。

算法中基本语句重复执行的次数问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n))   

基本语句重n为元素个数复执行的次数

1.算法中重复执行次数和算法的执行时间成正比的语句

2.对算法运行时间的贡献最大

3.执行次数最多

问题规模n

n越大算法的执行时间越长

·排序:n为记录数

·矩阵:n为矩阵的阶数

·多项式:n为多项式的项数

·集合:n为元素个数

·树:n为树的结点个数

·图:n为图的顶点数或边数

算法时间复杂度分析:大O表示法                                                                                                 还不懂看这篇文章就够了                                                                                                   (数据结构)十分钟搞定时间复杂度(算法的时间复杂度)

 空间复杂度:算法所存储空间的度量,记作:S(n)=O(f(n)) 其中n为问题的规模(或大小)

算法要占据的空间包括算法本身占据的空间,输入/输出,指令,常数,变量等;算法要使用的辅助空间。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值