数据结构与算法教程,数据结构C语言版教程!(第一部分、数据结构快速入门,数据结构基础详解)三

news2024/11/27 20:22:52

第一部分、数据结构快速入门,数据结构基础详解

数据结构基础,主要研究数据存储的方式。

本章作为数据结构的入门课程,主要让读者明白,数据结构到底是什么,常用的数据存储结构有哪些,数据结构和算法之间到底有怎样的关系等等。

深度剖析数据结构的本质,同时以通俗易懂的语言描述出来,致力于让读者快速入门数据结构。

五、数据结构和算法的关系和区别

由于大量数据结构教程中都将数据结构的知识和算法掺杂起来讲,使很多初学者认为数据结构就是在讲算法,这样理解是不准确的。

数据结构和算法之间完全是两个相互独立的学科,如果非说它们有关系,那也只是互利共赢、“1+1>2”的关系。

最明显的例子,如果你认为数据结构是在讲算法,那么大学我们还学《算法导论》,后者几乎囊括了前者使用的全部算法,有什么必要同时开设这两门课程呢?

我们还可以从分析问题的角度去理清数据结构和算法之间的关系。通常,每个问题的解决都经过以下两个步骤:

  1. 分析问题,从问题中提取出有价值的数据,将其存储;——>数据结构
  2. 对存储的数据进行处理,最终得出问题的答案;——>算法

数据结构负责解决第一个问题,即数据的存储问题。通过前面的学习我们知道,针对数据不同的逻辑结构和物理结构,可以选出最优的数据存储结构来存储数据。

而剩下的第二个问题,属于算法的职责范围。算法,从表面意思来理解,即解决问题的方法。我们知道,评价一个算法的好坏,取决于在解决相同问题的前提下,哪种算法的效率最高,而这里的效率指的就是处理数据、分析数据的能力。

因此我们得出这样的结论,数据结构用于解决数据存储问题,而算法是思考如何利用存储的数据快速无误地解决问题,它们是完全不同的两类学科。

也正因为如此,你可以认为数据结构和算法存在“互利共赢、1+1>2”的关系。在解决问题的过程中,数据结构要配合算法选择最优的存储结构来存储数据,而算法也要结合数据存储的特点,用最优的策略来分析并处理数据,由此可以最高效地解决问题。

顺序表存储数据示意图

图 1 顺序表存储数据示意图

例如,有这样一个问题,计算“1+2+3+4+5”的值。这个问题我们可以这样来分析:

  • 计算 1、2、3、4 和 5 的和,首先要选择一种数据存储方式将它们存储起来,通过前面的学习我们知道,数据之间具有“一对一”的逻辑关系,最适合用线性表来存储。结合算法的实现,我们选择顺序表来存储数据(而不是链表),如图 1 所示;
  • 接下来,我们选择算法。由于数据集中存放,因此我们可以设计这样一个算法,使用一个初始值为 0 的变量 num 依次同存储的数据做“加”运算,最后得到的新 num 值就是最终结果。

选择顺序表而不是链表的原因,是顺序表遍历数据比链表更高效。后续讲顺序表时会做详细介绍。

 六、数据结构如何自学,效率更高?

自从数据结构教程发布以来,很多读者向我询问应该如何自学数据结构,或者怎么才能学好数据结构和算法?本节将结合我的个人经验,给读者介绍一些学习数据结构和算法的方法,帮大家规避一些学习数据结构和算法过程中可能会踩的坑。

首先我认为,学习数据结构和算法有一个很重要的前提,就是至少熟练掌握一门编程语言。学习数据结构和算法,实践是非常重要的,如果仅仅是空有理论而不实践,反复学多少遍都没用。

本教程以 C 语言作为教学语言,当然读者也可以在掌握 C++、Java、Python 等语言的基础上学习数据结构和算法。因为无论是数据结构还是算法,它教会我们的是解决问题的思想,并不挂靠某一门具体的编程语言。换句话说,在掌握任何一门编程语言的基础上,都可以学习数据结构和算法。

其次对于初学者来说,好的学习资源是非常重要的。要知道,学习数据结构需要读者有一定的空间想象能力,所以强烈建议读者在看文字资料的同时,再找一套相应的视频资料,两者结合来学习,往往会事半功倍。

那么,有哪些不错的学习资源呢?我个人强烈推荐严蔚敏老师的《数据结构(C语言版)》以及她录制的一整套数据结构视频资料。如果读者刚刚接触数据结构和算法,可以跟随本教程学习,同时配以严蔚敏老师录制的视频资料。

本教程就是以严蔚敏老师的数据结构为原型进行编写的,和后者相比,本教程的语言通俗易懂,同时配有完整的 C 语言代码,非常适合初学者入门使用。

