【数据结构】什么是算法

 🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

一.算法的定义

1.算法的概念

2.数据结构与算法的关系

二.算法的特性

输入

输出

有穷性

确定性

可行性

三.算法的设计要求

1.正确性

2.可读性

3.健壮性

4.效率与低存储量需求


一.算法的定义

1.算法的概念

什么是算法呢?算法就是描述解决问题的方法.

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作.

对于给定的问题,是可以有多种算法来解决的.如我们曾经遇到过的排序问题,就可以使用冒泡排序算法,选择排序算法,归并排序算法,插入排序算法,快速排序算法等多种算法来解决问题.

但是没有对于所有问题都通用的通用的算法,就像这世界上没有包治百病的药一样,一个算法只能解决一个或一部分特定的问题.

在算法的定义中,提到了指令,指令能被人或机器等计算装置执行.它可以是计算机指令,也可以是我们平时的语言文字.

为了解决某个或某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作都完成特定的功能,这就是算法.

2.数据结构与算法的关系

在前面的数据结构绪论篇中我们介绍过数据结构的概念:

数据结构是指数据的组织方式和存储结构,它关注的是如何高效地组织和存储数据,包括数组、链表、栈、队列、树、图等.

而算法是指解决问题的一系列步骤和规则,它关注的是如何高效地解决问题,包括排序、查找、图算法、动态规划等。

数据结构的选择和设计直接影响着算法的效率和实现方式

算法的设计和实现需要考虑数据结构的选择和使用不同的数据结构适合不同的算法

因此,数据结构和算法相互依存,数据结构为算法提供了基础和支持,而算法则需要根据数据结构的特点来设计和实现。合理选择和使用数据结构可以提高算法的效率和性能,而高效的算法也可以充分发挥数据结构的优势

总之,数据结构和算法是紧密联系的,它们相互依存、相互影响,共同构成了计算机科学中重要的基础知识。


二.算法的特性

算法具有五个基本特性:输入,输出,有穷性,确定性和可行性.

输入

一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合.

尽管对于绝大多数算法来说,输入参数都是必要的,但对于个别情况,如打印"hello world!"这样的代码,不需要任何输入参数,因此算法的输入可以是0个.

输出

一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量.

 算法是一定要有输出的,或者说算法运行结束后一定要有一个结果,如果算法运行结束后没有输出,则相当于算法做功为0,没有任何用处.

有穷性

一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成.

 在C语言最开始的学习阶段,我们常常会因为for循环的判断标准写错而导致程序陷入死循环,这样死循环的代码就是不满足有穷性的.并且这里的有穷性的概念不是纯数学上的,而应该是在实际应用当中合理的,可以接受的"有边界".

就像你不能写一个算法,计算机需要算10年才能得出结果,这确实在数学意义上是有穷了,但时间跨度太大,算法就没有什么使用意义了.

确定性

算法中每一条指令必须有确切的含义,读者理解时不会产生二义性.并且,在任何条件下,算法只有惟一的一条执行路径,即对于相同的输入只能得出相同的输出.

这个特性很好理解,即算法的每一步都必须不能有歧义.

比如你不能设计一个算法的指令是"你背着张三买一份薯条",这样的指令让李四执行,李四可能会躲过张三,在张三不知情的情况下买一份薯条,而这样的指令让王五执行的话,王五可能会把张三背在身上然后一起去买薯条.

这样的歧义毫无疑问将会导致算法在输入相同的情况下得到不同的输出结果,这就不符合算法的确定性.

可行性

一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的.

可行性意味着算法可以转换为程序上机运行,并得到正确的结果.


三.算法的设计要求

1.正确性

算法的正确性是指算法至少应该具有输入,输出加工处理无歧义性,能正确反映问题的需求,能够得到问题的正确答案.

