代码编织梦想

当我们遇到一个实际问题时,首先需要解决两件事:

(1)如何将数据存储在计算机中;

(2)用什么方法和策略解决问题。

前者是数据结构,后者是算法。只有数据结构没有算法,相当于只把数据存储到计算机中,而没有有效的方法去处理,就像一幢只有框架的烂尾楼;若只有算法,没有数据结构,就像沙漠里的海市蜃楼,只不过是空中楼阁罢了。

数据是一切能输入计算机中的信息的总和,结构是指数据之间的关系。数据结构就是将数据及其之间的关系有效地存储在计算机中并进行基本操作。算法是对特定问题求解步骤的一种描述,通俗讲就是解决问题的方法和策略。

在遇到一个实际问题时,要充分利用自己所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效地实现。这就是Niklaus Wirth教授所说的:“数据结构+算法=程序”。

高校的计算机专业为本科生都开设了数据结构课程,它是计算机学科知识结构的核心和技术体系的基石,在研究生考试中也是必考科目。随着科学技术的飞速发展,数据结构的基础性地位不仅没有动摇,反而因近年来算法工程师的高薪形势,而得到了业内空前的重视。很多人认为基本的数据结构及操作已经在高级语言(如C++、Java语言)中封装,栈、队列、排序、优先队列等都可以直接调用库函数,学会怎么调用就好了,为什么要重复“造轮子”?那么到底有没有必要好好学习数据结构呢?

学习数据结构有什么用

(1)学习有效存储数据的方法。很多学生在学习数据结构时,问我要不要把单链表插入、删除背下来?要不合上书就不会写了。我非常诧异,为什么要背?理工科技术知识很少需要记忆的,是用的,用的!学习知识不能只靠死记硬背,更重要的是学习处理问题的方法。如何有效地存储数据,不同的数据结构产生什么样的算法复杂性,有没有更好的存储方法提高算法的效率?

(2)处理具有复杂关系的数据。现实中很多具有复杂关系的数据无法通过简单的库函数调用实现。如同现在很多芯片高度集成,完全不需要知道芯片内部如何,直接使用就行了。但是,如果在现实中遇到一个复杂问题,现有的芯片根本无法解决,或者一个芯片只能完成其中一个功能,而我们需要的是完成该复杂问题的一个集成芯片,这时就需要运用所学的数据结构知识来高效处理具有复杂关系的数据。

(3)提高算法效率。很多问题的基础数据结构运行效率较低,需要借助高级数据结构或通过改进数据结构来提高算法效率。

通过学习数据结构,更加准确和深刻地理解不同数据结构之间的共性和联系,学会选择和改进数据结构,高效地设计并实现各种算法,这才是数据结构的精髓。

数据结构为什么那么难

网络上太多的同学吐槽被“虐”,如“滔滔江水连绵不绝”,数据结构太难了!真的很难吗?其实数据结构只是讲了3部分内容:线性结构、树和图。到底难在哪里呢?我通过调查,了解到数据结构难学大概有以下4个原因。

(1)无法接受它的描述方式。数据结构的描述大多是抽象的形式,我们习惯了使用自然语言表达,难以接受数据结构的抽象表达。不止一个学生问我,书上的“ElemType”到底是什么类型?运行时怎么经常提示错误。它的意思就是“元素类型”,只是这样来描述,你需要什么类型就写什么类型,例如int。这样的表达方式会让不少人感到崩溃。

(2)不知道它有什么用处。尽管很多人学习数据结构,但目的各不相同。有的人是应付考试,有的人是参加算法竞赛需要,而很多人不太清楚学习数据结构有什么用处,迷迷糊糊看书、做题、考试。

(3)体会不到其中的妙处。由于教材、教师等各种因素影响,很多学生没有体会到数据结构处理数据的妙处,经常为学不会而焦头烂额,学习重在体会其中的乐趣,有乐趣才有兴趣,兴趣是最好的驱动力。

