数据结构和算法概述

数据结构和算法概述

 算法(algorithm),解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列。或者说:算法是一个被定义好的、计算机可施行的有限步骤或次序。

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。

算法的五个重要特征:

  有穷性:一个算法必须保证执行有限步后结束;

  确切性:算法的每一步必须有确切的定义(也称之为确定性);

  可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性);

  输入:一个算法有0个或多个输入,以刻画运算对象的初始条件。所谓0个输入是指算法本身定出了初始条件;

  输出:一个算法有1个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。

算法的本质:算法是对规律的拟合。

发现算法的过程就是发现规律、对规律进行拟合的过程。

算法是一种以数学为本质的计算方法。然而作为方法,则必有正确(可行)、不正确(不可行),高效、低效之分。若一个算法对每一个恰当的输入(严格地符合问题的前提条件,且可以为空)都以正确的输出终止程序,则可以称该算法是正确的,并正确地解决了给定的问题。若算法以不正确的输出而终止程序,或根本无法终止程序(如程序陷入死循环),则这个算法是不正确的。

对算法至关重要的不只有其正确性,还有它的效率。时间复杂度和空间复杂度是衡量一个算法优劣的标尺。

算法设计应遵循的原则:

  正确性:能正确处理无歧义、反映出有效问题的需求,得到满足要求的结果;

  可读性:便于阅读、理解和交流;

  健壮性:当输入数据不合法时可以对其进行处理(得出满足规格说明的结果);

  高效率低存储:尽可能满足时间效率高、存储量低。

算法要高效实现,需要数据结构来配合。数据结构(data structure)是计算机中存储、组织数据的方式。不同种类的数据结构适合不同种类的应用,部分数据结构甚至是为了解决特定问题而设计出来的。例如B树即为加快树状结构访问速度而设计的数据结构,常被应用在数据库和文件系统上。

正确的数据结构选择可以提高算法的效率(请参考算法效率)。在计算机程序设计的过程中,选择适当的数据结构是一项重要工作。许多大型系统的编写经验显示,程序设计的困难程度与最终成果的质量与表现,取决于是否选择了最适合的数据结构。

数据结构和算法的关系

程序 = 数据结构 + 算法 。数据结构为算法提供服务。算法围绕数据结构操作。

数据结构用于解决数据存储问题,而算法用于处理和分析数据,数据结构和算法存在“互利共赢、1+1>2”的关系。在解决问题的过程中,数据结构要配合算法选择最优的存储结构来存储数据,而算法也要结合数据存储的特点,用最优的策略来分析并处理数据,由此可以最高效地解决问题。