但算法的"正确"通常在通常在用法上有很大的差别,大体分为以下四个层次:

  1. 算法程序没有语法错误.
  2. 算法程序对于几组输入数据能够产生满足要求的输出结果.
  3. 算法程序对于精心选择的典型,苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果.
  4. 算法程序对于一切合法的输入数据都能产生满足规格说明要求的结果.

 显然,对于这四个层次,第一层次的要求是最低的,但仅仅没有语法错误实在是谈不上是一个好的算法.而第四层次最困难的,我们几乎不可能逐一验证所有的输入都得到正确的结果.

因此算法的正确性在大部分情况下都不可能用程序来证明,而是用数学方法证明的.

一般情况下,我们把第三层次的正确性作为衡量一个算法是否正确的标准.

2.可读性

算法设计的另一目的是为了便于阅读,理解交流.

可读性高有助于人们理解算法,晦涩难懂的算法往往隐含错误,不易被发现,并且难于调试和修改.

举个例子,我在初学C语言的时候,有时会和同学比拼谁的解题代码更简短,往往会因此简略合并代码中非常多的细节和步骤,并且以此为荣.

但事实上这并不是一个好的代码风格,在团队协作的过程中,这样的代码是非常影响团队效率的,因为这样的代码可读性很差,不光影响他人,甚或时间一长,自己都不知道当时自己写的是什么了.

因此,可读性是算法好坏很重要的标志.

3.健壮性

输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果.

一个好的算法还应该能对输入数据不合法的情况做合适的处理.比如年龄和体重不应该是负数.

4.效率与低存储量需求

设计算法应该尽量满足时间效率高储存量低的需求.

时间效率是指算法的执行时间,对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率高,执行时间长的算法效率低.存储量需求指的是算法在执行过程中需要的最大存储空间,主要指算法程序运行时所占用的内存或外部硬盘存储空间.

在生活中,人们都希望花最少的钱,用最短的时间,办最大的事,算法也是这样的思想,我们在设计算法时,要尽量追求可以高效率低存储量的算法来解决问题.


结语

当我们搞清楚什么是算法后,在数据结构算法篇我们还将一起学习算法效率的度量方法,算法的时间复杂度算法的空间复杂度相关的知识.希望这些内容能对大家有所帮助,一起学习,一起进步!

相关文章推荐

【数据结构】什么是数据结构?

【数据结构】算法效率的度量方法

【数据结构】算法的时间复杂度

【数据结构】算法的空间复杂度



 数据结构算法篇思维导图:

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

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

相关文章

GNU和Linux的关系、 Linux的发行版本、CentOs和RedHat的区别

GNU和Linux的关系 其实,我们通常称之为的"Linux"系统,相对更准确的名称应该称为“GNU/Linux”系统! 一个功能完全的操作系统需要许多不同的组成部分,其中就包括内核及其他组件;而在GNU/Linux系统中的内核就…

基于SpringBoot的大型商场应急预案管理系统

目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 预案信息管理 预案类型统计 事件类型管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍…

开学典礼教师代表讲话发言稿 教师宣誓词分享

教师精彩发言稿1 尊敬的领导,亲爱的同学们: 大家好! 在这个明媚的早晨,我非常荣幸地代表全体教师,向你们这群活力四溢的新面孔,表达我们最诚挚的问候和欢迎。 新学期,新开始,每个…

Elasticsearch:使用 ELSER 文本扩展进行语义搜索

在今天的文章里,我来详细地介绍如何使用 ELSER 进行文本扩展驱动的语义搜索。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装: 如何在 Linux,MacOS 及 Windows 上…

unity操作_刚体 c#

刚体Rigidbody 首先在场景中创建一个Plane 位置重置一下 再创建一个Cube 充值 y0.5 我们可以看出创建的Cube 和 Plane都自带碰撞器 Plane用的是网格碰撞器 我们可以通过网格世界看到不同的网格碰撞器 发生碰撞(条件): 两个物体都有碰撞器 …

新华三辅导笔记 2023/10/9-2023/10/13

新华三辅导笔记 一、需要用到的软件二、计算机网络概述1、计算机网络的定义和基本功能(1)什么是计算机网络(2)计算机网络的基本功能 2、(1)局域网、城域网和广域网(范围划分)&#x…

【名城优企游学】国轩高科,用数字化带来强劲发展动力

