趣学算法14天阅读|Day2

news2024/11/20 11:19:23

14天阅读挑战赛

文章目录

  • 前言
  • 什么是算法?
  • 算法复杂度
  • 如何评定好算法
  • 案例
    • 案例一:棋盘的麦子
    • 案例二:兔子数列
  • 总结


前言

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端中级工程师
🔥 三连支持:如果此文还不错的话,还请 ❤️关注、👍点赞、👉收藏三连,支持一下博主~

前一篇主要介绍了为啥学习算法,算法工程师的招聘要求,以及如何学习算法、面试算法以及面试前如何刷题等。这一篇我们开始真正的算法之旅。

什么是算法?

要想了解算法,首先得知道什么是程序。

在广泛的意义上面来讲,程序是指事物发展的既有次序和脉络以及方式、方法。从计算机编码语言上来讲,程序是数字计算机的编码指令的次序。而在广泛意义上的方式方法,则可以专业性的称之为算法。那么具体怎么描述算法呢?借用百度百科的一段话,“算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制”。这样一来,是不是同我们所描述的有次序的脉络以及方式方法所吻合?

著名的瑞士计算机科学家尼古拉斯·沃斯(Niklaus Wirth)在计算机领域有一句名言:“算法 + 数据结构 = 程序”(Algorithm+Data Structures=Programs)。数据结构是程序的骨架,而算法则是程序血肉,是灵魂。
算法的特点
如何判断一段计算机指令或程序是否是一个算法,我们可以从下面几个特点来判断:

  • 有穷性:可以穷举,有终点或者结束点
  • 确切性:每一个步骤都有明确的定义
  • 输入性:有条件(包含0到∞个参数)
  • 输出项:有结果,有结论,没有输出则没有意义
  • 可行性:可以分解为最基础的单元来进行步骤的操作,每个步骤都有时间周期

算法复杂度

在没有学习计算机技术之前,我们应该对复杂度并不是很陌生,因为这是统计学的一个概念,我们接触最多的莫过于样本复杂度这个概念,这些都是在统计抽样、概率选取、概率评价等等一系列从高中就开始接触,到大学深入了解的知识。那么算法复杂度又是什么呢?

算法复杂度是指算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。当了解这个之后,我们可以深入理解下,什么是时间复杂度、空间复杂度和复杂度分析等一些更深层次的概念。实际应用中,通常使用时问复杂度渐近上界 𝑂(f(0))来表示时间复杂度。

  • 时间复杂度:从算法开始运行到算法执行结束所需要的时间
  • 空间复杂度:执行算法所需空间大小,运行过程中占用多少存储空间

具体到示例可以参考陈老师在书中的案例。首先给我们讲述了一个故事——一盘棋的麦子,然后引出来“爆炸增量函数”。常见的时间复杂度有以下几类:
➊常数:𝑇(𝑛) = 𝑂(c),其中c是常数。例如运行5次、20次。常数阶算法的时间复杂度通常用𝑂(1)来表示。
➋多项式:比较常用的算法。通常用𝑂(𝑛)、𝑂(𝑛²)、𝑂(𝑛³)等表示。
➌指数:运行效率最差。通常用用𝑂(3ⁿ)、𝑂(𝑛!)、𝑂(𝑛ⁿ)等表示。
➍对数⚠️:𝑇(𝑛) =𝑂((log𝑛)^k),运行效率最高。通常用用𝑂(log𝑛)、𝑂(𝑛logⁿ)「线性对数时间」等表示。

注意⚠️:1、MacOS中,如果想要打印出来这个上角标,这里有一个方法。首先打开“显示字符和表情”找到拉丁文,在基本拉丁字符中找到N(任意的N都可以),在最右侧找到相关字符,其中就有小角标。
在这里插入图片描述

2、我们在代数运算中,将对数函数分为三类:常用对数函数(10)、自然对数函数(e)、其他对数函数,而在算法导论中lgN默认都是以2为底,这个需要留意。

如何评定好算法

算法既然有那么多的概念以及那么多的种类,一千个读者就有一千个哈姆雷特,是不是都可以称之为算法,是不是都是好算法?
带着这个问题,看了下书籍的1.2章节,你会有比较好的答案。好算法只是一个相对概念,可以评定好算法的界限可以参考以下几点:

  • 正确
  • 易读
  • 健壮
  • 高效
  • 低存储

那么,如何知道算法是否好呢,根据「陈老师」罗列的他们之间的关系:

𝑂(1) < 𝑂(log𝑛) < 𝑂(𝑛) < 𝑂(𝑛log𝑛) < 𝑂(𝑛²)< 𝑂(𝑛³) < 𝑂(2ⁿ) < 𝑂(𝑛!) < 𝑂(𝑛ⁿ)

指数阶增量随着x的增加而急剧增加,而对数阶增长缓慢。

案例

