❀My学习小记录之算法❀

目录

算法:)

一、定义

二、特征

三、基本要素

常用设计模式

常用实现方法

四、形式化算法

五、复杂度

时间复杂度

空间复杂度

六、非确定性多项式时间(NP)

七、实现

八、示例

求最大值算法

求最大公约数算法

九、分类


算法:)

一、定义

算法(algorithm),在数学(算学)计算机科学之中,为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。

算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。

形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效可计算性或者有效方法中成形。这些尝试包括库尔特·哥德尔、雅克·埃尔布朗和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年埃米尔·莱昂·珀斯特的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。

二、特征

以下是高德纳在他的著作《计算机程序设计艺术》里对算法的特征归纳:

输入:一个算法必须有零个或以上输入量

输出:一个算法应有一个或以上输出量,输出量是算法计算的结果

明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地符合要求或期望,通常要求实际运行结果是确定的。

有限性:依据图灵的定义,一个算法是能够被任何图灵完全系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务。

有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。

三、基本要素

算法的核心创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。

常用设计模式

完全遍历法和不完全遍历法:在问题的解是有限离散解空间,且可以验证正确性和最优性时,最简单的算法就是把解空间的所有元素完全遍历一遍,逐个检测元素是否是我们要的解。这是最直接的算法,实现往往最简单。但是当解空间特别庞大时,这种算法很可能导致工程上无法承受的计算量。这时候可以利用不完全遍历方法——例如各种搜索法和规划法——来减少计算量。

分治法:把一个问题分割成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。

动态规划:当问题的整体最优解就是由局部最优解组成的时候,经常采用的一种方法。

贪心算法:常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。

线性规划法:见条目。

简并法:把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。

常用实现方法

递归方法迭代方法

顺序计算并行计算分布式计算:顺序计算就是把形式化算法用编程语言进行单线程序列化后执行。

确定性算法非确定性算法

精确求解近似求解

四、形式化算法

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。

五、复杂度

时间复杂度

算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做T\left ( n \right )=O\left ( f\left ( n \right ) \right )

算法执行时间的增长率f(n)的增长率正相关,称作渐近时间复杂度,简称时间复杂度

常见的时间复杂度有:常数阶O(1),对数阶,线性阶 O(n),线性对数阶,平方阶,立方阶,...,k次方阶,指数阶。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低 。

空间复杂度

算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

六、非确定性多项式时间(NP)

主条目:NP (复杂度)

七、实现

算法不单单可以用计算机程序来实现,也可以在人工神经网络、电路或者机械设备上实现。

八、示例

求最大值算法

这是算法的一个简单的例子。

我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小,可以将下面的算法形象地称为“捡豆子”:

①首先将第一颗豆子放入口袋中。

②从第二颗豆子开始检查,如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先口袋中的豆子。反之则继续下一颗豆子。直到最后一颗豆子。

③最后口袋中的豆子就是所有的豆子中最大的一颗。

以上算法在中国大陆的教科书中通常被叫做“打擂法”或者“循环打擂”:在一个for循环中,每轮循环都有新的挑战者。若挑战者胜的话,挑战者做新擂主,否则擂主卫冕。for循环结束后输出最后的擂主。

下面是一个形式算法,用ANSI C代码表示

int max(int *array, int size)
{  int mval = *array;  int i;  for (i = 1; i < size; i++)if (array[i] > mval)          mval = array[i];  return mval;
}

求最大公约数算法

求两个自然数的最大公约数设两个变量{\displaystyle M}和{\displaystyle N}

①如果{\displaystyle M<N},则交换{\displaystyle M}和{\displaystyle N}

②{\displaystyle M}被{\displaystyle N}除,得到余数{\displaystyle R}

③判断{\displaystyle R=0},正确则{\displaystyle N}即为“最大公约数”,否则下一步

④将{\displaystyle N}赋值给{\displaystyle M},将{\displaystyle R}赋值给{\displaystyle N},重做第一步。

用ANSI C代码表示

//交换2数
void swapi(int *x, int *y)
{  int tmp = *x;  *x = *y;  *y = tmp;
}int gcd(int m, int n)
{  int r;  do  {    if (m < n)swapi(&m, &n);        r = m % n;        m = n;    n = r;  } while (r);  return m;
}

利用if函数以及递归则能做出更为精简的代码,更可省去交换的麻烦。(但是也因为递归调用,其空间复杂度提高)

int gcd(int a,int b)
{    if(a%b)        return gcd(b,a%b);    return b;
}

九、分类

