什么是算法

news2024/11/23 21:11:29

有人说程序=算法+数据结构,虽说这样的认为有失偏颇,一个程序决定的东西实在太多,但某些方面也说明了算法是很重要的(数据结构承上启下,最终也是要为算法服务)。

  算法是用来解决问题的,要理解什么是算法,先要明白什么是问题。而无论是狭义还是广义,算法都是用来处理问题,所以两者放在一起来理解会比较方便。

  一、可形式化的问题

  我们在《算法导论》、《数据结构》里面遇到的问题基本上都是可形式化的问题,也就是可以用数学语言准确描述的问题。此类问题定义明确,是数学意义上狭义的问题。问题的解决必须在有限的步骤内解决,则为算法,这里是数学上狭义的算法,或者称为“真正的算法”。但是不是每个可以形式化的问题都是可以用算法解决的,这个早在上个世纪前五十年就已经知道了,著名的图灵机停机问题就是可形式化但不存在算法可以解决的问题。我们的算法实际上本质和形式系统内定理的演绎一样,那么如同无法用算法判断所有的图灵机是否停机一样,我们的自然数体系中也存在着不可判定的命题,本质一致,不过这是题外话。

  很多人应该做过类似这样的问题:假设函数f()随机返回0~24这25个整数中的一个,且返回每个整数的概率都是1/25;那么根据f函数构造另外一个函数g,返回0~5这6个整数中的一个,且返回每个证书的概率都是1/5。

  这个问题是可以形式化的,题目也不是很难做,以下给出一个伪码:

  function g

    while true

      let x = f()

      if x != 24

        break

      end if

    end while

    return floor(x/4)

  end function

  以上伪码应该不是很难懂,g函数也的确这样被构造出来了。可是这不是算法,因为g函数可能永远都无法结束,永远都会因为f()返回24而死循环。此问题本质上和尺规作图三大经典问题(化圆为方,立方倍积,三等分角)、一元五次方程求根公式一致。

  诸如围棋这样的博弈问题也是可以形式化的。终局有一个结果,可以用一个数值来代表,博弈的双方轮流选择,一方的目标是终局的结果值最小,另一方的目标是中间的结果值最大。此类双方轮流执行的离散博弈问题有个通用的算法,这是一个真正的数学意义上狭义的算法,叫做最大最小算法。做法如下:

  (1)先画出博弈树,也就是遍历所有直到博弈结束的可能。

  (2)从博弈树的每个树叶开始,逐次向树根,不断计算出可以得到最佳结果的选择。

  递归的选择方法如下图:

  从而,每一步都可以计算出得到最佳结果的选择。

  最大最小算法虽然在此处通用,但未必好,因为博弈树过于庞大。以下问题可能很有名:

  给定n堆棋子,两个人轮流拿棋子,每个人每一次只能从其中一堆中拿,至少拿一颗,至多把一堆拿走。当轮到的人没有棋子可拿,那么这人输,对方赢。

  如果棋子足够多,那么这个问题的博弈树非常大,用最大最小算法显然是不靠谱的。可是好在我们知道,这个问题只要每次使得所有棋子个数异或结果为0,则可以立于不败之地,也就是这个算法可比博弈树最大最小算法要快速、靠谱的多。

  再回到围棋,围棋的博弈树过于庞大,所以更不可能用最大最小算法来实用。所以我们只好引入人工智能来“解决”这个问题,但我们要知道这里的人工智能并不是真正数学意义上狭义的算法。

  很多时候,即使问题是可形式化的,但因为问题的解决可能十分复杂,例如NPC、NPH,我们显然不是很方便通过狭义的算法来解决,刚才围棋就是一个典型的例子,于是就要引入启发性算法,这也属于AI范畴,但未必是机器学习。比如求最短Hamiton环的tsp,这是一个NPH,当然如果问给定长度问此完全图有无不超过给定长度的Hamiton环,这是一个NPC,我们可以用很多启发式算法来找最短Hamiton环,比如蚁群算法、粒子群算法、遗传算法都可以。经我实际实际验证,蚁群效果最好,粒子群提前收敛是在太讨厌,遗传算法表现也一般。

  P=NP和P!=NP的情况下,P、NP、NPC、NPH的关系不太一样,这是题外话。

  二、不可形式化的问题

  可形式化的问题是完全理性的,虽然解决的时候启发式算法里可能引入了少许”感性"的成分。而不可形式化的问题已经不在数学的范畴之内了,也就是说,连问题本身都是充满着“感性”成分的。

  很典型的就是我们的图像、声音这样的问题,这就是带有着很强的感性成分,完全不知道该如何形式化的问题。

  图像处理的解决一般分为两类方法:一类是基于数字信号处理基础的手段,非常推荐Gonzalez的《数字图像处理》,这是图像处理的经典教材;另外一类是人工智能手段,一般用于识别,目前比较好的手段是卷积神经网络,前面的卷积层提取特征也可称为降维手段。当然,这两类手段并非孤立的,人工智能手段往往都是在传统的信号处理基础上来的,对于特殊的图形的神经网络识别也一样可以使用传统图像处理手段作为特征输入。

  而声音的处理则一般是直接在频域上进行处理,只是一般基于传统频谱的改造,更适合于声音处理的倒谱(cepstrum),这是把采样值进行傅里叶变换后的结果取对数再进行傅里叶变换得到的谱。把声音的频谱搬移并恢复并不是太难,所以男声变女声也不是很困难的事情,所以接电话遇到陌生人通知你什么什么的时候千万要小心,这个真还未必是他原本的声音。我堂弟的公司的会计就曾经接到过董事长叫她赶快汇巨款(真的很巨)的电话,电话号码、声音全都对,她在准备汇款前一分钟突然想打个电话再确认确认,这才知道是诈骗电话,江湖险恶啊。当然,人工智能就更会有啊,深度学习识别语音现在很流行很流行。识别一定范围内的自然语言已经很OK了,这个技术我想未来也会伴随着智能家居一起爆发吧,话说我真的是一直看好智能家居啊,只是不知道什么时候会爆发。

  不可形式化的问题里可能伴随着大量的开放性问题,规则不准确,而且在不断变化中,甚至没有规则可言?!这些是未来人工智能努力的方向,我还是希望人类可以把握住尺度。

   当然,不是只有图像、声音,天下的事物很多,比如计算机如何辅导学生以期待获得更好的学习成果,这些问题往往都适合于人工智能的手段。智能家居如何让人更加舒适,这当然也应该是AI的天下,只是,智能家居目前要解决的问题很多,比如,进展极其缓慢的物联网便是一个重要因素。

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

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

