1.什么是数据结构 & 算法
my:数据结构是数据间的有机关系,而算法是对数据的操作步骤**;两者不可分开来谈,不能脱离算法来讨论数据结构,也不能脱离数据结构研究算法。
-->数据结构是一种思想,那么 算法是 对思想的具体实现
-->计算机中的算法则是描述计算机上的计算过程:具体的说法:对数据的操作步骤
-->my:数据结构:(描述)数据间的(有什么)关系;算法:操作数据(会用到数据结构)来解决问题,也就是解决问题时的计算过程
2.参考资料:
2.1 https://zhuanlan.zhihu.com/p/23191006
有这么一句话说“程序=数据结构+算法”,也有人说“如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)”。
当然这是笼统的说法,不过也稍微懂得了数据结构和算法的重要性了。
其实,数据结构是数据间的有机关系,而算法是对数据的操作步骤;两者不可分开来谈,不能脱离算法来讨论数据结构,也不能脱离数据结构研究算法。
在网上看到这样一段话:
数据结构并不是来教你怎样编程的,同样编程语言的精练也不在数据结构的管辖范围之内,那是教你学习一门语言的老师的事情,他肯定不想因为数据结构而失业。数据结构是教你如何在现有程序的基础上把它变得更优(运算更快,占用资源更少),它改变的是程序的存储运算结构而不是程序语言本身。
如果把程序看成一辆汽车,那么程序语言就构成了这辆车的车身和轮胎。而算法则是这辆车的核心——发动机。这辆车跑得是快是慢,关键就在于发动机的好坏(当然轮胎太烂了也不行),而数据结构就是用来改造发动机的。
可以这么说,数据结构并不是一门语言,它是一种思想,一种方法,一种思维方式。它并不受语言的限制,你完全可以在gave 中轻而易举地实现一个用C语言给出的算法。
或许你在初入职场的时候并不会涉及到需要使用到数据结构的地方,也因而觉得数据结构貌似没用,但这和“农民工也能盖大楼,干嘛还学建筑呢?” 是一个道理,应该都懂。
2.2 https://www.zhihu.com/topic/19553510/intro
概念简述
算法(Algorithm)是基于特定的计算模型, 旨在解决某一信息处理问题而设计的一个指令序列。不正式地说,算法是任何定义明确的计算过程,该过程取某个值或值的集合作为输入,并产生某个值或值的集合作为输出,算法 就是这样的把输入转换成输出的 计算步骤的 一个序列。
必备特征
算法必须具有以下特征:
-
输入:待计算问题的任一实例,都需要以某种方式交给对应的算法,对所求解问题特定实例的这种描述统称为输入;
-
输出:经计算和处理之后得到的信息,即针对输入问题实例的答案,称作输出;
-
确定性:算法应可描述为由若干语义明确的基本操作组成的指令序列;
-
可行性:每一基本操作在对应的计算模型中均可兑现;
-
有穷性:任意算法都应在执行有限次基本操作之后终止并给出输出。
实际例子
算法不是计算机领域中才有的概念,不仅仅局限于编程语言,它可以用任何方式来描述,比如对于问题:过直线l上给定的点P,作该直线的垂线。古埃及人解决该问题的一个算法为:
输入:直线l及其上一点P 输出:经过P且垂直于l的直线 1. 取12段等长绳索,依次首尾联结成环,联结处称作“结”,按顺时针方向编号为0到11 2. 奴隶A看管0号结,将其固定于点P处 3. 奴隶B牵动4号结,将绳索沿直线l方向尽可能地拉直 4. 奴隶C牵动9号结,将绳索尽可能地拉直 5. 经过0号和9号结,绘制一条直线
计算机中的算法则是描述计算机上的计算过程,比如插入排序算法的伪代码描述:
输入:n个数的一个序列<a[1], a[2], ..., a[n]> 输出:输入序列的一个排列<b[1], b[2], ..., b[n]>,满足b[1] <= b[2] <= ... <= b[n] INSERTION-SORT(A) for j = 2 to A.length key = A[j] i = j - 1 while i > 0 and A[i] > key A[i + 1] = A[i] i = i - 1 A[i + 1] = key
上述算法可以用不同的编程语言来描述,比如用Python描述:
def insertSort(A): for j in range(2, len(A)): key = A[j] i = j - 1 while i > 0 and A[i] > key: A[i + 1] = A[i] i = i - 1 A[i + 1] = key
比如用C++描述:
template<typename T> void insertSort(std::vector<T>& A) { for (int j = 2; j < A.size(); ++j) { auto key = A[j]; int i = j - 1; while (i > 0 && A[i] > key) { A[i + 1] = A[i]; --i; A[i + 1] = key; } } }
优劣分析
由于计算机不是无限快,内存不是免费的,计算时间和空间是一种有限资源,高效的算法可以更好地利用这些资源,因此算法可以像计算机硬件一样视为一种技术。度量算法成本的方式称为复杂度分析,复杂度可分为时间复杂度和空间复杂度。由于运行任一算法的空间消耗都不会多于运行期间进行的基本操作次数,即时间复杂度本身就是空间复杂度的上界,因此复杂度分析主要关注时间复杂度,而时间复杂度分析主要关注最坏情况下的运行时间,即最长运行时间。复杂度分析一般用渐进记号大O表示,它用一个函数来描述某个函数的数量级上界。最低复杂度是O(1),代表常数时间复杂度,因为不能指望没有任何代价来运行算法。依次递增的常见复杂度层级还有O(log n)、 O(√n)、O(n)、O(nlog n)、O(n^2)、O(n^3)、O(2^n)等。
常见种类
计算机中存储和组织数据的方式称为数据结构,因此计算机中的算法通常也与数据结构紧密相连,最常见的一类算法就是数据结构的插入、删除、查找、遍历、排序等,一般此类算法会封装为编程语言的标准之一,如C++ STL中的算法。除了数据结构相关算法外,还有图算法、数论算法、矩阵运算、计算几何、压缩算法、加密算法、数据挖掘算法、并行算法等。算法设计与分析的基本方法有蛮力法、分治法、动态规划、贪心算法等。并非所有问题都存在有效算法,对于NP完全问题是否存在有效算法是未知的。