数据结构与算法的第一天 原创

发布于 2022-1-18 14:25
浏览
0收藏

春节不停更,此文正在参加「星光计划-春节更帖活动」

前言

  • 这是我在51CTO春节不停更,此文正在参加「星光计划-春节更帖活动」第二天的第二篇文章了,我打算之后这几天时间里面跟大家讲一讲,我这几天学习数据结构与算法的心得,当然了我也不是什么ACM大牛,所以可能难度不会那么高,更加偏向于新手学习,而且数据结构与算法本身内容庞大,所以在几天时间内,我也没办法全部讲完,但是我会尽量,让小伙伴们从我的学习心得中,得到更多的属于自己的感悟。:smirk:
  • 同时我可能在学习到某个数据结构和算法的时候,可能会给出几道力扣洛谷的题目。
    • 其实我本人是更推荐新手使用洛谷,因为力扣上,使用没有主函数,新手可能不太是理解,洛谷的主程序也是需要自己编写的,但是可能对于“老手”,会觉得书写每次都要书写输入和输出比较麻烦,这里也是大家根据自己的需求来
  • 由于我本身是更多的使用Java,所以在之后的帖子中,我给出的代码都会采用Java的形式,所以看懂我的代码可能还是需要一些Java基础
  • 由于本人能力有限,在过程中难免会出现错误,以及可能也有存在更好的代码,希望大家在评论区发现错误也能留言:two_hearts:

数据结构与算法是什么?

程序=数据结构+算法

  • 这句话,一般在我们正式入门的时候,都会出现这个等式。一般上我们理解的程序其实应该就是数据存储和数据如何计算二个过程,(这里其实大家也可以联系一下,为什么我们说查找算法为什么这么重要呢?其实正式因为我们要对一个数据进行计算,首先你得找到这个数据)

数据结构是什么?

下面是百度百科对于数据结构的介绍:

  • 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关

其实,我们不难理解,数据结构就是要如何储存数据的过程,一般的我们数据结构存在四种结构(来源于百度百科):

  • 集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系
  • 线性结构:数据结构中的元素存在一对一的相互关系
  • 树形结构:数据结构中的元素存在一对多的相互关系
  • 图形结构:数据结构中的元素存在多对多的相互关系

其实我们在程序设计中,常见的又是下面几个数据结构:

  • 数组(Array):可以说是最基本的数据结构了,它是开辟了一个连续的空间,一般用于我们事先知道多大空间的时候
  • 栈(Stack):它是特殊的线性表,有着FILO( first in last out )先进后出的特点
  • 队列(Queue):它也是特殊的线性表,它跟栈的区别是它是FIFO( first in first out )先进先出的特点
  • 链表(Linked List):它是开辟的是不连续的空间,所以用于我们不知道要开辟多大空间的时候
  • 树(Tree):树是典型的非线性结构,由根节点、左子树和右子树构成
  • 图(Graph):也是一钟非线性结构,由节点、和边组成,但是这个图我们是是分带方向的和不带方向的
  • 堆(Heap):堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构
  • 散列表(Hash):散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记

算法是什么?

我们一样地从百度百科上看一下什么被定义算法:

  • 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出
  • 一般算法我们会说它有五个特性
    • 有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止
    • 确切性(Definiteness):算法的每一步骤必须有确切的定义
    • 输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件
    • 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的
    • 可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)

如果你感觉计算不住上面五个特性也没什么关系,因为我们也不会过多强调上面五个特性,大家了解即可。
下面我们要介绍我们在计算机算法领域中非常重要的东西:时间复杂度空间复杂度,这也是我们目前评判一个算法好坏的依据。

  • 时间复杂度:执行算法所需要的计算工作量
  • 空间复杂度:算法需要消耗的内存空间
    在这里插一句,其实随着现在计算机的发展,我们现在更加注重时间复杂度,因为随着科学技术的发展,相对而言时间比空间复杂度重要

如何表示时间复杂度和空间复杂度?

  • O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量,简单理解我们只考虑我们当前计算的数量级,而不去管常数项,因为我们一般数据量很大的时候,数量级的差距远大于了常数项,其中O(1)被称为常数的数量级
  • 常见的时间复杂度和空间复杂度排序
    • O(1) < O(nlogn) < O(根号n) < O(n) < O(n^2) < O(2^n) < O(n!):star::star::star:
      这个大家可以记住,我们会经常用,尤其记住一般我们到O(n^2),这个级别的时候,这个算法已经不是特别好了,我们经常优化都是尽量优化到O(nlogn)这个数量级别

总结

  • 这一天就先说这么多吧,也不少内容了,大家第一天了解一下,我们学习数据结构与算法是做什么呢?能做什么?我们为什么要学习数据结构与算法?灵魂质问一下自己。具体的数据结构和算法的内容,我们明天再学习,不用换担心,我们会从最简单开始说起:sunglasses:

  • 本次活动内容也有限,大概率我们不会涉及树和图,因为这二个内容很多,而且比较难,希望大家可以看看完我的文章后,再通过自己课外再学习。

  • 这里我可以再给大家推荐基本关于学习数据结构算法的书籍,我自己也都有看过和别人推荐过:

    • 小灰的算法之旅:这本书是比较简单,而且采用了Java描述,及其入门
    • 算法图解:相对于上一本灰更加难,而且采用的是Python语言
    • 算法:这本书就更适合有一定的基础的人了,同时书本使用了Java,对新手并不太友好,我也只是借阅过别人的,感觉坚持不下
  • 这里是:春节不停更,此文正在参加「星光计划-春节更帖活动」,本人正在计划在这次活动中,跟大家分享一下,我学习数据结构与算法的心得

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-1-19 12:08:36修改
收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