数据结构和算法概述
Posted 程序员小潘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构和算法概述相关的知识,希望对你有一定的参考价值。
1. 数据结构
在计算机科学中,「数据结构」是计算机中存储、组织数据的方式。
上面这句话是维基百科对数据结构的说明,再细一点。
何为数据?数据是计算机可以识别且可以操作的对象,它是可以输入给计算机处理的符号集合。它可以是数字、文本,甚至可以是图片或视频等数据。
何为结构?结构就是指数据的关系,例如「父亲和儿子」它俩构成了父子关系。在计算机中,数据并不是独立存在的,而是存在某种特定关系的元素集合。可以说,数据结构描述的是数据的组织方式。
数据结构按照不同的维度,可以划分为两类:逻辑结构和物理结构。
1.1 逻辑结构
逻辑结构指数据元素间存在的逻辑关系,与元素实际存储的物理结构无关。
1.1.1 集合结构
集合结构中,元素除了同属于一个集合外,元素之间再没有任何关系。
1.1.2 线性结构
线性结构中元素是一对一的关系。
1.1.3 树形结构
树形结构中的元素之间存在一对多的层次关系,不同于现实中的树,它是一颗倒立生长的树,树根在顶端,树叶在底端。
1.1.4 图形结构
图形结构中的元素是多对多的关系。
1.2 物理结构
物理结构也叫「存储结构」,它代表数据元素的逻辑结构在计算机中的存储形式。
数据是数据元素的集合,CPU 只负责进行计算,计算完毕后,数据以何种形式存储在计算机的存储器中,是由数据的物理结构来定义的。
1.2.1 顺序结构
1.2.2 链式结构
链式结构比顺序结构显得要更加的灵活,它无需事先就明确容量,可以随时添加新的元素,也可以随时将元素从集合中剔除。缺点就是元素需要存储额外的指针,占用一定的空间。
2. 算法
算法(algorithm),在数学(算学)和计算机科学之中,一个被定义好的、计算机可施行之指示的有限步骤或次序,常用于计算、数据处理和自动推理。作为一个有效方法,算法被用于计算函数,它包含了一系列定义清晰的指令,并可于有限的时间及空间内清楚的表述出来。
上面是维基百科中对算法的说明,现如今大家普遍对算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令包含一个或多个操作。
说起来可能不太好理解,大家都做过算术题吧,对于同样一道题目,可能存在多种解法都可以算出正确答案,不同的解法都可以看作是一种算法,它描述的就是解题得到答案的计算步骤。
2.1 算法的特性
算法的五个基本特性:
-
输入 -
输出 -
有穷性 -
确定性 -
可行性
2.1.1 输入和输出
算法具有零个或多个输入参数,且至少有一个或多个输出结果。
对于非常简单的算法,它可能没有输入,但是必须要有输出。这里说的输出并不是说方法必须要有返回值,而是说它必须要有输出结果,这个结果可以是得到 N 个具体的值,也可以是控制台输出一段文字。如果一个算法没有输出,那它存在的价值是什么?
2.1.2 有穷性
算法的有穷性是指:算法在执行有限的步骤后必须自动结束而不会出现死循环,并且每个步骤的执行时间在可接受的范围内。
如果一个算法出现了死循环,或者无限递归,那它就不满足有穷性了。
2.1.3 确定性
算法的每一个步骤都有明确的含义,不会出现二义性。在特定的条件下,只有唯一一条执行路径。对于同样的输入,必须保证具有相同的输出,算法的每个执行步骤都被精确定义而无歧义。
2.1.4 可行性
算法的每个步骤都必须是可行的,都能够通过执行有限的次数完成。可行性意味着算法可以转换为程序在计算机上运行,且得到一个输出结果。如果一个算法不可行,无法执行它来计算得到结果,那它也就没有存在的价值了。
2.2 算法的设计要求
满足上述的五个特性,才能被称作是「算法」。但是即便如此,对于同样一个问题,仍然有多种实现在满足算法特性的前提下都能解决问题。
面对这种情况,哪种算法才是更好的呢?什么样的算法才是好算法呢?我们应该朝着哪些目标去设计优秀的算法呢?
2.2.1 正确性
算法应该至少具有输入、输出和数据加工处理无歧义性、能正确反应问题的需求、能够得到正确的答案。
这是设计算法首先要保证的,对于数据的输入,算法必须保证能得到正确的结果输出。如果一个算法连正确的结果都无法保证,那还设计它干什么?
算法的「正确性」有四个层次。
-
算法程序没有语法错误。 -
对于合法的输入能够产生正确的输出。 -
对于非法的输入能够产生满足规格说明的输出。 -
对于精心选择甚至刁难的测试数据,能够产生正确的输出。
2.2.2 可读性
算法设计出来,首先是为了便于人类阅读,理解和交流,其次才是被机器执行的。
可读性高便于人们理解算法的思想、方便调试、及时发现隐含的错误等。
2.2.3 健壮性
对于不合法的输入,应该做相应的处理,而不是发生异常或输出错误的结果。
2.2.4 时间效率高
算法的执行时间越短,则其时间效率越高。如果有多个算法都可以解决问题,则应该优先考虑时间效率高的。
2.2.5 存储量低
算法程序运行时应该尽量保证其占用的内存或硬盘空间低。花更少的时间,更少的存储可以解决同样的问题,那它就是更好的算法。
3. 总结
数据结构和算法是程序员进阶避不开的话题,本篇文章记录了数据结构和算法的概述和基本特征,后面会介绍算法的时间复杂度和空间复杂度的计算方法。
以上是关于数据结构和算法概述的主要内容,如果未能解决你的问题,请参考以下文章