【数据结构与算法】起始篇


持续学习&持续更新中…

守破离


  • 数据结构和算法是几百上千年无数科学家、数学家的智慧沉淀、智慧结晶,具有深厚的背景。
  • 数据结构和算法非常有趣,也是智慧的结晶。
  • 学习它们是去感受计算机编程技术的魅力。在理解掌握它们的同时,整个过程都是一种愉悦的心情感受,而非枯燥乏味的一门课程。

什么是数据结构和算法

  • 数据结构就是指一组数据的存储结构。算法就是操作这些数据的一组方法。
  • 数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。 因此,我们无法孤立数据结构来谈算法,也无法孤立算法来谈数据结构。
  • 数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。

什么是数据结构

在这里插入图片描述

  • 数据结构研究的是:数据如何在计算机中进行组织和存储,使得我们可以高效的对数据进行增删改查等操作。

  • 我们要根据应用的不同,灵活的选择最合适的数据结构,进而使用相应的算法去解决相应的问题。

什么是算法

  • Algorithm的本意:解决问题的方法

  • 算法:一系列解决问题的,清晰,可执行的计算机指令。

  • 算法从宏观上来说是用于解决特定问题的一系列的执行步骤。

  • 对于同一个问题来说,使用不同的算法来解决,效率可能相差非常大,详见 斐波那契数列一文.

  • 生活中也有算法

    1. 问路:如何去天安门
    2. 如何求解一元二次方程
    3. 菜谱(做一道菜的步骤)

在这里插入图片描述

为什么要学习数据结构和算法1

我们学任何知识都是为了“用”的,是为了解决实际问题的,学习数据结构和算法自然也不例外。

在这里插入图片描述

  1. 可以更好地学习计算机专业课程,为今后的职业发展夯实基础。
  2. 锻炼编程能力,写出更高效、更优质的代码。
  3. 锻炼大脑思维,使我们思考问题更加理性、更加全面。
  4. 学好数据结构和算法后可快速学习新技术
  5. 期末考试/考研都会考数据结构。
  6. 除了一些外包或者小公司之外,其它公司找工作都会面试数据结构。
  7. 提高编程内功 写出更优秀的代码
  8. 计算机专业的必修课,深刻理解计算机科学、深刻理解程序
  9. 刷题是数据结构和算法的应用
  10. 数据结构和算法决定了软件工程师的上限,最功利的讲:为了通过面试关,也要学好数据结构和算法。
  • 总之,功利一点,学好数据结构和算法,对于我们今后的前途/钱途都很重要。

为什么要学习数据结构和算法2

  • 生活中用不到三角函数、微积分等这种数学?

    1. 仔细思考一下
    2. 手机、电脑、电视
    3. 建筑物
    4. 专家对经济形势的分析
    5. 金融产品的机制
    6. 动画
    7. 游戏
    8. 都离不开数学
  • 工作用不到算法?

    1. 生活中使用到的
    2. 操作系统
    3. 搜索引擎
    4. 数据库
    5. 网络
    6. 游戏
    7. 到处都是算法
  • 尽管你不学,你用不到,但是你不能否认数学、算法等基础学科对于这个社会、世界的意义

为什么要学习数据结构和算法3

  • 经典数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。

  • 业务开发时,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。

  • 如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。

  • 写出达到开源水平的框架才是你的目标!

  • 不同的公司、不同的人做出的框架,架构设计思路都差不多,最后实现的功能也都差不多。但是有的人做出来的框架,Bug 很多、性能一般、扩展性也不好,只能在自己公司仅有的几个项目里面用一下。而有的人做的框架可以开源到 GitHub 上给很多人用,甚至被 Apache 收录。为什么会有这么大的差距呢?

  • 高手之间的竞争其实就在细节。这些细节包括:你用的算法是不是够优化,数据存取的效率是不是够高,内存是不是够节省等等。这些累积起来,决定了一个框架是不是优秀。

  • 对编程还有追求?不想被行业淘汰?那就不要只会写凑合能用的代码!

  • 何为编程能力强?是代码的可读性好、健壮?还是扩展性好?我觉得没法列,也列不全。但是,在我看来,性能好坏起码是其中一个非常重要的评判标准。但是,如果你连代码的时间复杂度、空间复杂度都不知道怎么分析,怎么写出高性能的代码呢?

  • 我们学习数据结构和算法,并不是为了死记硬背几个知识点。我们的目的是建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。

