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

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

一、问题提出

​ 最早计算机的设计初衷主要用于军事上枪炮的弹道计算和火力表的测试,后来更多的用于科学计算,即数值类的计算,而现在,计算机深入到日常生活的各个方面,其计算的数据早已从数值数据扩展到字符、表格、图像、音视频等非数值型数据,而如何有效的组织这些数据、高效的处理这些数据,则成了计算机学科的一大研究重点,而这也是数据结构所研究的主要问题。

​ 例如,实现一个学生管理系统,对于学生数据的组织就体现出了数据结构的作用。如何实现这个系统?

​ 定义5个变量来描述这一个学生的5个信息,但是如果有100个学生,那就需要定义500个变量:

在这里插入图片描述

​ 或者按照学生的信息类型定义5个数组:

在这里插入图片描述

​ 又或者,定义一个结构体用来表示一个学生的信息,定义1个数组来存储100个学生的信息:

在这里插入图片描述

​ 更进一步,可以实现一个链表来管理这些数据:

在这里插入图片描述

​ 对学生信息的处理经过了以下的变化

在这里插入图片描述

​ 再比如,我们需要完成跟省、市、地区相关的数据处理,那么可能会考虑采用树形结构:

在这里插入图片描述

​ 选用一个合适的数据结构对程序设计是一件非常重要的事情。

​ 确定了数据结构之后还不算结束,在完成一个常用的操作,比如说查找和排序上,还将有不同的实现方式,而不同的实现方式所带来的时间、空间成本则是完全不一样的,这些则是算法需要解决的。

​ 算法是为了描述实现某种操作而设计的对数据的组织方式,对某一个操作可能会设计出很多种解决的方式。

​ 比如一个经典问题:“从1累加到100,结果是多少?"

​ 采用简单粗暴的方式,慢慢累加就可以了,但是这个过程是漫长枯燥的,我们可以交给程序来进行:

int i = 0, sum = 0;
for (i = 0; i < 101; i++) 
{sum += i;
}

​ 或者优化一下:

int i = 0, j = 0, sum = 0;
for (i = 1, j = 100; i < j; i++, j--) 
{sum += (i + j);
}

​ 观察这两种求和操作,虽然都能解决问题,但是比较一下就会发现,第一种循环中的求和语句共执行了100次,而第二种却只执行了50次,速度明显提高一半。

​ 甚至我们可以采用数学王子高斯的解决方案:

int sum = (1 + 100) * 100 / 2;

​ 只用执行一次,相比于第一种方法效率直接提升了百倍。

​ 可以看出,采用不同的算法所花费的时间和计算过程是不一样的。这还仅仅是一个比较简单的示例,当我们学习过各种查找和排序算法后,我们就可以知道什么样的算法在什么样的数据结构下更合适,采取哪种算法对于成本的要求更低,等等,甚至可以设计和创造出新的更优秀的算法出来。

二、数据结构与算法是什么

​ 早期计算机是因为方便数值计算而设计产生的,但是慢慢随着人们的研究,计算机也开始被应用到逻辑计算领域,并以强大的生命力飞速发展,对人类的生产活动和社会活动产生了极其重要的影响。

​ 计算机解决问题时,先分析业务逻辑,从具体问题中抽象出适当的数据模型,然后提取算法,编写程序,最终得到一个现实项目应用软件。可随着大数据的处理问题、高效率的要求,简简单单地研发一个使用软件已不能满足时代发展要求,需要更加科学有效的手段给于辅助,“数据结构”的概念因此产生。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合**。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。1968 年,美国的高德纳教授在其所写的《计算机程序设计艺术》第一卷《基本算法》中,详细阐述数据的逻辑结构和存储结构及其操作,开创了数据结构课程体系。同年,数据结构作为一门独立的课程,在计算机科学的学位课程中开始出现。

​ 随着大型系统的诞生和使用,人们越来越重视数据结构,而且在结构确定后,程序执行的过程也被重视起来,人们将此称之为算法。算法可以理解为由基本运算及规定的运算顺序所构成的完整的解题步骤,或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。