案例一:棋盘的麦子

这个故事背后的指数爆炸也是当今经常困扰人们的问题,人们更期望解决问题的代价是随着问题规模赠大而以一种近似多项式形式增长而非指数增长的规模。

案例二:兔子数列

数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。斐波那契数列(Fibonacci sequence),又称黄金分割数列。
在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

「Java实现」

//①==================================
/**
* 平推方法实现
*/
public static long fibLoop(int num) {
    if(num < 1 || num > 92)
    return 0;
long a = 1;
long b = 1;
long temp;
for(int i = 2; i < num; i++) {
    temp = a;
    a = b;
    b += temp;
}
return b;
}

//②==================================
/**
* 递归方法实现
* f(n) = f(n - 1) + f(n - 2)
* 最高支持 n = 92 ,否则超出 Long.MAX_VALUE
* @param num n 
* @return f(n) 
*/
public static long fibRec(int num) {
    if(num < 1)
    return 0;
if(num < 3)
    return 1;
return fibRec(num - 1) + fibRec(num - 2);
}

//③==================================
static long[] l = new long[93];
static {
    l[1] = 1;
}
/**
* 带有缓存的方法,比fibRec方法性能好很多
*/
public static long fibBuffRec(int num) {
    if(num < 1 || num > 92)
    return 0;
if(l[num] == 0)
    l[num] = fibBuffRec(num - 1) + fibBuffRec(num - 2);
return l[num];
}

//④==================================
static List<BigDecimal> list = new ArrayList<BigDecimal>(93);
static {
    list.add(BigDecimal.ZERO);
    list.add(BigDecimal.ONE);
}
/**
* 1,2,3,4,5,6, 7 ,8 
* 1,1,2,3,5,8,13,21
* 支持num超过92的超大型数字,使用了ArrayList进行缓存以提高性能
*/
public static BigDecimal fibBig(int num) {
    if(num < 0)
    return list.get(0);
if (list.size() <= num)
    list.add(fibBig(num - 1).add(fibBig(num - 2)));
return list.get(num);
}

总结

非常感谢陈老师,让一个小白了解到很多算法方面的知识。

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

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

相关文章

@AutoConfigurationPackage注解详解

AutoConfigurationPackage是在springboot启动类注解SpringBootApplication下的EnableAutoConfiguration下。AutoConfigurationPackage作用是指定springboot扫描包&#xff0c;默认就是扫描启动类同包下的类。可以通过AutoConfigurationPackage来附加其他路径&#xff0c;然后sp…

asp.net园林绿化服务交易网站

本设计的目的是通过对园林绿化的初步了解&#xff0c;在巩固网站设计所学知识的基础上。运用于实践&#xff0c;在实践中强化理论知识&#xff0c;做到理论联系实践。在设计中学会搜集资料地方法&#xff0c;学会查阅设计规程。掌握设计步骤&#xff0c;同时培养创新能力&#…

【图像评价】基于matlab GUI图像评价系统【含Matlab源码 2185期】

一、图像质量评价 图像质量评价对图像处理算法的可行性分析以及某类算法达成效果的比较都起着非常重要的指导作用。随着图像处理技术的发展&#xff0c;对于图像质量评价的研究也日益深入&#xff0c;新的评价指标和评价算法不断涌现&#xff0c;共同推动了图像质量评价的进步…

【模型训练】YOLOv7旋翼无人机检测

YOLOv7旋翼无人机检测 1、YOLOv7算法旋翼无人机检测模型训练2、YOLOv7模型模型评估3、模型和数据集下载1、本项目采用YOLOv7算法实现对空中旋翼无人机的检测,在一万多张旋翼无人机检测数据集中训练得到,我们训练了YOLOv7模型,经评估我们得出了各个模型的评价指标; 2、目标类…

研发效能工程实践开篇

背景 随着技术的发展&#xff0c;大至一线互联网公司、小至几十人研发团队的公司都开始开展devops运动。大公司有能力自研&#xff0c;小公司则采用开源解决方案。如何实施devops业界已经有非常成熟的方案&#xff0c;所以本系列不再谈devops工具链以及如何实施。本系列想谈谈…

初识C++ - 类与对象(中篇·下半)

目录 赋值运算符重载 以下是一个日期类的运算符重载的案例(重点) 关于流插入与流提取的使用 方法一&#xff1a;定义与声明分离 方法二&#xff1a;使用内联函数 const成员 概念 关于上述日期类代码为什么需要在函数后面加入const 取地址及const取地址操作符重载 …

5G核心网技术基础自学系列 | 网络切片

书籍来源&#xff1a;《5G核心网 赋能数字化时代》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G核心网技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 支持网络切片是设计5G架构的主要驱…

【牛客刷题--SQL篇】必会的常用函数之条件函数SQL26计算25岁以上和以下的用户数量(多种写法)