本文学习来源:algorithm(计算机术语)_百度百科

  • 基本算法

    • 深度优先搜索

    • 广度优先搜索

    • 启发式搜索

    • 遗传算法

    • 枚举

    • 搜索

  • 数据结构的算法

  • 数论与代数算法

  • 计算几何的算法

    • 凸包算法

  • 图论的算法

    • 哈夫曼编码

    • 树的遍历

    • 最短路径算法

    • 最小生成树算法

    • 最小树形图

    • 网络流算法

    • 匹配算法

    • 分团问题

  • 动态规划

  • 其他

    • 数值分析

    • 加密算法

    • 排序算法

    • 检索算法

    • 随机化算法

    • 关于并行算法,请参阅并行计算一文。

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

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

相关文章

【揭秘】Maven聚合与继承:如何轻松实现项目依赖管理?

Maven的聚合和继承是Java开发中重要的概念。聚合允许将多个项目组合成一个构建单元&#xff0c;简化多模块项目的构建过程&#xff0c;提高构建效率。继承则让子项目重用父项目的配置和属性&#xff0c;避免了重复定义&#xff0c;增强了项目的一致性和可维护性。通过聚合和继承…

vue3+luckyexcel+php在线编辑excel文件

开发过程中&#xff0c;需要开发一个在线编辑excel文档的功能&#xff0c;找到了这个合适的组件 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 可以导入文档&#xff0c;预览、编辑、保存、导出等功能&#xff0c;可以满…

实战 | 使用OpenCV快速去除文档中的表格线条(步骤 + 源码)

导 读 本文主要介绍如何使用OpenCV快速去除文档中的表格线条,并给详细步骤和代码。 背景介绍 测试图如下,目标是去除下面三张图中的表格线条,方便后续图像处理。 实现步骤 下面演示详细步骤,以图1为例: 【1】获取二值图像:加载图像、转为灰度图、OTSU二值化 i…

echarts 柱状图

记录echarts 柱状图基础案例以及相关配置。 1.基础柱状图 const myChart this.$echarts.init(this.$refs.echartsZx);const option {title: {text: 本周考试记录},//提示框tooltip: {trigger: axis,axisPointer: {type: shadow}},xAxis: {type: category,data: [Mon, Tue, W…

IDEA、VSCode等快速连接Github(Mac版)

问题描述 在本地书写✍️完代码后, 想要git push到Github上面, 出现延迟错误; 导致经常push不上去, 如下图所示; 解决方案 进入电脑终端; 输入下列命令; sudo vim /etc/hosts输入密码; 按下 I 键, 进行编辑操作; 将下列语句复制到空白区, 然后按下esc按键, 然后输入:wq即可…

Qt Creator可视化交互界面exe快速入门4

上一期介绍了信号与槽&#xff0c;本期介绍加法计算器 我们来新建一个项目 然后拖动设置按钮 还需要个输出框 这里拖动Line Edit 我这里只是简单演示一下&#xff0c;做个低配版计算器&#xff0c;再加个加号和一个等于号就结束了。 然后回到代码编辑部分&#xff0c;我们需要…

mysql8 linux安装过程(通用版)

下载&#xff1a;通用版&#xff0c;建议用tar.gz包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 注意选项&#xff1a;选linux-Generic以及架构和位数 Operating System:Linux-Generic; OS Version:Linux-Generic(glibc 2.28)(x86,64-bit) 安装过…

制作gif动图软件,视频转gif动图生成器

生活在这个快节奏的时代&#xff0c;我们总是希望能够抓住那些转瞬即逝的美好。而gif动图&#xff0c;正是这样一种能够让时间静止、让美好定格的存在。从视频到gif动图&#xff0c;不仅仅是格式的转换&#xff0c;更是情感的传递与分享。 所需工具&#xff1a; 一个【媒体梦…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

哪种猫粮比较好?怎样囤性价比高的主食冻干品牌 ?

在过去的100多年里&#xff0c;猫咪主食市场一直被膨化猫粮主导。然而&#xff0c;随着猫咪频频出现猝死、失明、发育不良以及营养不良等问题&#xff0c;猫主人们开始质疑膨化粮是否最适合猫咪。于是&#xff0c;从上世纪90年代开始&#xff0c;出现了生骨肉喂养。生骨肉确实是…

腾讯云轻量应用服务器和云服务器性能一样吗?安全吗?

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

Redis 核心知识总结

Redis 核心知识总结 认识 Redis 什么是 Redis&#xff1f; Redis 是一个由 C 语言开发并且基于内存的键值型数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 有以下几个特…