相关文章

AI Image Codec技术落地实践

AI Codec自2016年首次提出以来,众多海内外高校、企业研究院等机构对此展开了广泛研究。6年时间里,AI Codec 的SOTA方案的压缩性能已经超越了H.266(最新的传统Codec标准),展现了强大的技术潜力。但受限于计算复杂度、非标等原因,AI…

Vue中的JSX的特性

JSX简介 JSX是一种Javascript的语法扩展&#xff0c;即具备了Javascript的全部功能&#xff0c;同时又兼具html的语义化和直观性。它可以让我们在JS中写模板语法&#xff1a; const el <div>Vue 2</div>; 复制代码上面这段代码既不是 HTML 也不是字符串&#xf…

java阿里云sls基于LoghubAppender自定义日志上传

1、背景&#xff1a;阿里sls日志提供快捷日志平台&#xff0c;平替elk公司使用这个日志服务&#xff0c;需要对接写入日志 目前日志集成有3种 1&#xff09;基于封装manager手动写日志手动send 弊端&#xff1a;本地日志和阿里云日志共用日志代码很臃肿 2&#xff09;基于云服…

开启数字时代,分享电脑监控和录制工具

近年来&#xff0c;随着网络技术的快速发展和普及&#xff0c;电脑屏幕录制和监控越来越成为企业、学校、家庭等不可或缺的工具。无论是在线教学、远程工作&#xff0c;还是家长对孩子上网行为的关注&#xff0c;电脑屏幕录制和监控都具有极大的帮助和重要性。今天就给大家推荐…

【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 1. 获取串口名字1.1 文件 GUI.ui1.2 文件 GUI.h1.3 文件 GUI.cpp 2. 配置串口连接2.1 文件 GUI.ui2.2 文件 GUI.h2.3 文件 GUI.cpp 3. 配置串口连接…

chatgpt赋能python:Python排错大全:10年经验总结,快速定位并解决问题!

Python排错大全&#xff1a;10年经验总结&#xff0c;快速定位并解决问题&#xff01; 作为一名有着10年Python编程经验的工程师&#xff0c;在这篇文章中&#xff0c;我将详细介绍常见的Python排错技巧&#xff0c;以及我在实际工作中使用的一些技巧和最佳实践。我们将学习如…

《网络安全0-100》安全策略制定

安全策略制定 安全策略制定是指制定一系列的规范、标准和 流程&#xff0c;以保护企业或组织的信息资源和业务活 动&#xff0c;确保其安全性和可靠性。安全策略制定通 常包括以下几个步骤&#xff1a; 风险评估&#xff1a;对企业或组织的信息系统进行全面 评估&#xff…

Electron 和 Angular 项目升级

Electron 和 Angular 项目升级: Angular4Electron1.7.8 升级到 Angular13Electron2 原项目 Angular 和 Electron 版本: angular/cli: 1.4.9angular/core: 4.4.6Electron: 1.7.8 升级后 Angular 和 Electron 版本: Angular: 13.3.1Electron: 21.2.1 流程: angular-electro…

