【数据结构】什么是算法

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

一.算法的定义

1.算法的概念

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

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

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


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


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


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


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

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

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

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

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

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


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


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



二.算法的特性

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

输入

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

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

输出

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

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

有穷性

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

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

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

确定性

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

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

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

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

可行性

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

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


三.算法的设计要求

1.正确性

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

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

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

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

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

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

2.可读性

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

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

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

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

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

3.健壮性

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

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

4.效率与低存储量需求

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

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

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


结语

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

相关文章推荐

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

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

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

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



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


相关文章
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
771 1
|
10月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
659 1
|
10月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
271 0
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
458 10
 算法系列之数据结构-二叉树
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
438 3
 算法系列之数据结构-Huffman树
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
605 22
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
570 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
842 25
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
939 23
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
299 20

热门文章

最新文章