成立于2006 年5月,系中国动力电池产业最早进入资本市场的民族企业;2015年5月上市,股票代码SZ.002074,拥有新能源汽车动力锂电池、储能、输配电设备等业务板块,建有独立成熟的研发、采购、生产、销售体系。 它就是新能…

boost在不同平台下的编译(win、arm)

首先下载boost源码 下载完成之后解压 前提需要自行安装gcc等工具 window ./bootstrap.sh ./b2 ./b2 installarm (linux) sudo ./bootstrap.sh sudo ./b2 cxxflags-fPIC cflags-fPIC linkstatic -a threadingmulti sudo ./b2 installx86 (linux) su…

菜单子节点的写法

菜单子节点的写法 1.测试数据2.实现代码3.获取父ID层级 1.测试数据 1.表结构SQL CREATE TABLE test (id int DEFAULT NULL,u_id int DEFAULT NULL,p_u_id int DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci;2.数据SQL INSERT INTO test (i…

直线导轨精度等级在设备中有什么影响?

直线导轨的精度选择是直线导轨应用中的重要环节,需要根据具体的应用场景和设备要求来选择合适的精度等级(常见分3个等级:N/H/P)。下面我们来详细了解一下直线导轨的精度选择。 1、精度等级的概念:直线导轨的精度等级是…

淘宝京东拼多多品牌价格监控API接口

淘宝、京东、拼多多品牌价格监控API接口需要从官方平台获取,以下是具体步骤: 登录京东、天猫、淘宝、拼多多、苏宁、国美、唯品会等电商平台,注册并获取开发者账号和API接口权限。通过开发者账号和API接口权限,访问京东、天猫、淘…

maven的pom.xml文件显示被删除

文章目录 1.问题情况2.问题分析3.问题解决 1.问题情况 2.问题分析 这些 pom.xml 文件被 maven 视为了忽略文件。 3.问题解决 路径:File --> Settings --> Build,Execution,Deployment --> Build Tools --> Maven --> Ignor…

Web测试的基础流程(外加测试过程需要的注意5点)

前言 在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。 重要的是…

学习Kotlin编程语言

官网地址 https://developer.android.google.cn/kotlin/learn?hlzh-cn 脑图

VuePress实现自动获取文章侧边栏目录功能

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

性能测试-如何进行监控设计

监控设计步骤 首先,你要分析系统的架构。在知道架构中使用的组件之后,再针对每个组件进行监控。 其次,监控要有层次,要有步骤。先全局,后定向定量分析。 最后,通过分析全局、定向、分层的监控数据做分析…

SpringbootWeb快速入门

1. 创建新项目,并勾选相关依赖 选中Spring Initializr,设置相关项 点击next选中spring web 点击create 2. 定义HelloController类,添加方法和注解 import org.springframework.web.bind.annotation.RequestMapping;: 这一行导入了Spring MVC…

vue接入高德地图获取经纬度

&#x1f90d;step1:高德地图开放平台&#xff0c;根据指引注册成为高德开放平台开发者&#xff0c;并申请 web 平台&#xff08;JS API&#xff09;的 key 和安全密钥; &#x1f90d;step2:在html引入安全密钥&#xff08;获取经纬度用&#xff0c;不然会报错&#xff09; <…

设计模式 - 迭代器模式

目录 一. 前言 二. 实现 三. 优缺点 一. 前言 迭代器模式是一种行为型设计模式&#xff0c;它提供了一种统一的方式来访问集合对象中的元素&#xff0c;而不暴露集合内部的表示方式。简单地说&#xff0c;就是将遍历集合的责任封装到一个单独的对象中&#xff0c;我们可以按…

JVM的内存模型

一、JVM的内存模型 1.1、目标 内存模型是用来描述JVM内部的内存结构和内存管理的模型。它定义了JVM在运行Java程序时所需要的各种内存区域&#xff0c;以及每个内存区域的作用和特点。 1.2、结构划分 1.2.1、栈 每个线程在执行Java方法时会创建一个栈帧&#xff08;Stack …