​ 数据结构是处理数据存储的方式,而算法是处理数据执行步骤的方法,程序设计的实质就是对确定问题选择一个较合适的存储结构和一个合适的算法。因此也提出了这样的一个公式:

程序设计 = 数据结构 + 算法

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

​ 数据结构和算法之间存在着本质联系,不仅仅是代码的实现,更多的是一种思维方式的体现,学习它们,能够帮助我们从计算机的角度深入理解数据的组织方式和存储方式,从而有效的存储和提取数据、高效有序的解决问题,形成更加成熟、缜密的思考方式。

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

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

相关文章

毕业设计选题:基于php+vue+uniapp的新闻资讯小程序

开发语言&#xff1a;PHP框架&#xff1a;phpuniapp数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;PhpStorm 系统展示 管理员登录界面 管理员功能界面 新闻类别管理 新闻信息管理 用户管理 管理员管…

基于SpringBoot+Uniapp的家庭记账本微信小程序系统设计与实现

项目运行截图 展示效果图 展示效果图 展示效果图 展示效果图 展示效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更…

MicroFlow:一种高效的基于Rust的TinyML推理引擎

英文论文标题&#xff1a;MICROFLOW: AN EFFICIENT RUST-BASED INFERENCE ENGINE FOR TINYML 中文论文标题&#xff1a;MicroFlow&#xff1a;一种高效的基于Rust的TinyML推理引擎 作者信息&#xff1a; Matteo Carnelos&#xff0c;意大利帕多瓦大学&#xff0c;Grepit AB,…

潜水打捞系统助力,破解汽车打捞难题

随着人类活动的不断扩展&#xff0c;汽车落水事故频发&#xff0c;成为救援工作中的一大难题。汽车因其重量和结构特性&#xff0c;一旦沉入水体&#xff0c;打捞工作将面临巨大挑战。传统的打捞方法往往效率低下&#xff0c;且在操作过程中可能会对汽车造成进一步的损害&#…

Excel中使用SQL语句的四种方法

总结在 Excel 中使用 SQL 语句的四种方法&#xff0c;各种方法都有各自的适用场景&#xff0c;可以选择自己熟悉的或喜欢方式。本文以在 Excel 中操作 MS SQL 数据库的数据为例进行说明。MS SQL 的数据如下&#xff0c;使用微软 SQLExpress 版本。 方法 1&#xff1a; Excel 现…

RSA - 共模攻击

概念 RSA 共模攻击&#xff08;Common Modulus Attack&#xff09;是一种在特定条件下可以利用的 RSA 加密算法的攻击方法。它利用了当多个密文使用同一个 RSA 公钥&#xff08;即相同的模数 n&#xff09;进行加密时&#xff0c;可能可以通过密文之间的关系来获取明文信息&am…

spring揭秘25-springmvc04-servlet容器与springmvc容器总结

文章目录 【README】【1】DelegatingFilterProxy回顾【1.1】DelegatingFilterProxy初始化过滤器bean 【2】从servlet容器获取springmvc顶级web容器【2.1】从Servlet容器中获取springmvc容器总结【2.2】ContextLoaderListener加载springmvc顶级web容器并将其添加到servlet容器【…

Android开发视频预览效果

Android开发视频预览效果 视频播放不是一个简单的事情&#xff0c;得有暂停&#xff0c;继续播放等功能&#xff0c;屏幕的适配也是头疼的事情 一、思路&#xff1a; 引用的是腾讯播放器TXVodPlayer 二、效果图&#xff1a; 图片不是很直观&#xff0c;也可以看下视频 And…

(Linux和数据库)1.Linux操作系统和常用命令

了解Linux操作系统介绍 除了办公和玩游戏之外不用Linux&#xff0c;其他地方都要使用Linux&#xff08;it相关&#xff09; iOS的本质是unix&#xff08;unix是付费版本的操作系统&#xff09; unix和Linux之间很相似 Linux文件系统和目录 bin目录--放工具使用的 操作Linux远程…