(4)语言基础不好。我一直强调先看图解,理清思路,再上机。可还是有很多同学已经理解了思路后,因为缺少main函数,输入/输出格式不对,缺少括号等各种语言问题卡壳,而这一切都被戴上了“数据结构太难了”的大帽子。

数据结构学习秘籍

在讲学习秘籍之前,我们首先了解一下数据结构学习的3种境界。

(1)会数据结构的基本操作。学会各种数据结构的基本操作,即取值、查找、插入、删除等,是最基础的要求。先看图解,理解各种数据结构的定义,操作方法,然后看代码,尝试自己动手上机运行,逐渐掌握基本操作。在初学时,要想理解数据结构,一定要学会画图。通过画图形象表达,能更好地体会其中的数据结构关系。因此,初学阶段学习利器是:画图、理解、画图。

(2)会利用数据结构解决实际问题。在掌握了书中的基本操作之后,就可以尝试利用数据结构解决一些实际问题了。先学经典应用问题的解决方法,体会数据结构的使用方法,再做题,独立设计数据结构解决问题。要想熟练应用就必须做大量的题,在做题的过程中体会其中的方法。最好进行专项练习,比如线性表问题、二叉树问题、图问题。这一阶段的学习利器是:做题、反思、做题。

(3)熟练使用和改进数据结构,优化算法。这是最高境界了,也是学习数据结构的精髓所在,单独学习数据结构是无法达到这种境界的。数据结构与算法相辅相成,需要在学习算法的过程中慢慢修炼。在学习算法的同时,逐步熟练应用、改进数据结构,慢慢体会不同数据结构和算法策略的算法复杂性,最终学会利用数据结构改进和优化算法。这一阶段已经在数据结构之上,可以通过在ACM测试系统上刷各种算法题,体会数据结构在算法设计中的应用。这一阶段的学习利器是:刷题、总结、刷题。

数据结构与算法书籍推荐

数据结构与算法之美(全彩印刷)

一些经典的数据结构和算法图书,偏重理论,读者学起来可能感觉比较枯燥。一些趣谈类的数据结构和算法图书,虽然容易读懂,但往往内容不够全面。另外,很多数据结构和算法图书缺少真实的开发场景,读者很难将理论和实践相结合。

为了解决上述问题,本书全面、系统地讲解了常用、常考的数据结构和算法,并结合 300多幅图和上百段代码,让内容变得更加通俗易懂。同时,对于每个知识点,本书结合真实的应用场景进行讲解,采用一问一答的讲解模式,让读者不仅可以掌握理论知识,还可以掌握如何将数据结构和算法应用到实际的开发工作中。

本书分为11章。第1章介绍复杂度分析方法。第2章介绍数组、链表、栈和队列这些基础的线性表数据结构。第3章介绍递归编程技巧、8种经典排序、二分查找及二分查找的变体问题。第4章介绍哈希表、位图、哈希算法和布隆过滤器。第5章介绍树相关的数据结构,包括二叉树、二叉查找树、平衡二叉查找树、递归树和B+树。第6章介绍堆,以及堆的各种应用,包括堆排序、优先级队列、求Top K、求中位数和求百分位数。第7章介绍跳表、并查集、线段树和树状数组这些比较高级的数据结构。第8章介绍字符串匹配算法,包括BF算法、RK算法、BM算法、KMP算法、Trie树和AC自动机。第9章介绍图及相关算法,包括深度优先搜索、广度优先搜索、拓扑排序、Dijkstra算法、Floyd算法、A*算法、Z小生成树算法、Z大流算法和Z大二分匹配等。第10章介绍4种算法思想,包括贪心、分治、回溯和动态规划。第11章介绍4个经典项目中的数据结构和算法的应用,包括Redis、搜索引擎、鉴权限流和短网址服务。另外,附录A为书中的思考题的解答。

数据结构 Python语言描述 第2版

本书主要介绍计算机编程中如下4个主要方面的内容。

(1)编程基础——数据类型、控制结构、算法开发以及通过函数进行程序设计,是解决计算机问题所需要掌握的基本思想。本书用Python编程语言介绍这些核心主题,旨在帮助你通过理解这些主题解决更广泛的问题。

