【数据结构】什么是算法

news2024/11/26 11:43:03

 🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境: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.coloradmin.cn/o/1070690.html

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

相关文章

DALL·E 3 ChatGPT-4的梦幻联动

核心内容:DALLE 3 & ChatGPT-4的梦幻联动 hello,我是小索奇,最近DALL结合ChatGPT4的话题逐渐上升了起来,今天就带大家探索一下~ DALLE的主要功能是根据文本描述来生成图片。你可以告诉它一个穿着皮草的西瓜,它就能…

叠氮修饰的葡萄糖Ac4GIcNAz,98924-81-3

产品简介:The tetraacetylatedN-Azidoacetyl-glucosamine (Ac4GlcNAz) provides a non-radioactive alternativefor glycoconjugate visualization. It is cell-permeable, intracellularlyprocessed and incorporated instead of its natural monosaccharide count…

MongoDB——window11安装mongodb5.0.21版本服务端(图解版)

目录 一、mongodb官网下载地址二、安装步骤三、配置环境变量四、运行mongodb 一、mongodb官网下载地址 mongodb官网下载地址:https://www.mongodb.com/try/download/community 二、安装步骤 双击运行下载好的mongodb-windows-x86_64-5.0.21-signed.msi安装包&am…

JVM篇---第八篇

系列文章目录 文章目录 系列文章目录一、虚拟机为什么使用元空间替换了永久代?二、什么是Stop The World ? 什么是OopMap?什么是安全点?三、说一下JVM 的主要组成部分及其作用?一、虚拟机为什么使用元空间替换了永久代? 「什么是元空间?什么是永久代?为什么用元空间代…

定时任务详解

1、定时任务 在公司做项目时,经常遇到要用到定时任务的事情,但是对定时任务不熟练的时候会出现重复任务的情况,不深入,这次将定时任务好好学习分析一下 定时任务的原理 假如我将一个现场通过不断轮询的方式去判断,就…

【Gradle-10】不可忽视的构建分析

1、前言 构建性能对于生产力至关重要。 随着项目越来越复杂,花费在构建上的时间就越长,开发效率就越低。 通过分析构建过程,可以了解项目构建的时间都花在哪,以及项目存在哪些潜在的问题,找到构建瓶颈,解…

Qt之实现圆形进度条

在Qt自带的控件中,只有垂直进度条、水平进度条两种。 在平时做页面开发时,有些时候会用到圆形进度条,比如说:下载某个文件的下载进度。 展示效果,如下图所示: 实现这个功能主要由以下几个重点&#xff1a…

在公众号上怎么创建微信付费课程功能呢

微信付费课程功能是一项比较受欢迎的在线教育服务,可以帮助教育机构或个人更好地管理和销售课程资源,提高知识分享和变现的效率。下面将介绍如何创建微信付费课程功能。 一、了解微信付费课程功能 在创建微信付费课程功能之前,需要先了解微信…

【自学笔记】网络安全——黑客技术

想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客!!! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队…

【Java 进阶篇】HTML表格标签详解

HTML(Hypertext Markup Language)表格标签是在网页中用于创建表格的重要工具。表格是一种在网页上以行和列的方式组织和显示数据的有效方式。在本文中,我们将详细介绍HTML表格标签,包括如何创建表格、定义表头、单元格合并等内容。…

Flask实现注册登录模块

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言1.…

通过代码优雅地编写图表——Mermaid语法

通过代码优雅地编写图表——Mermaid语法 使用代码,在你的Typora中优雅地编写图表! 先看一个示例: gantt dateFormat YYYY-MM-DD title Adding GANTT diagram to mermaid excludes weekdays 2023-01-10section A section Completed task …

快速了解SpringCloud Sleuth --链路追踪 + Zipkin--数据搜集/存储/可视化

😀前言 本篇博文是关于SpringCloud Sleuth --链路追踪 Zipkin–数据搜集/存储/可视化的基本介绍和使用,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文…

常见源协议介绍

开源协议(Open Source License)是一种法律文档,用于规定如何使用、修改和分发开源软件和其他开源项目的规则和条件。这些协议允许创作者或组织将其创造的代码或作品以开放源代码的形式共享给他人,以促进协作、创新和知识共享。常见…

HttpClient实现爬虫开发

网络爬虫是一种高效获取网络信息的方式,而HttpClient是一个强大而灵活的Java库,提供了方便的API和丰富的功能,使其成为开发高效且灵活的网络爬虫的理想选择。本文将分享如何利用HttpClient库进行网络爬虫开发,帮助您更好地理解并实…

NSA 和 CISA 联合揭露当下十大网络安全错误配置

10月5日,美国国家安全局 (NSA) 和网络安全与基础设施安全局 (CISA) 公布了十大目前最常见的网络安全错误配置,这些错误由红蓝团队在大型组织网络中发现。 根据发布的联合报告,团队评估了国防部 (DoD)、联邦民事行政部门 (FCEB)、州和地方政府…

解决程序员百分百问题pip终极杀手

文章目录 pip中国版镜像源永久版中国镜像源pip添加多个中国版镜像源无敌版pip中的小细节 pip中国版镜像源 Python中使用pip安装包,常用的国内镜像有: 例如: Python中使用pip安装包,常用的国内镜像有:清华大学镜像&am…

Mac 点击桌面 出现黑边框 解决

1、桌面黑框效果 2、解决:设置为 仅在台前调度中

电脑散热——液金散热

目录 1.简介 2.传统硅脂与液金导热区别 3.特点 4.优点 5.为什么液金技术名声不太好 6.使用方法 1.简介 凡是对于电脑基础硬件有所了解的人,都知道硅脂是如今高性能电脑设备中必不可少的东西。芯片表面和散热器接触面,虽然肉眼看上去是非常光滑的金属…

vue实现拖拽排序

在业务中列表拖拽排序是比较常见的需求,常见的JS拖拽库有Sortable.js,Vue.Draggable等,大多数同学遇到这种需求也是更多的求助于这些JS库,其实,使用HTML原生的拖放事件来实现拖拽排序并不复杂,结合Vue的tra…