为什么要学习数据结构和算法4

  • 可能在大家平时的开发过程中,不怎么用到数据结构与算法的知识。那是因为我们的很多开发任务,都可以直接用各种第三方框架来完成。
  • 然而,很多第三方框架内部都用到了大量的数据结构与算法的知识。
  • 如果你懂数据结构与算法,就可以更好地去读懂框架源码,体会作者的设计思想,也能让你更好地使用框架,把框架的价值发挥到最大。
  • 平时没用到数据结构与算法,也可能是因为自己目前开发的项目还太小。当开发大型项目,面对海量数据处理,或者要求性能的极致优化时,必然要用到数据结构与算法来优化程序。所以,很多时候,并不是数据结构与算法没有用,而可能是自己的境界还不够高

数据结构和算法的重要性

推荐阅读:李开复老师《算法的力量》一文

计算机中数据结构和算法无处不在

  • 无论是大到开发操作系统或者数据库这样的大型软件还是小到压缩一个zip、mp3文件都需要使用到大量的数据结构。

  • 如果我们在开发软件时,使用了合适的数据结构和算法,会使得我们的软件更加稳定及高效。

数据结构 + 算法 = 程序

  • 数据结构离不开算法,算法也离不开数据结构。有了数据结构才能有对应高效的算法。

  • 只有先使用数据结构将数据组织存储在一起,才可以使用算法的逻辑去处理数据,然后在这个基础上去进一步研究更加高效的算法,进一步提升程序的效率。

  • 一台计算机的CPU运算能力是固定的,只会机械地接收程序的指令,所以,算法的优劣就决定了程序设计水平的高低。

计算机专业竞争力

  • 学习数据结构可以培养我们的计算机专业的基本素质。

  • 随着计算机以及软件行业的飞速发展,开发一个APP、网站,非计算机专业人士都能直接使用工具来生成符合自己需求的程序,对于我们计算机专业人士来说,我们的竞争力也许就在数据结构和其他基础课程上(计算机组成、计算机网络、…)。

数据结构和算法的意义

  • 由于计算机科学不断地发展,很多底层算法已经封装好了,后来的开发者很多时候是基于这些已经封装好的算法再去进行拓展。
  • 这种拓展有可能还是算法领域这种基础学科的拓展,也有可能只是业务的拓展,不管是怎样的拓展,其实都是非常有意义的,都是在为我们这个社会、为我们这个世界做贡献
  • 这就好像所有学习计算机的同学肯定都深入的学习了排序算法的内部原理,但实际上,在真正的工作中,是基本不会从底层实现一个排序算法的,我们学习这些排序算法的目的关键是在于培养我们的思维能力,或者说是培养我们所谓的计算机的专业素质,让我们遇到新的问题的时候,能够借鉴一些前人的方式,去创新性的解决一些新的问题

  • 基础的数据结构和算法是高级的数据结构和算法的基石
  • 算法很多时候就是一个底层的工具,它在帮助我们揭示最朴素的那个问题的解,但是,怎么使用算法这个工具,很多时候,我们还需要在不同的领域中进行开创性的探索、实验。
  • 但不管怎样,我们必须先了解、掌握、熟悉这些工具,了解掌握了这些工具之后才能灵活的运用这些工具,进一步的解决更多的问题。
  • 算法的意义就在于:它帮助我们拓展了我们的思维,丰富了我们解决问题的工具库,更深刻的帮助我们认识了很多问题的本质,进而这些内容经过我们的消化吸收,就会形成属于我们自己的所谓的计算机技术人的素养,那种看待问题的方式,这些都将逐渐帮助我们创新性的解决更多的问题,做出更多的成就,慢慢的为这个世界做出更多的贡献

如何学习数据结构和算法

  • 特定的数据结构适用于特定的场景

  • 学习数据结构其实就是在学习基于这些数据结构的增删改查这些操作,来看这些操作的底层逻辑是怎样的,最终组合出每一种数据结构它的性能效率如何、有什么样的特点、可以在哪些特殊的场景起到作用。

  • 在学习数据结构和算法的过程中,要注意,不要只是死记硬背,不要为了学习而学习,而是要学习它的“来历”、“自身的特点”、“适合解决的问题”以及“实际的应用场景”。

  • 学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。

几句话

  • 随着年龄的增长,无论是学习能力,还是体力都会有一定程度地下降。所以,我们更应该珍惜时间,不要在应该努力奋斗的年纪选择安逸,学习和积累都要趁早。如果你想在IT路上走得更远,站得更高,那就必须掌握数据结构与算法。更何况这真的是一种一次掌握,终生受益的技术。

  • 在技术圈里,我们经常喜欢谈论高大上的架构,比如高可用、微服务、服务治理等等。鲜有人关注代码层面的编程能力,而愿意沉下心来,花几个月时间啃一啃计算机基础知识、认认真真夯实基础的人,简直就是凤毛麟角。

  • 像区块链、人工智能这些看似很新的技术,其实一点儿都不“新”。只有把那些基础的知识都学透了。当面临行业变动、新技术更迭的时候,你就会发现,那些所谓的新技术,核心和本质的东西其实就是当初学的那些知识。掌握了这个“规律”之后,学任何东西都会很快,任何新技术都能快速迎头赶上。这或许是一种快速学习并且获得成功的秘诀。

  • 基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。

  • 人生路上,我们会遇到很多的坎。跨过去,你就可以成长,跨不过去就是困难和停滞。而在后面很长的一段时间里,你都需要为这个困难买单。对于我们技术人来说,更是这样。既然数据结构和算法这个坎,我们总归是要跨过去,为什么不是现在呢?