消费者Rebalance机制

优质博文&#xff1a;IT-BLOG-CN 一、消费者Rebalance机制 在Apache Kafka中&#xff0c;消费者组 Consumer Group会在以下几种情况下发生重新平衡Rebalance&#xff1a; 【1】消费者加入或离开消费者组&#xff1a; 当一个新的消费者加入消费者组或一个现有的消费者离开消费…

ROS基础入门——实操教程

ROS基础入门——实操教程 前言 本教程实操为主&#xff0c;少说书。可供参考的文档中详细的记录了ROS的实操和理论&#xff0c;只是过于详细繁杂了&#xff0c;看得脑壳疼&#xff0c;于是做了这个笔记。 Ruby Rose&#xff0c;放在这里相当合理 本文初编辑于2024年10月4日 C…

MySQL--事务(详解)

目录 一、前言二、本文章目标三、什么是事务&#xff1f;四、事务的ACID特性五、为什么要使用事务六、如何使用事务6.1 查看支持使用事务的引擎6.2语法6.3 开启⼀个事务&#xff0c;执行更新后回滚6.4 开启一个事务更新后提交6.5 保存点6.6 自动/手动提交事务 七、事务的隔离性…

Spring异步线程池的问题

今天看一视频&#xff0c;提到说 Spring默认的异步线程池比较简单&#xff0c;每次执行异步任务&#xff0c;都会新建一个线程进行处理&#xff0c;不会重复利用&#xff0c;所以在用Spring框架开发的时候&#xff0c;需要自定义异步线程池。第一次听到这个说法。遂开始百度。 …

Word页眉内容自动填充为章节标题

Word页眉内容自动填充为章节标题 在写毕业论文的过程中&#xff0c;通常要求将页眉设置为章节标题&#xff0c;例如这样 通常&#xff0c;页眉内容我们都是手敲上去的&#xff0c;其实在Word中可以设置为自动引用章节标题&#xff0c;以下为设置方法&#xff0c;仅供参考&…

jmeter入门:脚本录制

1.设置代理。 网络连接-》代理-》手动设置代理. ip&#xff1a; 127.0.0.1&#xff0c; port&#xff1a;8888 2. add thread group 3. add HTTP(s) test script recorder, target controller chooses Test plan-> thread Group 4. click start. then open the browser …

利用 Python 爬虫采集 1688商品详情

1688是中国的一个大型B2B电子商务平台&#xff0c;主要用于批发和采购各种商品。对于需要从1688上获取商品详情数据、工程数据或店铺数据的用户来说&#xff0c;可以采用以下几种常见的方法&#xff1a; 官方API接口&#xff1a;如果1688提供了官方的API接口&#xff0c;那么可…

猎板PCB设计中的HDI板技术革新与实践

在设计工业控制器的HDI板时&#xff0c;需要注意以下几个关键方面&#xff1a; 布线设计&#xff1a;由于HDI板布线密度高&#xff0c;合理规划走线非常关键&#xff0c;避免交叉和重叠&#xff0c;确保信号传输的稳定性和可靠性。需要控制线宽和线距&#xff0c;根据电路板的…

C语言 | Leetcode C语言题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (…

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?

在日语中&#xff0c;“股票”可以说&#xff1a; • 株&#xff08;かぶ&#xff09; 这是最常用的表达方式&#xff0c;直接表示“股票”。 例如&#xff1a; 株を買う - 买股票 株を売る - 卖股票 • 株式&#xff08;かぶしき&#xff09; 这个词也是“股票”的意…

模拟实现消息队列(基于SpringBoot实现)

项目代码 提要&#xff1a;此处的消息队列是仿照RabbitMQ实现&#xff08;参数之类的&#xff09;&#xff0c;实现一些基本的操作&#xff1a;创建/销毁交互机&#xff08;exchangeDeclare&#xff0c;exchangeDelete&#xff09;&#xff0c;队列&#xff08;queueDeclare&a…