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

news2024/11/27 8:25:47

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

一、问题提出

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

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

​ 定义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.coloradmin.cn/o/2204601.html

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

相关文章

【论文阅读】Cross Attention Network for Few-shot Classification

用于小样本分类的交叉注意力网络 引用&#xff1a;Hou, Ruibing, et al. “Cross attention network for few-shot classification.” Advances in neural information processing systems 32 (2019). 论文地址&#xff1a;下载地址 论文代码&#xff1a;https://github.com/bl…

畅阅读微信小程序+ssm论文源码调试讲解

2 系统开发环境 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行&#xff0c;目前微信开发者工具任然在不断的完善中&#xff0c;在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具&#xff0c;开发者工具将使用这个微信帐号的信息进行小程…

【含文档】基于Springboot+Vue的母婴全程服务管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

CSS @规则(At-rules)系列详解___@charset规则使用方法

CSS 规则(At-rules)系列详解 ___charset规则使用方法 本篇目录&#xff1a; 零、时光宝盒 一、charset规则定义和用法 二、CSS charset语法 三、charset 使用方法例子 1、正确使用方法 2、无效的&#xff0c;错误的使用方法 零、时光宝盒 &#xff08;https://blog.csd…

解决 IntelliJ IDEA 运行时 “Command line is too long“ 问题

文章目录 文章标题&#xff1a;解决 IntelliJ IDEA 运行时 "Command line is too long" 问题简介问题描述解决方案代码示例代码示例1&#xff1a;使用JAR Manifest代码示例2&#xff1a;使用Classpath File代码示例3&#xff1a;优化项目依赖 结论进一步的资源 文章标…

【算法】滑动窗口(续)

一、将x减到0的最小操作数 1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要…

如何使用 Hailuo AI 生成视频

在这个科技飞速发展的时代&#xff0c;人工智能已经成为创意领域的重要工具。Hailuo AI 是一个强大的平台&#xff0c;可以帮助你将文字描述转化为高质量的视频。以下是详细的步骤&#xff0c;教你如何使用 Hailuo AI 生成视频。 第一步&#xff1a;访问 Hailuo AI 网站 首先…

第十四章 Java多线程--阻塞队列--SynchronousQueue

目录 一、SynchronousQueue基础概念 主要特点 使用场景 示例代码 二、SynchronousQueue深入了解 1 SynchronousQueue介绍 2 SynchronousQueue核心属性 3 SynchronousQueue的TransferQueue源码 3.1 QNode源码信息 3.2 transfer方法实现 3.3 tansfer方法流程图 一、Sy…

【C++堆(优先队列)】1834. 单线程 CPU|1797

本文涉及知识点 C堆(优先队列) LeetCode1834. 单线程 CPU 给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务…

QStandardItemModel的role

QStandardItemModel定义了一些标准的角色&#xff0c;而QAbstractItemModel允许自定义角色。以下是一些常见的数据角色&#xff1a;1. **Qt::DisplayRole**&#xff1a;这是最基本的角色&#xff0c;用于显示在视图中的文本。当一个单元格被绘制时&#xff0c;通常会查询这个角…

Go 语言应用开发:从入门到实战

Go 语言应用开发&#xff1a;从入门到实战 引言 Go&#xff08;Golang&#xff09;是由 Google 开发的一种开源编程语言&#xff0c;设计初衷是提高编程效率&#xff0c;尤其是在高并发场景下表现出色。Go 语言以其简洁、易学、高效并发的特性&#xff0c;逐渐成为开发者的首…

<Project-8.1.1 pdf2tx-mm> Python 调用 ChatGPT API 翻译PDF内容 历程心得

原因 用ZhipuAI&#xff0c;测试用的PDF里&#xff0c;有国名西部省穆斯林&#xff0c;翻译结果返回 “系统检测到输入或生成内容可能包含不安全或敏感内容&#xff0c;请您避免输入易产生敏感内容的提 示语&#xff0c;感谢您的配合” 。想过先替换掉省名、民族名等&#xff…

DM8数据库用户和表空间管理

1 说明 DM8用户管理和表空间管理常用的管理命令&#xff0c;包括创建、修改和查看信息操作等。 2 用户管理 2.1 创建用户 创建一个用户lu9up&#xff0c;密码为"admin2024."&#xff0c;未制定表空间&#xff0c;使用默认的表空间main。 SQL> create user lu…

银河麒麟桌面操作系统V10:解决激活时“无法获取硬件信息(错误码#0017)”问题

银河麒麟桌面操作系统V10&#xff1a;解决激活时“无法获取硬件信息&#xff08;错误码#0017&#xff09;”问题 1、问题描述2、问题解决方法步骤一&#xff1a;打开终端步骤二&#xff1a;删除/etc/.kyhwid文件步骤三&#xff1a;重新激活系统总结 &#x1f490;The Begin&…

【Ubuntu】在Ubuntu上安装IDEA

【Ubuntu】在Ubuntu上安装IDEA 零、前言 最近换了Ubuntu系统&#xff0c;但是还得是要写代码&#xff0c;这样就不可避免地用到IDEA&#xff0c;接下来介绍一下如何在Ubuntu上安装IDEA。 壹、下载 这一步应该很容易的&#xff0c;直接打开IDEA的下载页面&#xff0c;点击下…

Python RabbitMQ 入门 pika

Python RabbitMQ 入门 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…

基于vue的酒店预订管理系统(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Paperless-ngx文档管理系统本地部署并实现远程使用搜索查阅文件

文章目录 前言1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux系统本地部署Paperless-ngx开源文档管理系统&#xff0c;并结合cpolar内网穿透工具解决本地部署…

Visual Studio 2022安装(含重生版)

前言&#xff1a; 昨天调试代码的时候发现程序怎么都运行不了&#xff0c;错误显示无法找到文件啊啊啊&#xff0c;能力有限&#xff0c;找不出错误源&#xff0c;然后就狠心删掉所有相关文件来“重新开始”&#xff01; 正文&#xff1a; 1.官网下载&#xff08;内定中文版…

欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值

目前链上数据正处于迈向下一个爆发的重要时刻。 随着Web3行业发展&#xff0c;公链数量呈现爆发式的增长&#xff0c;链上积聚的财富效应&#xff0c;特别是由行业热点话题引领的链上交互行为爆发式增长带来了巨量的链上数据&#xff0c;这些数据构筑了一个行为透明但与物理世…