5分钟理解数据结构算法编程语言三者的计算思维(附教程分享

程序要处理的数据有数值类或非数值类两种类型。数值类处理的是纯数值性的信息,如科学和工程计算。数值类数据的关系一般用数学公式或方程来描述。而非数值类问题的数据及数据间的相应关系一般无法用数学公式或方程来描述,如排序问题、检索问题,需要另外设计数据的描述方法和相应的算法来处理。

所以,用计算机解决实际问题,需要对解决的问题进行分析,提炼出问题的两个要素:信息和功能。(数据描述和数据处理的步骤描述,也就是数据结构和算法)。

分析问题中的已知信息,提炼数据和数据之间的联系(数据的逻辑结构),选用合适的存储方式(数据的存储结构)将逻辑结构(数据元素和逻辑关系)存到计算机中,然后在存储结构之上按照自顶向下逐步细化的方法给出算法。这就是程序设计思维的一般过程。

上图中,程序设计将算法”翻译“成相应命令语句及处理形成代码。

一般来说,一个逻辑数据结构可能有多种存储结构,在不同的存储结构之上,数据处理的效率不尽相同。许多时候,确定数据结构后,算法就容易找到了。有些时候事情也会反过来,我们根据特定的算法来选择数据结构与之适应。

程序设计中信息的抽象是用标识符、常量、变量、数组和结构体等描述和记录信息及信息间的关系。

下表是一般编程的解题步骤与从软件工程角度看这些步骤的对应关系。

程序解题软件工程具体工作建模型需求分析阶段提取问题要完成的功能;分析问题的数据对象,找出数据对象之间的关系设计设计阶段数据结构设计、软件的结构设计、算法设计编程编码阶段编写程序代码验证测试软件测试与调试

计算机对数据的处理,就如同工厂对“物料”的处理一样,物料如同数据,工艺如同算法。一般来说,按照“存储程序”概念,数据需要保存到“一格一格”的内存单元中,根据数据种类、数量的多少、数据元素的复杂程度,对应的数据结构和复杂度也会有所区别。如果数据量少,数据元素联系简单,则用简单的基本数据类型如变量、数组即可描述需要处理的数据,用简单的一些表达式即可描述算法。如果数据量大,数据元素联系复杂(普通数学方程无法描述),则需要定义或选择复杂的数据结构(抽象数据类型),如栈、树、图等,以及复杂的算法。

1.1数据类型(datatype)是一组性质相同的值的集合和定义在集合上的一级操作的总称。

一个具体问题的抽象数据类型的定义通常采用简洁、严谨的文字描述,一般包括数据对象(即数据元素的集合)、数据元素关系和基本运算三方面的内容。其基本格式可描述如下:

ADT抽象数据类型名

{

数据对象Data

数据关系Relation

基本运算Operation

}

(Data和Relation一般可以用结构体或类数据成员定义,Operation一般可以用函数(数据结构算法)或类成员函数定义。)

如,线性表的抽象数据类型:

数据对象:任意数据元素的集合

数据关系:除第一个和最后一个外,每个元素都有唯一的直接前驱和唯一的直接后继

基本运算:

ListInsert(&L,i,e);//元素的插入

ListDelete(&L,i,e);//元素的删除

...

}ADTlist

数据结构的含义包括三个方面-数据的逻辑结构、数据的存储结构以及数据的运算(如增、查、删、改)。数据的逻辑结构体现在数据的联系,数据的存储是数据在计算机中的体现。

3.1顺序存储结构Sequentialstoragestrcture

是采用一组连续的存储单元存放所有的数据元素,也就是说,所有数据元素在存储器中占有一整块存储空间,而且两个逻辑上相邻的元素在存储器中的存储位置也相邻。因此,数据元素之间的逻辑关系由存储单元地址间的关系隐含表示,即顺序存储结构将数据的逻辑结构直接映射到存储结构。

顺序存储结构的主要优点是存储效率高,因为分配给数据的存储单元全用于存放数据元素,元素之间的逻辑关系没有占用额外的存储空间;另外,在采用这种存储方法时可实现对元素的随机存储,即每个元素对应一个逻辑序号,由该序号可以直接计算出对应元素的存储地址,从而获取元素值。顺序存储结构的主要缺点是不便于数据修改,对元素的插入或删除操作可能需要移动一系列的元素。

3.2链式存储结构Linkedstoragestructure

在链式存储结构中,每个逻辑元素用一个内存结点存储,每个结点是单独分配的,所有的结点地址不一定是连续的,所以无须占用一整块存储空间。为了表示元素之间的逻辑关系,给每个结点附加指针域,用于存放相邻结点的存储地址,也就是通过指针域将所有结点链接起来,这就是链式存储结构名称的由来。

