【初体验】走进算法与数据结构的世界...

132 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

1、写在前面

大家好,我是翼同学。今天文章的内容是:

  • 算法与数据结构·概述

2、内容

2.1、什么是数据结构?

数据结构的定义之一如下:

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

数据结构通过抽象的方法研究一组有特定关系的数据的存储和处理。

数据结构源自大型程序设计,随着大型程序设计的出现而出现。

随着时代的发展,人们利用计算机处理的数据从单纯的数值发展到表格、图形、声音等非数值数据,并且处理量也越来越多。因此在设计程序时,我们面临的部分问题会是:

  • 如何组织待处理的数据?
  • 如何表示这些数据间的关系?
  • 如何实现数据间的运算?

面对非数值计算问题时,我们关注的方向更多是数据的存储和组织方式,也就是该如何设计合适的数据结构?

因此,数据结构主要研究的方向为:

  • 数据之间的逻辑关系。
  • 数据及其数据之间的关系如何在计算机中存储和实现。
  • 当存储方式确定后,如何实现数据的运算。

2.2、逻辑结构与存储结构

数据的基本逻辑结构有四种:

  • 集合结构:数据元素之间的次序是任意无序的。数据之间唯一的联系就是属于同一个集合。
  • 线性结构:数据元素之间存在一对一的关系。如果线性结构为非空,此时除了首尾元素,其余元素有且只有一个直接前驱(元素)和一个直接后继(元素)。
  • 结构:数据元素之间存在一对多的关系。在树结构中,除了根结点之外,其余结点都是有且只有一个前驱结点和零至多个后继结点。
  • 结构:数据元素之间存在多对多的关系。在图结构中,每个元素都可以有多个前驱元素和多个后继元素。

image.png

数据的基本存储结构有四种:

  • 顺序存储:借助数据元素在存储器中的相对位置来表示数据之间的关系,可采用数组实现。
  • 链式存储:通过指针显示指出元素之间的逻辑关系。
  • 散列存储:也称哈希存储,其专用于集合结构的数据存储方式,将数据元素按照关键字和一个唯一的存储位置关联起来。
  • 索引存储:数据被排成一个序列:d1,d2,...dnd_1, d_2, ... d_n,每个数据 did_i 在序列中都会有一个位序 iiii 的取值范围是 [1,n][1, n]。位序可作为数据的索引存储在索引表中。

2.3、数据运算

数据有八种基本运算,如下所示:

  • 创建:创建某种数据结构
  • 遍历:按照某种顺序访问数据结构中的每个元素
  • 访问:访问数据结构中某个元素的值
  • 修改:更新数据结构中某个元素的值
  • 查找:在数据结构中查找满足特定条件的数据元素
  • 插入:在数据结构中指定的位置插入一个新数据元素
  • 删除:将数据结构中的某个指定元素删除掉
  • 清空:删除某种数据结构

2.4、数据结构小结

image.png

2.5、什么是算法?

计算机科学的研究对象和目的就是计算

我们在计算过程中,需要研究本质的内在的规律,并且总结一般性方法,进而实现有效高效的计算,最好还能低耗。

因此就有了算法的概念:

算法指在特定的计算模型下,用于解决特定问题的指令序列。

事实上,算法就是一种解题方案的准确描述,是一系列解决问题的清晰指令。其特点是输入待处理的信息后可以输出答案。

有了算法的概念后,我们可研究的方向就多了:

  • 如何设计算法?
  • 如何优化算法
  • 如何评判不同算法的优劣?

2.6、算法的设计标准

那到底什么才是一个好算法?

我们会说,好的算法是可以正确处理任何输入,并且遇到不合法的输入时可以进行适当处理,还要能结构清晰的,所有的变量和带有语义的对象的命名要准确的等等。这些确实是重要的评分标准,但还有另一方面是我们需要考虑的,那就是效率。

算法优劣的标准,一般来说有两点:速度与消耗。我们希望计算的速度尽可能的快,消耗的空间资源尽可能少。

image.png

因此好的算法应具备四个特性:

  • 正确性:执行结果应满足待解决问题的要求;
  • 高效性:有较高的时间效率以及可以有效地使用存储空间;
  • 可读性:算法的描述应是思路清晰且层次分明的,简洁易懂的;
  • 健壮性:可以识别错误并进行相应的处理。

2.7、衡量算法效率

我们需要有一种方法来度量算法。只有当我们能够度量算法效率的好坏后,才能试着去改进和优化算法。

同一个问题可以有不同的算法,我们该如何去评判其效率的优劣?

当我们用高级程序语言编写的程序在运行时所消耗的时间取决于以下因素:

  1. 算法选用的策略,这是算法好坏的根本;
  2. 问题的规模,也就是算法的运行工作量;
  3. 编写程序的语言,对于同一个算法,实现语言越高级,其执行效率越低;
  4. 编译产生的代码质量,这需要系统软件的支持;
  5. 机器执行指令的速度,这要看硬件的性能;

上述因素中,后面三个与算法设计无关。我们只关心算法在运行时核心操作的执行次数。我们将这个核心操作称为原操作。一般情况下,算法中原操作重复执行的次数就是问题规模n的某个函数f(n)f(n)


3、写在最后

好了,今天的笔记就记到这里。