&#x1f496;个人主页&#xff1a;与自己作战 &#x1f4af;作者简介&#xff1a;CSDN博客专家、CSDN大数据领域优质创作者、CSDN内容合伙人、阿里云专家博主 &#x1f49e;牛客刷题系列篇&#xff1a;【SQL篇】】【Python篇】【Java篇】 &#x1f4cc;推荐刷题网站注册地址&a…

基于WEB的二维码生成系统设计与实现(Asp.net)

目 录 1 引言 6 2 二维码的生成原理 6 2.1基础知识 6 2.1.1定位图案 7 2.1.2功能性数据 8 2.1.3数据码和纠错码 8 2.2数据编码 8 2.3结束符和补齐符 9 2.3.1补齐码&#xff08;Padding Bytes&#xff09; 9 2.3.2纠错码 10 2.4最终编码 11 2.4.1穿插放置 11 2.4.2Remainder Bi…

JWT基础概念

1. 介绍 JWT &#xff08;JSON Web Token&#xff09; 是目前最流行的跨域认证解决方案&#xff0c;是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出&#xff0c;JWT 本身也是 Token&#xff0c;一种规范化之后的 JSON 结构的 Token。 JWT 自身包含了身份验证所需要…

【正点原子I.MX6U-MINI应用篇】6、嵌入式Linux在LCD屏幕上显示字符

一、原始方式&#xff1a; 取模显示字符 LCD显示屏是由width * height个像素点构成的&#xff0c;显示字符&#xff0c;一个非常容易想到的方法便是对字符取模&#xff0c;然后在LCD屏上打点显示字符&#xff1b;如果大家以前学习过单片机&#xff0c;想必接触过一些显示屏&am…

三次、五次多项式插值(附代码)

文章目录一、三次多项式插值二、五次多项式插值三、matlab代码三次、五次多项式插值在工程实践中很常见。求解多项式的系数最直接的方法是根据端点处的约束条件&#xff0c;列出线性方程组&#xff0c;再写成矩阵方程AXB&#xff0c;然后用通用的方法(如高斯消元法、LU分解等)解…

二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码

自古逢秋悲寂寥&#xff0c;我言秋日胜春朝 二叉树结构说明 本博客使用树节点结构&#xff0c;如下所示&#xff1a; Kotlin 版本 class TreeNode(var value: String, var leftNode: TreeNode? null, var rightNode: TreeNode? null)Java 版本 class TreeNode(){public…

经典排序之插入排序

目录 直接插入排序&#xff1a; 基本思路 图解过程 代码 复杂度分析 希尔排序 基本思想 图解过程 代码 复杂度分析 总结 参赛话题&#xff1a;学习笔记 直接插入排序&#xff1a; 基本思路 直接插入排序的工作方式像许多人排序一手扑克牌。开始时&#xff0c;我们的左手…

【Netty 从成神到升仙系列 大结局】全网一图流死磕解析 Netty 源码

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;Java领域新星创作者。&#x1f4dd;个人公众号&#xff1a;爱敲代码的小黄&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法&#x…

第八篇 python 面向对象编程

11 面向对象编程 面向对象编程——Object Oriented Programming&#xff0c;简称OOP&#xff0c;是一种程序设计思想。OOP把对象作为程序的基本单元&#xff0c;一个对象包含了数据和操作数据的函数。 面向过程的程序设计把计算机程序视为一系列的命令集合&#xff0c;即一组…

Python攻防-APK批量化Pull与自动化反编译

文章目录前言Pull APK根据包名列表根据手机路径逆向APK自动化反编译findstr检索…总结前言 日常工作过程中&#xff0c;经常会遇到发现新的攻击模式的情况下&#xff0c;需要全量排查手机上所有 APP 的代码是否存在该类代码缺陷。对于复杂的攻击模式而言&#xff0c;往往需要动…

【MyBatis框架】动态SQL

MyBatis之动态SQL 目录MyBatis之动态SQL1. < if > 元素2. < where >3. < choose >,< when >,< otherwise >元素4. < trim >元素5. < set >元素6. < foreach >元素6.1 添加批量数据6.2 批量删除数据7. < SQL >元素8. 小结…

LVS负载均衡群集

企业群集应用 1. 群集的含义 1.1Cluster&#xff0c;群集&#xff0c;集群 2.1由多台主机构成&#xff0c;但对外&#xff0c;只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名或ip地址&#xff09;&#xff0c; 相当于一台大型计算机 2.问题出现 互联网…

Sentinel的学习

1、Sentinel控制台的下载 下载地址&#xff1a;https://github.com/alibaba/Sentinel/releases/tag/1.8.3 2、Sentinel控制台的启动 java -jar sentinel-dashboard-1.8.3.jar3、访问 浏览器输入&#xff1a;localhost:8080 账号密码&#xff1a; sentinel/sentinel 4.sprin…