(2)面向对象编程——面向对象编程是用于开发大型软件系统的主要编程范式。本书介绍OOP的基本原理,旨在让你能够熟练地应用它们。和其他教科书不同,本书会引导你开发一个专业的多项集类的框架,以说明这些原理。

(3)数据结构——大多数程序会依赖数据结构解决问题。在最具体的层级,数据结构包含数组以及各种类型的链接结构。本书介绍如何使用这些数据结构来实现各种类型的多项集结构(如栈、队列、列表、树、包、集合、字典和图),还会介绍如何使用复杂度分析来评估这些多项集的不同,进而实现在时间与空间上的权衡。

(4)软件开发生命周期——本书不会设单独的一两章去介绍软件开发技术,而是通过大量的案例全面概述这方面的内容。本书还会强调,编写程序通常并不是解决问题或软件开发里最困难或最具挑战性的部分。

趣学数据结构

本书包括10章。

  • 第1章是基础知识,介绍数据结构基础和算法复杂性的计算方法。
  • 第2~5章是线性结构,讲解线性表、栈和队列、字符串、数组等的基本操作和应用。
  • 第6章是树形结构,讲解树、二叉树、线索二叉树、树和森林以及树的经典应用。
  • 第7章是图形结构,讲解图的存储、遍历以及图的经典应用。
  • 第8~9章是数据结构的基本应用,讲解查找、排序的方法和算法复杂性比较。
  • 第10章是高级数据结构及其应用,讲解优先队列、并查集、B-树、B+树、红黑树等。

本书的每一章中都有大量图解,并给出数据结构的基本操作,最后结合实例帮助读者巩固相关知识点,力求学以致用、举一反三。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/epubit17/article/details/122524745

深度学习如何入门?-爱代码爱编程

当人类第一次构思可编程计算机时,就已经在思考计算机能否变得智能(尽管这距造出第一台计算机还有一百多年)(Lovelace,1842)。如今,人工智能(artificial intelligence,AI)已经成为一个具有众多实际应用和活跃研究课题的领域,并且正在蓬勃发展。我们期望通过智能软件自动地处理常规劳动、理解语音或图像、帮助医学诊断和支持基础科学研究

2022年开年程序员新书:Knative、程序员管理、Flutter-爱代码爱编程

2022年的第一个月,将会迎来这几本新书: Knative快速入门与实践(1月中旬上架) 作者伯尔•萨特(Burr Sutter)[印度] 卡梅什•桑帕斯(Kamesh Sampath) 译者杨云锋 赵吉壮 开发人员在构建Serverless应用程序(例如,集成多个应用程序、从源代码构建容器镜像等)时面临诸多挑战。本书包含50多个实用示例,可

有哪些值得推荐的好的算法书?-爱代码爱编程

经典算法 算法设计 这是一本关于算法设计和分析的经典教材。本书围绕算法设计进行组织,对每种算法技术用多个典型范例进行分析,把算法的理论跟实际问题结合起来,具有很大的启发性。本书侧重算法设计思路,每章都从实际问题出发,经过深入具体的分析引出相应算法的设计思想,并对算法的正确性和复杂性进行合理的分析和论证。本书覆盖面广,且含有200多道精彩的习题,

操作系统领域里的最适合自学的是这本书-爱代码爱编程

操作系统领域里的自学神作是这本书! 操作系统导论 《操作系统导论》在豆瓣的评分9.4,好多读过的书友建议大家坚持读完,会有意想不到的进步与收获。 豆瓣评论: 写的很好,深入浅出地介绍了操作系统的核心内容,值得推荐   这是我在操作系统领域里读过最好的书了。整体循序渐进,参考资料质量也很高。 涉及到操作系统的虚拟化技术,并发和

反汇编和二进制分析工具清单-爱代码爱编程