3.3顺序存储与链式存储二者优、缺点对比

顺序存储结构链式存储结构存储效率存储效率高,因为分配给数据的存储单元全用于存放数据元素,元素之间的逻辑关系没有占用额外的存储空间;存储空间的利用率低,因为分配给元素的存储单元有一部分被用来存储结点之间的逻辑关系;访问元素可实现对元素的随机存取,即每个元素对应一个逻辑序号,由该序号可以直接计算出对应元素的存储地址,从而获取元素值。由于逻辑上相邻的元素在存储空间中不一定相邻,所以不能对元素进行随机存取。插入和删除不便于数据修改,对元素的插入或删除操作可能需要移动一系列的元素。便于数据修改,在对元素进行插入和删除操作时仅需修改相应结点的指针域,不必移动结点。

3.4索引存储结构Indexedstoragestructure

索引存储结构是指在存储数据元素信息的同时还建立附加的索引表。存储所有数据元素信息的表称为主数据表,其中每个数据元素有一个关键字和对应的存储地址。索引表中的每一项称为索引项,索引项的一般形式为“关键字,地址”,其中“关键字”唯一标识一个元素,“地址”对应该关键字的元素在主数据表中的存储地址。通常,索引表中的所有索引项是按关键字有序排列的。

在按关键字查找时,首先在索引表中利用关键字的有序性快速查找到该关键字的地址,然后通过该地址在主数据表中找到对应的元素。

索引存储结构的优点是查找效率高。缺点是需要建立索引表,从而增加了空间开销。

3.5哈希(或散列)存储结构Hashedstoragestructure

哈希存储结构的基本思想是根据元素的关键字通过哈希(或散列)函数直接算出一个值,并将这个值作为该元素的存储地址。

哈希存储结构的优点是查找速度快,只要给出待查元素的关键字就可立即计算出该元素的存储地址。与前3种存储方法不同的是,哈希存储方法只存储元素的数据,不存储元素之间的逻辑关系。哈希存储结构一般只适合要求对数据能够进行快速查找和插入的场合。

数据运算是指对数据实施的操作。每种数据结构都有一组相应的运算,最常用的运算有检索、插入、删除、更新和排序等。数据运算最终需要在对应的存储结构上用算法实现,所以数据运算分为运算定义和运算实现两个层面。

5.1线性表包括顺序表和链表两种类型。

5.2栈:操作都在表的一端(栈顶,top)进行,按先入(插入)后出(删除)的方式管理的线性表;栈相对于线性表来说,不需要考虑数组的下标增减等细节,而直接使用对栈的Push和Pop操作。如回退操作、递归调用、函数调用等可以方便地用到这种受限的线性表结构。

5.3队列:一端插入(队尾)一端删除(队头)的线性表。

假设有20台包装好的电视机,放到一个房间,房间有一个位置都标有编号。看现实世界中的存储(如何操作可以能存能取)

顺序表找一个连续的四周开放的空间,一台一台按顺序放好;链表不考虑连续的空间,有一台的位置就放一台,但每一台的位置放一张卡片,标明下一台的放置位置;栈20台叠起来放;或者放到一个三端封闭的空间,只有一端可以存、取操作;队列找一个两边封闭的空间,一端放,一端取;

5.4树结构:反映一种层次的纵向关系,如计算机文件系统的目录结构。其存储的数据逻辑关系是每一个结点都有1个或0个双亲(parent)结点,n个或0个子(child)结点。树结构的基本操作包括:构造、插入、删除、遍历、深度、查找等。堆通常是一个可以被看做一棵树(完全二叉树)的数组对象。

5.5广义表:包含子结构的线性结构,是线性表的推广,但是一种非线性结构类型。

5.6图结构:数据结构中的图不是几何平面中的图的概念,而是拓扑意义上的图。通常平面几何或立体几何研究的对象是点、线、面之间的位置关系以及它们的度量性质。拓扑学研究几何图形在连续变形下保持不变的性质。如地铁线路图就是应用了拓扑学的原理。通常在平面几何中,把平面上的一个图形搬到另一个图形上,如果完全重合,那么这两个图形叫做全等形。但在拓扑学中,无论图的大小或者形状怎么变化,只要其中点和线的数量不变,它们就是等价图。

图是一种比线性表和树形结构更为复杂的非线性数据结构,图对结点的前驱和后继个数不加限制,各数据元素之间的关系可以是任意的,描述的是“多对多”的关系。在数据结构中,考虑的是图在计算机中的存储和操作。

图是由顶点和边构成,除了要存储结点的信息,还要存储边的信息。另外,图有无向图、有序图、加权图等、

面向对象偏向结构——在数据结构的基础上加入自我实现的算法而函数式编程则是偏向函数(算法)——函数也是对象,就是函数的数据化,让算法也可以自由组合。