一次服务器被入侵的处理过程分享

一、服务器入侵现象 近期有一个朋友的服务器(自己做了网站)好像遭遇了入侵&#xff0c;具体现象是&#xff1a; 服务器 CPU 资源长期 100%&#xff0c;负载较高。 服务器上面的服务不能正常提供服务。 ​ 朋友处理了一会没有解决&#xff0c;我开始想说我不是搞安全的&#xf…

【Visual Studio】报错 LNK2019,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 问题解决方案Ref. 问题 使用 C 语言&#xff0c;配合 Qt 开发串口通信界面时&#xff0c;报错代码 LNK2019。 复制以下错误信息&#xff0c;方便别…

15、SQL注入之Oracel,MongoDB等注入

这里写目录标题 引言补充上篇文章Json注入案例分析 简要学习各种数据库的注入特点Access数据库Mssql数据库PostgreSQL数据库Oracle数据库MongoDB数据库 简要学习各种注入工具的使用指南 引言 mysql的注入方法跟其它的数据库注入方法是差不多的&#xff0c;是可以举一反三的&am…

【Pandas】pandas用法解析(下)

一、生成数据表 二、数据表信息查看 三、数据表清洗 四、数据预处理 ———————————————— 目录 五、数据提取 1.按索引提取单行的数值 2.按索引提取区域行数值 3.重设索引 4.设置日期为索引 5.提取4日之前的所有数据 6.使用iloc按位置区域提取数据 7…

elasticsearch8.5.2 报错(SearchPhaseExecutionException: all shards failed)

一、问题 logstash突然无法对elasticsearch服务进行读写操作了&#xff0c;提示elasticsearch的地址有问题&#xff0c;检测elasticsearch发现端口存在。查看日志发现有报错。 二、问题原因 有一些索引的数据损坏了 三、解决 官网文档&#xff1a;https://www.elastic.co/…

记录HBuilderX将uniapp项目运行到华为手机

解压并运行刚从官网下载的HBuilder X&#xff0c;新建一个项目 一、电脑下载【华为手机助手】并安装 下载地址&#xff1a; https://consumer.huawei.com/cn/support/hisuite/ 二、华为手机设置 1、手机准备&#xff1a;华为&#xff08;没有插入手机卡&#xff09;&#x…

《网络安全》0-100 零基础

网络安全基础 什么是网络安全 网络安全是指保护计算机网络不受未经授权的攻击、损伤、窃取或破坏的一系列措施。它包括保护计算机系统、网络和数据的完整性、可用性和保密性&#xff0c;以及防止未经授权的访问、使用、披露、破坏、修改、记录或丢失数据。 网络安全是保护信息…

探秘华为交换机:端口类型全解析

在下列情况下&#xff0c;判断的一般方法是什么&#xff1f; 1.交换机某个端口下的用户丢包。 2.交换机下的所有用户都在丢失数据包。 3、用户反映网速缓慢 检查网络电缆&#xff0c;重做水晶头&#xff0c;检查用户的计算机网卡&#xff0c;并重新启动交换机。 这几种做法都能…

在 PyTorch 中实现可解释的神经网络模型

动动发财的小手&#xff0c;点个赞吧&#xff01; 目的 深度学习系统缺乏可解释性对建立人类信任构成了重大挑战。这些模型的复杂性使人类几乎不可能理解其决策背后的根本原因。 ❝ 深度学习系统缺乏可解释性阻碍了人类的信任。 ❞ 为了解决这个问题&#xff0c;研究人员一直在…

chatgpt赋能python:Python中算法的几种描述方法

Python中算法的几种描述方法 在Python中&#xff0c;我们可以采用不同的方法来描述和实现不同的算法。本文将介绍三种常见的描述算法的方法&#xff0c;希望能够帮助读者更好地理解算法和Python编程。 方法一&#xff1a;自然语言描述 自然语言是我们最熟悉的方式来描述算法…

三层交换器与可配置的二层交换机通信配置(华为交换机)

#三层交换器与可配置的二层交换机通信配置 三层交换机配置 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #启动DHCP功能 [Huawei]dhcp enable #创建vlan 10 并配置 vlanif 地址 作为二层交换机默认网关 [Huawei]vlan 10 …

nodejs高版本降为低版本的详细解决方案

部分老旧项目需要使用低版本的node,网上很多是无效的,高版本无法直接安装低版本node,但是低版本nodejs可以安装部分高版本node,从而达到升级效果,下面这篇文章主要给大家介绍了关于nodejs高版本降为低版本的详细解决方案,需要的朋友可以参考下 1.首先通过控制面板应用卸载当前环…