本附录列出了许多反汇编和二进制分析工具,包括逆向工程、反汇编API以及执行跟踪的调试器。 C.1 反汇编工具 C.1.1 IDA Pro(Windows、Linux、macOS) IDA是行业标准的递归反汇编工具,它是交互型的,是内置Python和IDC脚本API的反编译工具,也是目前最好、最强大的反汇编工具之一,但价格昂贵(最低基础版本价格为700

想学Kubernetes?114页的《Kubernetes快速入门》你需要入手一本-爱代码爱编程

有一本刚刚上架的新书《Kubernetes快速入门》推荐给想学习的你们。全书114页。 《Kubernetes快速入门》 本书并不试图涵盖关于Kubernetes的一切,只是尽可能清晰地以一种引人入胜的方式介绍Kubernetes核心和重要的部分。同时,本书将理论和实践完美结合,向读者展示Kubernetes的基础知识。 你将了解为什么需要K

C++20年老兵实战经验总结:《C++实战》-爱代码爱编程

“C++是一种威力十足的编程语言,如果 C 带给你足够‘绞死’自己的绳索,C++就是间五金店, 里面挤满了准备为你绑绳结的人。” ——来自《Effective C++》一书 20年老兵心法 简洁易懂的避坑指南 让C++不再难学! 《C++实战》 源代码下载高效编程软技能安全、优雅的代码语言和库的【开发】好用、实用的C++特性C++编

R语言金融分析与建模:R的基本语法-爱代码爱编程

对所有的编程语言而言,循环语句是非常重要的。因为我们使用各种循环来处理各类数据。例如从一个数据集中不断地取出各类子集。典型的例子是如果我们有一个数据集包含5000支股票,我们计划计算每一只股票的各种特征。为此我们可以用循环语句从1到5000循环5000次。其他应用还包括:合并不同的数据集,或按各种条件重新定义程序流程。 最常用的两个循环是for()循环和

2022开年书单:7本程序员专业书籍与您相约-爱代码爱编程

开工啦!我猜今年疫情原因,返乡的人不多,年假可以留到后面用啦!大多数程序员肯定已经回到了工作岗位上,小编给您播报一下开年新书,看看喜欢不! 1、开源之迷 适兕 著 丰富的故事和案例,人人都能读懂的开源科普书,AR扫描收获增值视频,Linux基金会亚太区总监、红帽全球副总裁、Apache软件基金会董事等倾情推荐。 适读人群 :在开源领域工作的

2022年程序员开工第一周,应该收藏这样一份书单-爱代码爱编程

新年新气象,开工第一周,作为程序员的你有哪些新年规划?如果还没准备好,不如小编来一份开工书单,开始你的学习旅程吧! 开工后,有哪些新书最受欢迎? 1、计算之魂 (《数学之美》《浪潮之巅》等畅销书作者吴军博士新作) 1.《数学之美》姊妹篇,吴军博士时隔近10年在科技领域的重磅新作。 2.李国杰院士、郑纬民院士作序推荐,快手联合创始人宿华、拼多

C++并发编程实战:基于锁的并发数据结构-爱代码爱编程

设计基于锁的并发数据结构的奥义就是,要确保先锁定合适的互斥,再访问数据,并尽可能缩短持锁时间。即使仅凭一个互斥来保护整个数据结构,其难度也不容忽视。我们在第3章已经分析过,需要保证不得访问在互斥锁保护范围以外的数据,且成员函数接口上不得存在固有的条件竞争。若针对数据结构中的各部分分别采用独立互斥,这两个问题就会互相混杂而恶化。另外,假使并发数据结构上的操作

自学也能学得会的《零基础入门学习Web开发》(HTML5 & CSS3)-爱代码爱编程

1 Web开发是什么 很多读者可能还不明白,Web开发到底是什么。 其实,我们所说的Web开发通常相当于前端开发与后端开发的组合。 前端开发主要通过HTML、CSS、JavaScript. AJAX、DOM等技术实现网站在客户端的显 示和交互功能;后端开发主要通过Java、PHP、Python和Node.js等技术对从前端页面传输来 的数据进行处理,

Python期货量化交易中常用的数据类型有哪些?-爱代码爱编程

1 常用内置常量 Python解释器在启动时会创建None、True、False三个常量,None表示“无”,True表示“真”,False表示“假”。 None是NoneType类型的唯一值,表示缺少值或空值,例如,当函数没有返回值时会默认返回None值。 因为Python用“有”和“无”来表示“真”和“假”,“有”为真,“无”为假,所以None、

《开源之迷》:每天那么多人念叨的开源,究竟该如何解读?-爱代码爱编程

在复杂的现代世界,人们对于事物因果关系的解释,决定了其是否 能够理性地面对这个世界。开源的解释也同样面临着这个问题。这是一个诞生不久的名词,对于它的完整诠释目前还远远不够,尤其是在不同 的文化背景之下,更是衍生出无数的细枝末节。 所幸的就是当读者您读到这里,应该有一种被击中的感觉,会想: 每天那么多人念叨的开源,究竟该如何解读?那么你一定要备一本《开源之

2021年,你读了哪些不错的C++书籍?-爱代码爱编程

C++是一门经典的编程语言,堪称编程语言中的“全能选手”,它不仅功能强大、灵活,而且适用场景非 常广泛。但是要想真正掌握 C++, 其技术门槛往往较高, 这也使“新手”学起来困难, 甚至连“老手”也觉 得用好它并不容易。 大多数人都能写出机器能看懂的代码,但只有优秀的程序员才能写出任何人都能看懂的 代码。 有两种写程序的方式:一种是把代码写得非常

这本PyTorch官方出品的Deep Learning With PyTorch终于有了中文版-爱代码爱编程

《Deep Learning With PyTorch》,一本深受广大深度学习爱好者喜欢的书。这本书由PyTorch官方出品,中文版已经出版啦! 中文名:PyTorch深度学习实战 本书作者Eli Stevens职业生涯的大部分时间都在美国硅谷的初创公司工作,从软件工程师(网络设备制造业)到首席技术官(开发肿瘤放疗软件)。在本书出版时,他正在汽

一周新书精选:深度学习、强化学习、Web开发最受程序员关注-爱代码爱编程

3月,万物复苏,跟着春天的脚步,看看这一周有哪些程序员新书最受关注? 1、零基础入门学习Web开发(HTML5 & CSS3)】 本书的系列视频教程全网播放量超100万,得到广大学习者一致好评有趣、有料、实用的案例,真正零基础,自学也轻松基于新的W3C标准进行内容设计,并配有在线的案例展示,Web开发更容易精解HTML5和CSS3 中

为什么用PyTorch?PyTorch如何支持深度学习?-爱代码爱编程

为什么用PyTorch 通过将模型应用到例证,深度学习允许我们执行很多复杂任务,如机器翻译、玩战略游戏以及在杂乱无章的场景中识别物体等。为了在实践中做到这一点,我们需要灵活且高效的工具,以便能够适用于这些复杂任务,能够在合理的时间内对大量数据进行训练。我们需要已被训练过的模型在输入变量变化的情况下正确执行。接下来看看我们决定使用PyTorch的一些原因。

这几本值得你一看再看的程序员素养必备好书_程序员的素养 图书-爱代码爱编程

有些经典书,你每次翻起来看看都会有不一样的感悟。推荐以下几本书: 重构:改善既有代码的设计(第2版) 豆瓣评分:9.1 星级:4星半 所谓程序设计,很大程度上就是与计算机对话:我编写代码告诉计算机做什么事,而它的响应是按照我的指示精确行动。 肮脏的代码必须重构,但漂亮的代码也需要很多重构。 构的唯一目的就是让我们

python可以自学吗?_python自学行吗-爱代码爱编程

当然可以自学Python。 编程(programming)指的是编写让计算机执行的指令。这些指令可能告诉计算机打印Hello, World!,从因特网爬取数据,或者读取某个文件的内容并保存至数据库。这些指令被称为代码(code)。程序员用许多不同的编程语言来编写代码。在过去,编程的难度更大,因为程序员必须要使用晦涩难懂的底层编程语言(low-level