常见的数据结构

  字符串(string)的存储结构也是一种线性存储结构,只用于存储字符类型的数据。

  栈(Stack):栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。只允许在有序的线性资料集合的一端(称为堆栈顶端top)进行加入数据(push)和移除数据(pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。

  队列(Queue):队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(rear)进行插入操作,在前端(front)进行删除操作。

  数组(Array):数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。最简单的数据结构类型是一维数组。二维数组,对应于数学上的矩阵概念,可表示为二维矩形格。

  链表(Linked List):链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接("links")指针(Pointer)。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

  树(Tree):树是典型的非线性结构。树用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点都只有有限个子节点或无子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;
  • 树里面没有环路(cycle)。

   图(Graph):图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。一张图由一些小圆圈(称为顶点或结点)和连结这些圆点的直线或曲线(称为边)组成。图有多种变体,包括简单图、多重图、有向图、无向图等。

  堆(Heap):堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的实现通过构造二叉堆(binary heap),实为二叉树的一种;由于其应用的普遍性,当不加限定时,均指该数据结构的这种实现。这种数据结构具有以下性质。

  • 任意节点小于(或大于)它的所有后裔,最小元(或最大元)在堆的根上(堆序性)。
  • 堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入。

  散列表(Hash table,也叫哈希表):散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。散列表是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

数据结构的基本概念和术语

数据(data):描述客观事物的数字和符号,是能够被计算机识别且进行处理的的符号集合。

(文字、图像、图形、声音、视频等多媒体信息则可以通过合适的编码保存处理)

数据元素(data element) :组成数据且有意义的的基本单位 (个体)。

数据项(data item):组成数据元素具有特定意义的最小不可分割单位。

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

在数据结构这门课程中,数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。
在数据结构就像我们讨论一部电影时,是讨论这部电影角色这样的“数据元素' 而不是针对这个角色的姓名或者年龄这样的“数据项”去研究分析。中讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。

【结构,简单的理解就是关系——各个组成部分相互搭配和排列的方式。】

数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,包括三方面的内容:逻辑结构、物理结构(存储结构)和运算(操作)。

逻辑结构和物理结构(存储结构)

逻辑结构指数据对象中数据元素(data element)之间的相互关系。

①集合结构:数据元素之间的唯一关系就是属于同一个集合。

②线性结构:数据元素之间存在一对一的关系(除首尾元素均存在前驱和后继),如:线性表,栈,队列

③树形结构:数据元素之间存在一对多的关系,如:树

④图形结构:数据元素之间存在多对多的关系,如:图。

物理结构(存储结构)

物理结构指数据的逻辑结构关系在计算机中的存储形式。

①顺序存储结构:把元素分别放在地址连续的存储单元中的存储方式。

也就是说:元素一个一个有序的排好队,各自占据一定的空间,例如定义一个含有6个浮点型数据的数组:然后内存中的一块大小为6个浮点型数据大小空间就会被计算机所开辟,然后数据存入时,依次顺序摆入。

优点:随机访问快(可以直接计算数据的地址)。

缺点:插入、删除效率低,不利于动态增长。

②链式存储结构:把元素存储在任意的存储单元中的存储方式。

因为数据元素位置不确定,所以需要通过指针指向到元素的存储地址,从而确定不同数据元素之间的位置。

缺点:随机访问慢。

优点:便于插入、删除和动态增长。

③ 散列 (哈希) 存储方式:是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。

它的原理就是,将一个节点的关键字key作为自变量,通过一个确定的函数运算f(key),其函数值作为节点的存储地址,将节点存入到指定的位置上,查找的时候,被搜索的关键字会再次通过f(key)函数计算地址,然后读取对应数据。

④ 索引存储方式:存储时,除了存储节点,还附加建立了索引表来表示节点的地址。

数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。

为什么要有数据类型?

数据类型是按照值的不同进行划分的。在高级语言中,每个变量、常量和表达式都有各自的取值范围。类型就用来说明变量或表达式的取值范围和所能进行的操作。

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

原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等。

结构类型:由若干个类型组合而成,是可以再分解的。例如,整型数组是由若干整型数据组成的。

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

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

为什么有了数据类型,还要有抽象数据类型呢?

数据类型不仅仅指那些已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型,比如我们编写关于计算机绘图或者地图类的软件系统,经常都会用到坐标。也就是说,总是有成对出现的x和y,在3D 系统中还有z出现,既然这三个整型数字是始终在一起出现,我们就定义一个叫point 的抽象数据类型,它有x、y、z三个整型变量,这样我们很方便地操作一个point数据变量就能知道这一点的坐标了。

抽象数据类型(Abstract Data Type, ADT) 是一个数据结构以及定义在该结构上的一组操作的总称。它是对数据类型的抽象,抽象的意义在于数据类型不是高级程序语言支持的基本数据类型,而是自定义的数据类型。抽象数据类型(ADT)的格式:

ADT 抽象数据类型名

Data

    数据元素之间的逻辑关系的定义

Operation

    操作1:

    操作2:

    …

endADT

数据的运算

数据结构研究的内容:就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。算法研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。一般有以下几种常用运算(对数据的操作):

  • 检索:检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。
  • 插入:往数据结构中增加新的节点。
  • 删除:把指定的结点从数据结构中去掉。
  • 更新:改变指定节点的一个或多个字段的值。
  • 排序:把节点按某种指定的顺序重新排列。例如递增或递减。

算法

算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。

各种常见算法常见的分类

☆排序算法:快速排序、归并排序、计数排序、堆排序

☆搜索算法:回溯、递归、剪枝技巧

☆图论:最短路、最小生成树、网络流建模

☆动态规划:背包问题、最长子序列、计数问题

☆字符匹配算法

算法常用设计模式

☆完全遍历法和不完全遍历法:在问题的解是有限离散解空间,且可以验证正确性和最优性时,最简单的算法就是把解空间的所有元素完全遍历一遍,逐个检测元素是否是我们要的解。这是最直接的算法,实现往往最简单。但是当解空间特别庞大时,这种算法很可能导致工程上无法承受的计算量。这时候可以利用不完全遍历方法——例如各种搜索法和规划法——来减少计算量。

☆分治法:把一个问题分割成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。

☆动态规划法:当问题的整体最优解就是由局部最优解组成的时候,经常采用的一种方法。

☆贪心算法:常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。

☆线性规划法:线性规划是最优化问题中的一个重要领域。在作业研究中所面临的许多实际问题都可以用线性规划来处理,特别是某些特殊情况,例如:网络流、多商品流量等问题,都被认为非常重要。。

☆简并法:把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。

算法效率的度量

算法效率的度量是通过时间复杂度和空间复杂度来描述的。关于算法复杂度详情,可参见https://blog.csdn.net/cnds123/article/details/120653794https://segmentfault.com/a/1190000023860213

学习数据结构和算法,作为入门,可看:

《大话数据结构》这本书最大的特点是它将理论讲的非常有趣,不枯燥。而且每个数据结构和算法作者都结合生活中的例子进行讲解。

《秒懂算法:用常识解读数据结构与算法》简单易懂的数据结构与算法入门书。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值