【数据结构】什么是算法

简介: 【数据结构】什么是算法

一.算法的定义

1.算法的概念

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

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

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


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


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


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


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

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

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

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

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

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


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


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



二.算法的特性

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

输入

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

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

输出

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

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

有穷性

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

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

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

确定性

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

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

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

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

可行性

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

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


三.算法的设计要求

1.正确性

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

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

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

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

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

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

2.可读性

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

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

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

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

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

3.健壮性

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

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

4.效率与低存储量需求

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

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

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


结语

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

相关文章推荐

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

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

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

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



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


相关文章
|
22天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
33 1
|
25天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
77 4
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
23天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
22天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
96 23
|
1月前
|
算法
数据结构之蜜蜂算法
蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
59 20
|
22天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
51 1
|
1月前
|
机器学习/深度学习 算法 C++
数据结构之鲸鱼算法
鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。
49 0
|
1月前
|
算法 vr&ar 计算机视觉
数据结构之洪水填充算法(DFS)
洪水填充算法是一种基于深度优先搜索(DFS)的图像处理技术,主要用于区域填充和图像分割。通过递归或栈的方式探索图像中的连通区域并进行颜色替换。本文介绍了算法的基本原理、数据结构设计(如链表和栈)、核心代码实现及应用实例,展示了算法在图像编辑等领域的高效性和灵活性。同时,文中也讨论了算法的优缺点,如实现简单但可能存在堆栈溢出的风险等。
41 0
下一篇
DataWorks