另外,市面上还有很多不错的学习资料,例如《大话数据结构》、《数据结构与算法分析》等,同时慕课(mooc)上也有很多讲解数据结构和算法的视频资料,这里不再一一举例。

除了熟练精通一门编程语言、有一套不错的学习资料之外,最重要的是找到一个好的学习方法。其实数据结构和算法并不难,之所以有读者认为它很难,是因为你的学习方法不对。

在这里,我把自己的学习方法推荐给大家,可以总结为 6 个字:多动笔、多动手。

所谓“多动笔”,在学习数据结构和算法的过程中,要边学习边画图。因为,对于数据结构中的存储结构来说,尤其是树结构和图结构,存储结构确实比较复杂,仅靠空间想象难免会有纰漏,而通过亲手画图往往能避免很多“坑”。

以学习链表(后续章节会做详细讲解)为例,如果我们想象不到它是怎样存储数据,就应该尝试动手将它画出来,如图 1 所示:

画链表

图 1 画链表

上图是用画图工具制作的,读者在实际画图时,只需要做到心中有数即可。

由此,我们就画了一个存有 {1,2,3,4} 数据的链表。

不仅如此,假设在图 1 的基础上想删除存储元素 3 的结点,也可以先通过画图来实现:

删除某个结点

图 2 删除某个结点

如上图所示,整个画图的过程,也是我们思考如何通过程序实现删除指定节点的过程:

  1. 为了删除存有元素 3 的结点,先要找到它的前驱结点,也就是结点 2,并用一个指针 p 来标记;
  2. 借助指针 p,可以顺利找到结点 3,因为它最终要被摘除,考虑到该结点占用的空间要手动释放,因此还要用一个指针 q 来标记它;
  3. 借助指针 p 和 q(也就是图中的第 3 步),就可以成功将目标结点摘下来;
  4. 最后借助指针 q,可以释放被删除节点所占用的存储空间。

以上就是为了删除存储元素 3 的结点,整个画图的流程。

再次强调,画图的过程是思考如何用程序实现的过程,并不是随意勾画。

除此之外,在学习某些算法时,也可以借助画图来加深自己的理解。甚至在阅读它人实现的代码时,可以边阅读代码边画图,这样可以更快理清代码的实现逻辑。

在通过“多动手”实现理解存储结构和实现逻辑的基础上,初学者还要“多动手”编写实现代码。注意,对于某一种存储结构或者算法,没有 3 遍以上自己独立的实现过程,是很难做到融会贯通的。

另外,很多初学者都存在“当时搞清楚了,过段时间又忘了”的情况。其原因大致有 2 个,一个是当时学的时候就没有彻底搞懂,或者处于“似懂非懂”的状态;另一个原因就是长时间没有再接触过它,所以淡忘了。其中如果是第一种原因导致的,那只能从头再学;对于第二种情况,读者不需要过度懊恼,只要我们再回顾一遍,通常是可以快速回忆起来的。

总之,数据结构确实是一门比较难理解的学科,而且学习过程没有任何捷径可走。这意味着,想要学好数据结构,除了找一套适合自己的学习资料和学习方法外,更要有一种“死磕”的精神,有句话说的很好,“不逼自己一把,永远不知道自己有多大的潜力”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1342315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【WPF.NET开发】路由事件

本文内容 先决条件什么是路由事件?路由策略为什么使用路由事件?附加并实现路由事件处理程序类处理程序WPF 中的附加事件XAML 中的限定事件名称WPF 输入事件EventSetter 和 EventTrigger Windows Presentation Foundation (WPF) 应用程序开发人员和组件…

next.js 开发网站的hello world

本文介绍建立一个简单的next.js 工程,以及简单修改。然后也简单说了2种路由方式的选择。 开始next.js工程前需要node.js , 还需要编辑器,我这里选择的是visual code。如果没有安装node.js 请参考下: visual code 下的node.js的he…

UWB高精度人员定位系统源码,全方位护航安全生产

定位管理系统使用UWB定位技术,通过在厂区安装定位基站,为人员或设备佩戴定位标签的形式,实现人员精准实时定位。可以实现人员、车辆物资实时定位、工作考勤、电子围栏、历史轨迹回放、巡检巡查、物资盘点、路径规划、三维显示等,以…

EBDP:解锁大数据的奥秘✨

大数据时代已经来临,你是否也想掌握这门“显学”?🌟 EBDP,这个让众多专业人士趋之若鹜的认证,究竟有何魅力?今天就带你一探究竟! 🌟EBDP:大数据的“敲门砖”&#x1faa…

Mini MyBatis-Plus(下)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 最核心的内容前两篇已经…

通过学习这些技巧,让你的Python代码更加简洁和高效

