阅读 10

数据结构和算法的基本概念

这是我参与更文挑战的第11天,活动详情查看: 更文挑战

前言

程序员面试必须准备的题目就是数据结构与算法,但是网上资料那么多,你还是无从学起,这是为啥呢,因为太乱了,没有一个系统完整的教程,这篇文章就给你说个明白。

首先讲一下数据结构和算法的关系。

举个栗子

​ 编程看作是一辆赛车,那么数据结构和算法就像是赛车的变速箱,开小轿车的人也可以开赛车,不懂变速箱原理也没关系,就像不懂数据结构和算法的人也可以编程,但是如果一个开车的人懂变速箱的原理,比如降低速度来获得更大的牵引力,或者通过降低牵引力来获得更快的行驶速度。在爬坡的时候使用1档,便可以获得更大的牵引力;下坡时便使用低档限制车的行驶速度。

回到编程而言,比如将用户的登录信息要临时存储在内存中,你会如何选择数据结构来存储呢,是用数组List还是ArrayList,或者HashMap,或者别的数据结构。当你不知道这些数据结构的区别和特性时,你会随意选择一种,这也能完成功能,但随着用户数量的增加,程序性能会不断下降,这就会存在性能问题,而一个懂数据结构和算法的人,在实际编程中会选择适当的数据结构来解决相应的问题,极大的减少资源浪费,提高程序性能。

一、数据结构

数据结构即数据存储的容器,它包括对数据项的增加、删除、查询、排序等基本功能。

如图是常见的数据结构:

1120165-20171124223229656-408723583.png

每一类数据结构都有不同的优点和缺点,链表的插入、删除快,而查找慢,平衡的二叉树插入、删除、查找都快,这都是实现这些数据结构的算法所造成的。

二、算法

算法简单来说就是解决问题的策略机制,有一定的操作步骤描述,他需要有一定的输入和输出,内部的计算机制决定了不同算法的优劣,这个优劣可以用空间复杂度时间复杂度来衡量。

算法的五个特征

  ①、有穷性:对于任意一组合法输入值,在执行又穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间内完成。

  ②、确定性:在每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径。

  ③、可行性:算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。

  ④、有输入:作为算法加工对象的量值,通常体现在算法当中的一组变量。有些输入量需要在算法执行的过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中。

  ⑤、有输出:它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法功能。

  

算法设计主要的几大方法:

有递推法、递归法、穷举法、贪心算法、分治法、动态规划法、迭代法、分支界限法、回溯法。

1、递归算法:直接或者间接不断反复调用自身来达到解决问题的方法。这就要求原始问题可以分解成相同问题的子问题。

2、动态规划法:动态规划与分治法相似,都是组合子问题的解来解决原问题的解,与分治法的不同在于:分治法的子问题是相互独立存在的,而动态规划应用于子问题重叠的情况。

动态规划方法通常用来求解最优化问题,这类问题可以有很多可行解,每个解都有一个值,找到具有最优值的解称为问题的一个最优解,而不是最优解,可能有多个解都达到最优值。

3、贪心算法:是就问题而言,选择当下最好的选择,而不从整体最优考虑,通过局部最优希望导致全局最优。

4、回溯法:是一种搜索算法,从根节点出发,按照深度优先搜索的策略进行搜索,到达某一节点后 ,探索该节点是否包含该问题的解,如果包含则进入下一个节点进行搜索,若是不包含则回溯到父节点选择其他支路进行搜索。

5、分支限界法:和回溯法相似,也是一种搜索算法,但回溯法是找出问题的许多解,而分支限界法是找出原问题的一个解。或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解

我们知道算法是解决问题的步骤,那么解决的是什么问题呢,在代码编程里就是解决数据项的查找、排序访问、插入、删除等,所以就有了排序算法、查找算法、加密算法等算法分类。

排序算法

属于算法的一种分类,常见的排序算法可以分为内部排序和外部排序。

常见的内部排序算法有:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序等。

这些排序算法底层原理都是基于上面说到的算法几大方法,所以不要去纠结怎么有这么多的算法名词,他们的概念是不一样的。

在不同的编程语言里,用不同的代码实现方式。

总结

总之,数据结构就像是数据的容器,而算法就是数据的操作策略,不同的数据结构用上不同的策略,会出现不同的解决结果,而如何取舍数据结构,就需要对算法原理有一定的认识,才能得出最优的设计方案。

所以我们的学习顺序可以是先了解不同算法策略的原理和特点,再学习不同的数据结构的特点。

希望这篇文章能帮助你理解数据结构和算法,从而能系统的学习。

拜了个拜。

文章分类
后端
文章标签