浅谈数据结构与算法

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

  很多同学对数据结构与算法的第一印象,可能是觉得它复杂、深奥、难以理解。
  另外,同学们可能还有一个疑问:在平时的开发工作中,一个产品,从开发到上线,似乎都不会用到数据结构与算法,也就是说即使不懂数据结构与算法,也能出色地完成日常的工作任务,照样能拿到高薪。那我们为什么还要学习数据结构与算法呢?
  其实,一个很重要的原因是为了应对面试,数据结构与算法,是很多名企面试的必考题。国内外一线的大型互联网公司,在面试的过程中,多少都会问到一些关于数据结构与算法的题目。而且规模越大的公司,就越注重数据结构与算法。甚至,现在很多中小型公司的面试题都会涉及到算法知识。
  说到这,同学们可能会觉得很奇怪,平时工作中很少接触的数据结构与算法,为什么会经常出现在面试题中呢?
  其实不管哪个公司,都想尽可能地招到更优秀的人才。但是在短短几个小时的面试过程中,想了解清楚一个人,太难了。因为他们看重的是一个人的长期潜力,而技术是可以通过培训获得的,潜力却不是每一个人都拥有的。当然除了通过学历筛选人才,在面试时考察数据结构与算法,也是在短时间内考察一个人长期潜力的捷径。
  为什么说数据结构与算法能代表一个人的潜力呢?因为数据结构与算法功底扎实的程序员,其技术实力、业务能力、自学能力大多都不会差。而且这种问题考验的更多的是一个人的编程功底和长期积累。所以很多大公司都会使用算法题来筛选人才。
  总而言之,要想进入更大的公司,数据结构与算法是你必须要跨过去的坎。
  一开始提到,可能在大家平时的开发过程中,不怎么用到数据结构与算法的知识。那是因为我们的很多开发任务,都可以直接用各种第三方框架来完成。然而,很多第三方框架内部都用到了大量的数据结构与算法的知识。如果你懂数据结构与算法,就可以更好地去读懂框架的源码,体会作者的一个设计思想,也能让你更好地使用框架,把框架的价值发挥到最大。平时没用到数据结构与算法,也可能是因为自己目前开发的项目还太小。当开发大型项目,面对海量数据处理,或者要求性能的极致优化时,必然要用到数据结构与算法来优化程序。所以,很多时候,并不是数据结构与算法没有用,而可能是自己的境界还不够高,所以,有扎实的数据结构与算法知识能够使你的技术更加提升.

  Pascal之父 沃斯(Nicklaus Wirth)曾经凭借一个公式获得了图灵奖(计算机领域的诺贝尔奖)。

 算法 + 数据结构 = 程序

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

数据结构与算法相关概念

  • 数据结构:是研究数据的逻辑结构和物理结构 以及它们之间相互关系,并对这种结构定义相应的运算。
    数据结构包括 存储结构 和 逻辑结构 两个层次。
  • 几个重要的概念:
      数据(Data): 是客观事物的符号表示。在计算机科学中指的是所有能输入到计算机中并被计算机程序处理的符号的总称。
      数据元素(Data Element): 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
      数据项 是数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。
      数据对象(Data Object):是性质相同的数据元素的集合。是数据的一个子集。

数据结构的两个层次

数据结构包括 存储结构逻辑结构 两个层次

细节图

一. 存储结构(也称:物理结构)
  数据对象 在计算机中的 存储表示 就称为数据的存储结构。
  存储结构包括:顺序存储结构 、 链式存储结构、索引存储、散列存储
  基本的存储结构主要分为 顺序存储结构 和 链式存储结构 两种。

1. 存储结构—顺序存储结构
 定义:在计算机中用一组 地址连续 的存储单元 依次 存储线性表的各个数据元素,称作线 性表的顺序存储结构。如图
在这里插入图片描述
  就像排队占位置一样,谁也不能插别人的队。之前学习的数组就是一种顺序存储结构
  顺序存储结构存在一定的弊端,就像生活中排队是也会有人插队也可能有人有特殊情况突然离开,这时候整个结构都处于变化中,此时就需要链式存储结构。
 特点:
  随机存取表中元素。
  如果进行插入和删除操作需要移动元素。

2. 存储结构—链式存储结构
  定义:是把数据元素存放在 任意 的存储单元里面,这组存储单元可以是连续的也可以是不连续的。
 此时,数据元素之间并不能反映元素间的逻辑关系,因此在链式存储结构中引进了一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。如图