注意

  • 知识需要沉淀,不要想试图一下子掌握所有

  • 在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。学习知识的过程是反复迭代、不断沉淀的过程。

参考

liuyubobobo老师课程: 算法与数据结构体系课.

小码哥李明杰老师课程: 恋上数据结构与算法 第一季.

小码哥李明杰老师文章: 数据结构与算法真的那么重要么.

小码哥李明杰老师博客: M了个J.

王争: 数据结构与算法之美.

程杰: 大话数据结构.

百度百科: 数据结构.

百度百科: 算法.


本文完,感谢您的关注支持!


微信扫码订阅
UP更新不错过~
关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就进行交换。走访数列的工作会重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 Python 代码: ```python def bubble_sort(arr): n = len(arr) for i in range(n): # 这里j只需要遍历到n-i-1就好了,因为前面的已经排好序了 for j in range(n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] arr = [64, 34, 25, 12, 22, 11, 90] bubble_sort(arr) print(arr) ``` 输出结果: `[11, 12, 22, 25, 34, 64, 90]` 2. 选择排序 选择排序是一种简单直观的排序算法。它的工作原理:首先在未排序的数列中找到最小元素,存放到排序序列的起始位置,然后再从剩余未排序的元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 Python 代码: ```python def selection_sort(arr): n = len(arr) for i in range(n): min_index = i for j in range(i+1, n): if arr[j] < arr[min_index]: min_index = j arr[i], arr[min_index] = arr[min_index], arr[i] arr = [64, 34, 25, 12, 22, 11, 90] selection_sort(arr) print(arr) ``` 输出结果: `[11, 12, 22, 25, 34, 64, 90]` 3. 插入排序 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 Python 代码: ```python def insertion_sort(arr): n = len(arr) for i in range(1, n): key = arr[i] j = i-1 while j >= 0 and arr[j] > key: arr[j+1] = arr[j] j -= 1 arr[j+1] = key arr = [64, 34, 25, 12, 22, 11, 90] insertion_sort(arr) print(arr) ``` 输出结果: `[11, 12, 22, 25, 34, 64, 90]` 4. 快速排序 快速排序是一种高效的排序算法,采用了分治思想。它的基本思路是:先从数列中取出一个数作为基准数,然后将数组中小于该数的数放在其左边,大于该数的数放在其右边。然后再对左右区间重复该过程,直到各区间只有一个数。 Python 代码: ```python def quick_sort(arr, start, end): if start < end: pivot_index = partition(arr, start, end) quick_sort(arr, start, pivot_index-1) quick_sort(arr, pivot_index+1, end) # 划分函数 def partition(arr, start, end): # 选取最后一个元素作为基准数 pivot = arr[end] i = start - 1 for j in range(start, end): if arr[j] < pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i+1], arr[end] = arr[end], arr[i+1] return i+1 arr = [64, 34, 25, 12, 22, 11, 90] quick_sort(arr, 0, len(arr)-1) print(arr) ``` 输出结果: `[11, 12, 22, 25, 34, 64, 90]` 5. 归并排序 归并排序是采用分治法的一种排序算法,该算法采用先分后治的思路,先将问题分解成一些小的子问题,然后逐个解决子问题,最后将结果合并起来。归并排序的核心是合并两个有序序列,这个过程非常简单。 Python 代码: ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left_arr = merge_sort(arr[:mid]) right_arr = merge_sort(arr[mid:]) return merge(left_arr, right_arr) # 合并两个有序序列 def merge(left_arr, right_arr): i = j = 0 merged_list = [] while i < len(left_arr) and j < len(right_arr): if left_arr[i] < right_arr[j]: merged_list.append(left_arr[i]) i += 1 else: merged_list.append(right_arr[j]) j += 1 merged_list += left_arr[i:] merged_list += right_arr[j:] return merged_list arr = [64, 34, 25, 12, 22, 11, 90] arr = merge_sort(arr) print(arr) ``` 输出结果: `[11, 12, 22, 25, 34, 64, 90]`

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lpruoyu

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值