在分析处理的问题、确定的需要的数据结构、完成了数据的存储之后,接下来的事情就是对数据的加工处理了,对问题求解进行精确描述,也就是算法。

不同的问题有不同的解决方法,同一个问题也可能会有多种算法可供选择。

算法有5个特征。

算法的实现由函数完成。算法设计的一般步骤是:

常用算法:递推法、递归法、穷举法、贪心算法、分治法、动态规划法、迭代法、分支界限法。

算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。

实际问题中数据的处理,一是根据问题中的信息,抽象出信息中的数据与联系,并根据问题的功能要求及数据量的大小,选用合适的存储结构;二是根据功能要求划分模块分别处理;三是测试和调试

如,求一个数的阶乘n!

5.1问题分析:可以先选择一个数值不太大,又不是特殊点的值,如n=5来设计算法的实现。

5.2测试样例设计:

情形测试数据预期结果问题的一般情形n>1按照n!一般定义得出的值临界点或特殊点n=0,n=1按照n!边界定义得出的值异常情况n<=给出错误或提示信息

5.3函数接口及功能描述:

5.4代码实现

doublefactorial(intn)

inti;

doublet=1;

if(n<0)return(-1);

for(i=1;i<=n;i++)

t=t*i;

return(t);

5.5测试结果

万物皆数,是说一切事物都可以编码,都可以用符号或数字表示出来,符号或数字的种类只要两个或两个以上,然后有适当数量的位数,即可表示万物。另外,不仅可以用编码描述事物为数据,数据元素的关系(线性或非线性)亦可用编码进行描述,这种数据元素和数据元素之间联系的描述或编码也就是数据的逻辑结构。数据的逻辑结构需要保存到计算机编址(线性)的存储单元中,这就是数据逻辑结构与存储结构的映射。我们知道,如果是非线性的逻辑结构与线性的逻辑结构的映射,解决起来会稍显复杂,但非线性的逻辑结构都可用复杂度更高的顺序存储或链式存储加以解决。数据的静态存储不是目的,对数据元素有如“增、查、删、改”等的运算并能保持原有的映射才能对数据进行进一步的利用,或者说构造了一种新的抽象数据类型,加上编程语言定义的基本数据类型,是对事物进行数据描述的基本手段。上述所有的一切,皆是数据结构的范畴。

有了数据结构,对需要解决的问题便可以在数据结构的基础上构造数据结构的输入方式、构造表达式、函数、构造数据输出方式,形成详细、明确的步骤,这就是所谓的算法。

当然,一些特殊的问题,有时会先考虑算法,然后构造数据结构。复杂的问题,初期的方案更是在数据结构与算法的相互的选择取舍中不得优化。有了数据结构、算法,选择合适的编程语言进行描述,便可完成代码的编写,通过调试,到最后产生符合解决问题的应用或工具。总之,数据结构和算法以及与之匹配的编程语言便构成了编程的核心。