在这里插入图片描述
  显然链式结构比较灵活,数据存在哪里并不重要,只要有一个指针存放了相应的地址,在通过地址就能找到相邻元素啦。从这一点也能看到顺序存储结构和链式存储结构最大的区别就是链式存储结构引进了指针的概念,通过指针来存储地址,从而通过地址来寻找相邻元素。

特点:

  • 比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
  • 逻辑上相邻的节点物理上不必相邻。
  • 插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
  • 查找结点时链式存储要比顺序存储慢。
  • 每个结点是由数据域和指针域组成。

3. 存储结构—索引、散列存储结构
 除了以上这两种主要的存储结构,还有索引存储和散列存储,这里就不细讲了,我也只在网上查了一点资料,给出定义:
  索引存储:除了建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干个索引项组成
  散列存储:散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。散列法存储的基本思想是:由结点的关键码值决定结点的存储地址。散列技术除了可以用于查找外,还可以用于存储。

二、逻辑结构
1. 概念
  数据的逻辑结构是在 逻辑关系 上描述问题,与数据的存储无关。简单地理解,就是指的数据之间的逻辑关系。
  数据的逻辑结构包括两个要素:数据元素和关系。
  其中关系指数据元素之间的逻辑关系。如下图家庭成员关系图在这里插入图片描述
  图 1 显示是一张家庭的成员关系图,从图中可以看到,张平、张华和张群是兄弟,他们的父亲是张亮,其中张平有两个儿子,分别是张晶和张磊。
  以上所说,父子、兄弟等这些关系都指的是数据间的逻辑关系,假设我们要存储这样一张家庭成员关系图,不仅要存储张平、张华等数据,还要存储它们之间的关系,两者缺一不可。
  一组数据成功存储到计算机的衡量标准是要能将其完整的复原。例如图 1 所示的成员关系图,如果所存储的数据能将此成员关系图彻底复原,则说明数据存储成功。

2. 划分

  • 划分方法一:
    (1)线性结构—有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个后继。
    例如:线性表、栈、队列、串
    (2)非线性结构—一个结点可能有多个直接前趋和直接后继。
    例如:树、图等。
    在这里插入图片描述
  • 划分方法二:
    在这里插入图片描述
    在这里插入图片描述
      数据之间的逻辑关系可细分为三类,“一对一”、“一对多”和“多对多”:
  • “一对一”:类似集合 {1,2,3,…,n} 这类的数据,每个数据的左侧有且仅有一个数据与其相邻(除 1 外);同样,每个数据的右侧也只有一个数据与其相邻(除 n 外),所有的数据都是如此,就说数据之间是“一对一”的逻辑关系;
  • “一对多”:家庭关系图中的数据就属于“一对多”,因为对于张平来说,有且仅有一个父亲(张亮),但是有 2(多)个孩子;
  • “多对多”:拿下图 来说,从 V1 可以到达 V2、V3、V4,同样,从 V2、V3、V4 也可以到达 V1,对于V1、V2、V3和V4来说,它们之间就是“多对多”的关系;
  • 在这里插入图片描述

数据结构的运算

数据结构的运算(对数据的操作)
⑴ 建立(Create)一个数据结构;
⑵ 消除(Destroy)一个数据结构;
⑶ 从一个数据结构中删除(Delete)一个数据元素;
⑷ 把一个数据元素插入(Insert)到一个数据结构中;
⑸ 对一个数据结构进行访问(Access);
⑹ 对一个数据结构(中的数据元素)进行修改(Modify)
⑺ 对一个数据结构进行排序(Sort);
⑻ 对一个数据结构进行查找(Search)。

总结

  以上简要的介绍了数据结构与算法涉及的基本内容,中间有许多基础的概念这里并没有进行介绍,小伙伴们可以在网上查查资料学习
  总之,在计算机编程领域,数据结构与算法的应用是无处不在。比如图像视频处理、数据库、游戏开发、编译器、搜索引擎、AR、VR、人工智能、区块链等领域,都是以数据结构算法为基石。
  并且,扎实的数据结构与算法功底,能让我们站在更高的角度去思考代码、写出性能更优的程序,能让我们更快速地学习上手各种新技术(比如人工智能、区块链等),能让我们敲开更高级编程领域的大门。为什么有些人学新技术这么快?比如区块链、人工智能等,很可能就是因为别人数据结构与算法的功底更扎实。如果你想在IT路上走得更远,站得更高,那就必须掌握数据结构与算法。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值