一 数据结构与算法入门

基本概念

  • 有哪些数据结构?

线性表,栈,队列,串,数组,广义表,树,二叉树,图算法

重点是线性表,二叉树数组

每种数据结构须要掌握,添加、更新、删除、查询、排序等操做的实现网络

学习数据结构的四种境界:数据结构

境界1:听懂理论,听懂算法思路函数

境界2:完成主要数据结构基本算法的实现(理论+实践,数据结构入门)性能

境界3:完成更多数据结构更多算法的实现学习

境界4:融会贯通,触类旁通,在后续开发中综合应用数据结构知识。优化

 

数据(data):  是描述客观事物的数值、字符、以及能输入及其且能被处理的各类符号集合。例如:数值、字符、声音、图像等等。

数据项(data item): 具备原子性,是不可分割的最小数据单位。如学生信息相关的性别。

数据元素(data Element): 数据的基本单位,一般由若干个数据项组成,在计算机程序中一般做为一个总体来处理。如描述一名学生完整信息的数据记录,包含学号、姓名等数据项。

数据对象(data Object): 性质相同的数据元素的集合,数据的子集。如一个学校全部学生的集合。

数据结构(data structure) :互相之间存在一种或多种关系的数据元素的结合,包括逻辑结构,存储结构,数据的运算。

 

  • 数据结构(data structure):相互之间存在一种或多种特定关系的数据元素的集合。

一种是数据结构的逻辑层面,即数据的逻辑结构指针

一种是存在于计算机的物理层面,即数据的存储结构对象

  • 数据结构=逻辑结构+存储结构+在存储结构上的运算/操做

 

  

 

  •  数据的逻辑结构:数据元素之间的逻辑关系(和实现无关)

线性结构:有且只有一个开始节点和终端结点,而且全部节点最多只有一个直接前驱和直接后继。

线性表是一个典型的线性结构。

 

  • 分类2:集合结构、线性结构、树状结构、网络结构

逻辑结构有四种基本类型:集合结构、线性结构、树状结构、网络结构。

表和树是最经常使用的两种高效数据结构。

集合结构:相似数学里的集合。

  • 肯定性:集合中的元素必须是肯定的
  • 惟一性:集合中的元素互不相同,{1,a},那么a不等于1
  • 无序性:集合中的元素不分前后,{1,2}和{2,1}算同一个集合

线性结构:数据元素之间存在一对一的线性关系的数据关系

树状结构:除了第一个元素之外每一个元素有且仅有一个直接前驱元素,可是能够有多个后继元素。一对多的关系。

网状结构:每一个数据能够有多个前驱、多个后继。多对多的关系。   

 数据的存储结构:顺序存储、链式存储、索引存储、散列存储。数据元素自己之间的存储和以及数据元素之间的关系表示,数据的逻辑在计算机中的表示。

顺序存储结构:一般借助数组来实现。采用连续的存储空间。把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。

优势:节省存储空间。分配的存储空间用来存储结点的数据,结点之间的逻辑关系不占用存储空间。能够实现对结点的随机存取,一个结点对应一个序号,经过序号获得存储地址,查询方便。

缺点:插入和删除操做须要移动元素,效率低。

链式存储结构:数据元素对应的是不连续的存储空间,每一个存储结点对应一个须要存储的数据元素。

每一个结点有数据域和指针域组成,元素之间的逻辑关系经过存储结点之间的连接关系反映出来。

特色:1 比顺序存储结构密度小。

          2 逻辑上相邻的物理结点没必要相邻。

          3 插入、删除灵活(没必要移动结点,只须要改变其中的指针)。

          4 查询慢

索引存储结构:除创建存储结点信息外,还创建附加索引表来标识结点的地址。主要面向查找操做,好比图书的目录。

散列存储结构:根据结点的关键字经过散列函数计算出该结点的存储地址。

 

数据的运算:

引用型运算:不改变数据结构中原有的数据元素的状态,只根据须要读取某些信息

加工型运算:改变数据结构中数据元素的状态,如内容,个数

 

算法:

 

对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操做。

 

算法的特色:

有穷性:一个算法必须在有限个步骤以后结束

肯定性:一个算法的每个步骤都有其确切的含义,相同的输入必然有相同的输出

可行性:算法中的每一步必须能够经过基本运算的有限次执行实现

输入:零个或多个,取决于特定的数据对象集合。

输出:一个或多个,输出与输入之间存在某种特定的关系。

 

算法的要求:

正确:算法的执行结果知足预先规定的功能和性能要求

可读:一个算法应当思路清晰,井井有条、简单明了、易读易懂,一个算法不只是让机器来执行,也是让人来读的

健壮:当输入不合法数据时,算法可以进行适当处理,而不会产生莫名其妙的输出或者引发其余的后果

高效:算法应当具有良好的时空性能

 

算法的性能分析:

时间复杂度:一个算法在计算机上转换成程序并运行所须要的时间,由问题规模决定。

主要取决于如下因素:

  1. 硬件的速度:机器的指令性能和速度,通常来说64位机比32位机要快,主频为2GHZ高于主频为1GHZ
  2. 书写程序的语言:语言级别越低,运行速度越快: 汇编  > C语言,C++  > Java 
  3. 编译语言所生成的目标代码的质量:对于代码优化比较好的程序,其所生成的目标代码的质量较高
  4. 问题的规模 : 通常来说,算法的时间复杂度是问题规模n的函数, T(n) = ∑(ti + ci ) , ti是一条语句须要的时间,ci是语句的频度,即次数
  5. 若是没有特别说明,通常是指最坏的时间复杂度

 

空间复杂度:算法运行从开始到结束须要的存储量。

主要由如下构成:

  1. 固定部分:此部分与所处理数据的大小、个数等无关,主要包括程序代码、常量、简单变量、结构变量等决定。
  2. 可变部分:此部分与算法在某次执行中处理的特定数据的大小和规模有关。问题规模较大时,可变部分可能大于固定部分。因此通常讨论算法的渐进空间复杂度。
相关文章
相关标签/搜索