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.rhkb.cn/news/444337.html

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

相关文章

博客搭建之路:Netlify将url重定向到小写问题

文章目录 Netlify将url重定向到小写问题 Netlify将url重定向到小写问题 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 前两天将博客从vercel改为托管到Netlify上&#xff0c;本来运行的挺流畅的。但是今天我看一篇博客的评论时突然发现&#xff0c;虽然有评论 但是文章开头的评论…

【正点原子K210连载】第四十三章 人脸属性分析实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十三章 人脸属性分析实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了人脸口罩佩戴检测&#xff0c;本章将继续介绍利用maix.KPU模块实现的人脸属性分析。通过本章的学习&#xff0c;读者将学习到人脸属性分析应用在CanMV上的实现。 本章分为如下几个小节&…

JUC高并发编程10:线程池

1 线程池概述 1.1 线程池简介 线程池&#xff08;Thread Pool&#xff09;是一种线程使用模式。在多线程编程中&#xff0c;线程的创建和销毁会带来一定的开销&#xff0c;尤其是在处理大量短时间任务时&#xff0c;频繁的线程创建和销毁会导致调度开销增加&#xff0c;进而影…

Java 集合 Collection常考面试题

理解集合体系图 collection中 list 是有序的,set 是无序的 什么是迭代器 主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。 ArrayList 和 Vector 的区别? ArrayList 可以存放 null,底层是由数…

【算法】滑动窗口(续)

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

2024长城杯WP

WEB SQLUP 打开题目给了一个登录页面结合名字猜测为SQL注入 查看源码发现有hint提示开发者使用的是模式匹配 所以我尝试使用%来模糊匹配&#xff0c;登陆成功 usernameadmin&password% 进入面板之后发现有一个文件上传功能 尝试上传php文件&#xff0c;结果被waf&#xff0…

【银河麒麟高级服务器操作系统】安全配置基线相关分析全过程及解决方案

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 【机型】物理机或虚机 【…

SpringBoot开发——整合Admin监控服务

文章目录 1、SpringBoot-Admin简介2、SpringBoot整合Admin监控服务2.1 创建SpringBoot-Admin项目(服务端)2.1.1 创建一个SpringBoot项目2.1.2 选择相关依赖2.1.3 启用Admin监控服务2.1.4 启用项目2.2 配置需要被监听的项目(客户端)2.2.1 被监听的项目添加相关依赖2.2.2 配置被…

Redis高级篇 —— 分布式缓存

Redis高级篇 —— 分布式缓存 文章目录 Redis高级篇 —— 分布式缓存1 Redis持久化1.1 RDB1.2 RDB的fork原理1.3 RDB总结1.4 AOF持久化1.5 RDB和AOF的对比 2 Redis主从2.1 搭建主从架构2.2 数据同步原理2.2.1 全量同步2.2.2 增量同步 3 Redis哨兵3.1 哨兵的作用和原理3.1.1 哨兵…

kafka和zookeeper单机部署

安装kafka需要jdk和zookeeper环境&#xff0c;因此先部署单机zk的测试环境。 zookeeper离线安装 下载地址&#xff1a; zookeeper下载地址&#xff1a;Index of /dist/zookeeper 这里下载安装 zookeeper-3.4.6.tar.gz 版本&#xff0c;测试环境单机部署 上传服务器后解压缩 …

Python酷库之旅-第三方库Pandas(142)

目录 一、用法精讲 641、pandas.Timestamp.hour属性 641-1、语法 641-2、参数 641-3、功能 641-4、返回值 641-5、说明 641-6、用法 641-6-1、数据准备 641-6-2、代码示例 641-6-3、结果输出 642、pandas.Timestamp.is_leap_year属性 642-1、语法 642-2、参数 6…

使用Python编写你的第一个算法交易程序

背景 Background ​ 最近想学习一下量化金融&#xff0c;总算在盈透投资者教育&#xff08;IBKRCampus&#xff09;板块找到一篇比较好的算法交易入门教程。我在记录实践过程后&#xff0c;翻译成中文写成此csdn博客&#xff0c;分享给大家。 ​ 如果你的英语好可以直接看原文…

用FPGA做一个全画幅无反相机

做一个 FPGA 驱动的全画幅无反光镜数码相机是不是觉得很酷&#xff1f; 就是上图这样。 Sitina 一款开源 35 毫米全画幅 (3624 毫米) CCD 无反光镜可换镜头相机 (MILC)&#xff0c;这个项目最初的目标是打造一款数码相机&#xff0c;将 SLR [单镜头反光] 相机转换为 DSLR [数码…

SpringBoot 集成 Redis

一&#xff1a;SpringBoot 集成 Redis ①Redis是一个 NoSQL&#xff08;not only&#xff09;数据库&#xff0c; 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器&#xff1b;常用的数据类型&#xff1a; string , hash ,set ,zset , list ③通过Redis客…

初阶C语言-结构体

一.结构体的声明 1.结构体类型的声明 1.1结构的基础知识 结构是一些值的集合&#xff0c;这些值称为称为变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag //struct是结构体关键字&#xff0c;tag是结构体类型名称 { member - list;//成员变…

D26【python 接口自动化学习】- python 基础之判断与循环

day26 语句嵌套 学习日期&#xff1a;20241003 学习目标&#xff1a;判断与循环&#xfe63;-36 语句嵌套&#xff1a;如何处理多重嵌套的问题&#xff1f; 学习笔记&#xff1a; 语句嵌套的用途 在条件语句中使用另外一个条件语句 在循环中使用条件语句 多重循环 总结 1…

linux查看k8s的开机启动状态 systemctl is-enabled 查看开机启动状态

查看k8s的开机启动状态 在Kubernetes中&#xff0c;通常使用systemd来管理服务的启动。但是&#xff0c;Kubernetes节点上的服务可能不是由systemd直接管理&#xff0c;而是通过kubelet服务来管理。因此&#xff0c;检查Kubernetes节点的开机启动状态&#xff0c;你需要检查ku…

Unity网络开发 - C#开源网络通信库PESocket的使用

概述 在现代多人在线游戏中&#xff0c;稳定且高效的网络通信是确保游戏体验的关键。本文将探讨如何利用C#开源网络通信库PESocket来构建一个简单的Unity客户端与.NET控制台服务器之间的实时消息传递系统。通过本例&#xff0c;读者不仅能够了解PESocket的基本用法&#xff0c…

稀土抗紫外屏蔽剂的用途

稀土抗紫外屏蔽剂具有光、热稳定性好&#xff0c;可高效吸收/有效屏蔽280-400nm范围内的紫外线&#xff0c;无二次氧化过程的缺点&#xff0c;彻底解决产品因紫外线原因造成的变质和老化问题&#xff0c;并且具有添加量小、无毒、不易析出等优点。 稀土抗紫外屏蔽剂的用途只要有…

安全网络架构

网络安全解决方案是指通过一系列技术和措施来保护网络系统和数据的安全。它涉及多个方面&#xff0c;包括网络设备的防护、数据的加密和备份、安全策略的制定和执行等。以下是一些常见的网络安全解决方案&#xff1a; 防火墙&#xff1a;防火墙是一种硬件或软件设备&#xff0c…