THE END
1.LeetCode刷题秘籍,关于数据结构与算法,看一这篇就够了但是直至今日,大家会发现面试的门槛越来越高,甚至来说去到一些大公司去面试算法与数据结构的题目已经成为必问了,算法的在面试的占比已经越来越高,在此我整理了一下近几年面试中问的比较频繁的算法题,大家感兴趣的可以看看,看自己能答出来多少。 寻找数组的中心索引 数组中某一个下标,左右两边的元素之后相等,该https://baijiahao.baidu.com/s?id=1729521878669986641&wfr=spider&for=pc
2.数据结构与算法排序算法能够解决的问题?算法需要和数据结构、数据体现结合使用,排序算法能够解决的问题包括:数据排序、重复元素查找、数据查找、优先队列(堆排序)、中位数以及其他运筹学算法等。排序算法如何选择?因为不同的… 阅读全文? 不稳定排序算法 常用排序算法?稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就https://www.zhihu.com/column/c_1281007643813945344
3.背诵拿分数据结构必背算法10关注启航不迷路 欢迎推荐给更多考研人 撰稿:政哥 责编:旺仔 部分素材来源网络,侵删 【背诵拿分】数据结构必背算法09 【背诵拿分】数据结构必背算法08 【背诵拿分】数据结构必背算法07 【背诵拿分】数据结构必背算法06 【背诵拿分】数据结构必背算法05https://mp.weixin.qq.com/s?__biz=MzU3OTY1ODMwMw==&mid=2247493055&idx=3&sn=abce454239eb3a8bbb1dbfb9a72ba762&chksm=fd6012efca179bf94dc98c76ee6007368c6293a12e93a30b87222f4636bde639a75be08f2395&scene=27
4.如何学好数据结构与算法本文介绍了如何系统学习数据结构与算法,包括设定学习目标、制定学习路线,强调理解原理、动手实践和持续学习的重要性,并推荐了浙江大学和清华大学的课程及经典书籍作为学习资源。 摘要由CSDN通过智能技术生成 学习数据结构与算法是计算机科学中至关重要的一部分。让我们一起探讨如何系统地学习这些知识。 https://blog.csdn.net/Aoqun/article/details/136297234
5.如何抓住重点,系统高效地学习数据结构与算法?想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析。 这个概念究竟有多重要呢?可以这么说,它几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓。 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就https://www.imooc.com/article/332964
6.什么是数据结构?什么是算法?怎么学习数据结构与算法?学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法……需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。 本文将回顾数据结构与算法的基础知识,学习日常所接触场景中的一些算法和策https://maimai.cn/article/detail?fid=1744039689&efid=u2sSJyH6RePBrCh7o1dCfA
7.学数据结构与算法用什么软件mob64ca12ecb6c5的技术博客如何学习数据结构与算法 作为一名经验丰富的开发者,我愿意分享一下如何学习数据结构与算法的方法。首先,我们需要明确整个学习过程的流程,然后逐步指导小白如何实现这一目标。 学习流程 选择学习资料安装IDE选择编程语言编写代码学习数据结构学习算法 学习步骤 选择学习资料 https://blog.51cto.com/u_16213416/10690285
8.《算法与数据结构》精品课:线上线下融合,师生协力共创编程教学新3.理论与实践结合:算法与数据结构是实践性很强的课程,需要通过编写代码来实现和应用所学的算法和数据结构。 4.坚持和持续学习:学习算法与数据结构,你会发现后面几乎所有计算机相关的专业课都能用到,所以你会遇到更多有挑战的算法问题等着你破解。 课程体会: https://sist.shanghaitech.edu.cn/_t335/2023/1205/c2858a1086548/page.htm
9.数据结构与算法之美(豆瓣)"数据结构与算法之美"试读· ··· 两年前,作者发布了一个关于数据结构和算法的网络教程,到目前为止,已经有 10 万多名读者订阅。该教程获得了很好的口碑,几乎“零差评”,甚至掀起了学习数据结构和算法的热潮。很多人因为这个网络教程开始学习数据结构和算法,也因此爱上了算法学习。之后,人民邮电出版社的编辑通过https://book.douban.com/subject/35474931/
10.《数据结构与算法》课程设计的心得体会(精选12篇)为了克服这些不足,使学生真正能把理论知识灵活运用到实践当中,我们开设了《数据结构与算法》课程综合性、设计性实验项目并立项进行实践研究,通过两三年的实践,取得了一些经验和成果,学生的实践能力也有了较大提高。 二、综合性、设计性实验项目的实践环节 1.实验项目的选择。 通过《数据结构与算法》课程的学习和前期https://www.360wenmi.com/f/filep4ynnltw.html
11.这些算法可视化网站助你轻松学算法腾讯云开发者社区无疑,数据结构与算法学习最大的难点之一就是如何在脑中形象化其抽象的逻辑步骤。而图像在很多时候能够大大帮助我们理解其对应的抽象化的东西,而如果这个图像还是我们自己一点点画出来的,那么无疑这个印象是最深刻的了。没错,今天给大家分享的就是算法可视化的网站。 https://cloud.tencent.com/developer/article/1462038
12.如何学习数据结构与算法?(加油,你可以的)jaiodfjiaodf如何学习数据结构与算法? (加油,你可以的) 精通一个领域(数据结构与算法) Chunk it up 切碎知识点 数据结构(https://naotu.baidu.com/file/b832f043e2ead159d584cca4efb19703?token=7a6a56eb2630548c) 庖丁解牛 把数据结构的一个又一个知识点分解开来https://www.cnblogs.com/ssaylo/p/12676845.html
13.数据结构和算法—动态规划数据结构和算法—动态规划 我一直最想做的就是机器学习,所以也都是在报机器学习的岗位,在BAT三家公司中,其实还是要讲百度吧,因为阿里在一面的时候就挂了,给我的理由是我投错了岗位(据面试官讲我应该去投算法岗,但我投的是数据挖掘),后来我在想,其实还就是我没能达到她的语气要求;腾讯就别讲了,连面试都没https://www.cda.cn/view/20622.html
14.如何学习数据结构和算法在与Codecademy的电话中,他们说:“别担心,不会问疯狂的算法问题或类似的问题。于是我认为这意味着我根本不需要学习算法。 在现场面试中,我遇到了两轮算法问题,事后看来都是非常基础的算法题。我记得其中一个是问我如何在网格中从A点穿越到B点。我完全不知道该怎么做,所以我只能瞎蒙了。我聚焦在一个无限的while循https://www.jianshu.com/p/8231f94121c1