文章目录 前言列表性能陷阱陷阱一陷阱二 快速合并字典通过有序字典去重最后Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全职路线 前言 今天看到一些关于容器的使用技巧&am…

隧道代理HTTP工作原理:一场奇妙的网络魔法表演

嘿,小伙伴们!今天我们要一起探索一个有趣的话题——隧道代理HTTP的工作原理。这不是普通的表演,而是一场奇妙的网络魔法表演! 首先,让我们想象一下,网络世界就像一个大舞台,而我们每个人都是这…

邮政快递查询,邮政快递单号查询,按物流更新量来筛选单号

如何快速、准确地查询多个快递单号的物流信息?如何提高工作效率,减少一个个等待的焦虑?别担心,【快递批量查询高手】为你排忧解难,不仅可以帮你省下大量的时间,还能提高工作效率,让你更好地享受…

喜讯丨智安网络实力上榜《嘶吼2023中国网络安全产业势能榜》

近日,嘶吼安全产业研究院正式发布《嘶吼2023中国网络安全产业势能榜》。智安网络凭借在网络安全行业领先的产品实力、专业的安全服务水平及多年累积的行业经验,从300余家厂商中脱颖而出,成为《中国网络安全产业势能榜》互联网行业势能厂商。 …

计算机网络复习4

网络层——点到点 文章目录 网络层——点到点功能路由算法IPV4NAT 网络地址转换子网划分与子网掩码、CIDR地址解析协议ARP:根据IP地址找到MAC地址动态主机配置协议DHCP网际控制报文协议ICMPIPV6内部网关协议(IGP)外部网关协议(EGP) 功能 异构…

【银行测试】核心系统/信贷系统+各个测试点总结(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、银行核心系统和…

数据结构-八大排序详解(动图+实现详解+总结)

1 前言 本章主要讲解: 八大排序的基本知识及其实现 注:这里的八大排序指直接插入,希尔,选择,堆排,冒泡,快排,归并,基数 八大排序汇总图: 2 排序概念及应用 …

MindOpt 云上建模求解平台:多求解器协同优化

前言 数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。 使用数学规划的方法我们需要确定问题的目标、约束、变量的取值范围,然后进行数学建模,将数学公式转化…

前端使用高德api的AMap.Autocomplete无效,使用AMap.Autocomplete报错

今天需要一个坐标拾取器,需要一个输入框输入模糊地址能筛选的功能 查看官方文档,有一个api可以直接满足我们的需求 AMap.Autocomplete 上代码 AMapLoader.load({"key": "你的key", // 申请好的Web端开发者Key,首次调…

[AI编程]AI辅助编程助手-亚马逊AI 编程助手 Amazon CodeWhisperer

亚马逊AI 编程助手 Amazon CodeWhisperer 是一种基于人工智能技术的编程辅助工具,旨在帮助开发人员更高效地编写代码。它可以提供实时的代码建议、自动补全和错误检查,帮助优化代码质量和提高编程效率。 Amazon CodeWhisperer 使用了自然语言处理和机器…

Lunix的奇妙冒险————权限篇

文章目录 一.什么是权限二.用户权限和类别。1.用户2.角色3.更换文件角色 三.文件的类别和对应权限1.文件的类别。2.文件属性权限1.权限说明。2.默认生成文件权限来源3.更改权限 3.文件的执行与删除 四.不同用户共同在一个目录下的权限。1.普通用户家目录2.在同一目录下文件的权…

述职报告一般怎么写?

在日常生活中,我们经常需要撰写各种报告。对于报告的撰写,我们需要清晰地解释涉及的专业术语。现在,我为大家整理了一些精选的晋升述职报告范文,供大家参考和借鉴。希望这些范文能对大家有所帮助。 晋升述职报告范文精选1 一、个…

力扣题目学习笔记(OC + Swift)19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 此题目为链表题,拿出我们的杀手锏,链表解题经典三把斧: 哑巴节点栈快慢指针 关于内存问题:由于Swift及…

Fiddler 抓包工具的安装与使用

今天分享Fiddler 抓包工具的安装与使用,基于HTTP应用层协议的抓包工具。 一、下载安装 1、下载地址: The Ultimate Web Debugging Tool - Download Fiddler Everywhere | Telerik 选择相应类型: 2、下载完成 3、安装 傻瓜式安装&#xf…

【开源学习】ThingsBoard -- 基本配置与使用

【开源学习】ThingsBoard -- 基本配置与使用 租户及客户管理租户及租户账号管理租户管理租户创建租户修改租户删除 租户账号管理租户账号创建租户账号修改租户账号删除 客户及客户账号管理客户管理客户创建客户修改客户删除 客户用户管理客户用户创建客户用户修改客户用户删除 …