图码详解算法|理解八大思想,胜刷百道力扣!
文章首发:微信搜索「Kevin的学堂」
零、前言
Hello,我是Kevin,之前和大家刷题打卡了很多天,但是发现效果并不理想,于是我在反思,我知道由于我追求数量导致了文章质量不高,另外我只是分享题解并未让大家理解算法的内涵,授之以鱼,不如授之以渔。 比起分享一道道题解,我想分享核心的算法思想应该更为重要。
所以,我打算写这篇文章带大家学习算法的思想,领悟“接化发“般的精髓,一起修炼内功,做到无招胜有招!
在讲解八大算法思想之前我想先简述以下三个问题,以便大家更好的理解算法。
1. 什么是算法?
《算法导论》中对算法的定义是:算法就是任何良定义的计算过程。
在数学中,算法可以看作是《九章算术》等;
在计算机科学中,算法可以看作是数据传递和处理的顺序、方法和组成方式,如各种排序算法等;
其实从广义上讲,算法还可以体现在很多方面:
在自然中,算法可以看作是太阳东升西落,海水潮汐潮流,月儿阴晴圆缺;
在生活中,算法可以看作是妈妈烹饪红烧鸡翅时出现的食谱,先煎,再炒,再小火收汁等步骤(流口水.gif)。
2. 算法的重要性?
不知道你有没有想过这样一个问题,算法对于个人而言有什么意义吗?有此疑问的推荐小浩的一篇良心文章给你看看。漫画:呕心泣血算法指导篇(真正的干货,怒怼那些说算法没用的人)
这篇文章的重点不是强调算法的重要性,所以我就不多做讲解,可以分享 N.Wirth 教授所说的:程序 = 数据结构 + 算法。
3. 算法怎么学?
这一块其实也可以单独拿出来絮叨一番,这里简单的描述就是理论+实践,理论指算法相关的知识(我其实很少分享这块的知识,因为已经有很多伙伴写了不错的文章,在一个我觉得理论知识还是以书本更为规范),实践则主要指刷题(我想大多数学算法的伙伴是以面试为目的,而面试和考试很像,都需要刷题,而枯燥的刷题一个人往往难以坚持,所以我制定了刷题打卡计划,希望帮助更多小伙伴一起坚持,在我看来养成习惯更为重要)
这篇文章不仅用图文并貌的形式阐述了常用的八大算法思想,每个算法思想我还分别选取了一个经典案例予以代码分析。
本文耗费了我很多心血,希望大家一定要耐心看完(暂时没时间的话记得先「收藏」哦~),如果对大家有帮助恳请「转发」分享给更多朋友,这就是对我原创最大的动力!感谢!
好了,说了这么多,接下来我们进入正题。
一、枚举
首先,最简单的思想,枚举算法。枚举也叫穷举,言下之意便是根据题目的部分条件确定范围,并在次范围内对所有情况逐一穷尽验证,直到找到那个最符合的解。 我们常用的循环遍历,就是用的穷举思想。
枚举算法的思想可以用下图来表示。通过实现事先确定好的「可能解」X
,然后逐一在 f()
计算中进行验证,根据验证结果对「可能解」进行验证。这是一种结果导向型的思想,简单粗暴地试图从最终结果反向分析「可能解」。
枚举算法的劣势也很明显。在实际的运行过程中,能够直接通过枚举方法进行求解的问题少之又少。一方面,当「可能解」的筛选条件不清晰,导致「可能解」的数量和范围无法确定时,枚举就失去了意义。另一方面,枚举发挥不了作用的大部分场景都是由于「可能解」的数量过多,无法在有限空间或有限时间内完成所有可能性的验证。
不过,枚举思想是最接近人类的思维方式,我们在没有更好的思路时先用枚举算法得出解不失为一种方法,其实在判断优化方法的正确性时往往就是先用枚举法暴力求出解在验证测试用例。
另外,想分享一个 Helsgaun 改进 Lin-Kernighan 算法,形成 Lin-Kernighan-Helsgaun 算法(简称 LKH 算法)的故事。
Lin-Kernighan 算法,以及之后的改进算法:Lin-Kernighan-Helsgaun 算法:
这个改进思路其实并不复杂,简单来讲,就是每次针对某一个解,同时考虑变换 10 条边,生成一个更优解。
关键是,10 条边太多了,所以变换 10 条边的方式非常复杂,大概有 148 种可能之多。这些变换方式之间没有明显的规律,至少数学家们没有找到这个规律。也因为如此,没有人知道要如何实现出这个优化。
但是,1998 年,计算机科学家 Keld Helsgaun 给数学界带来了一枚重磅炸弹。他实现了这个改进,完成了 LKH 算法!
LKH 算法的实际性能飞跃,比大多数人预计得都要好得多。但最吸引人好奇心的是,Helsgaun 到底是如何实现的这个优化?
Helsgaun 向研究界公开了他的完整代码,以此揭示他成功的秘诀。答案是:没有秘诀。
他在代码里,完整列出了所有 148 种情形,分别讨论了这些可能性。 他为了写出正确的代码,付出了堪比愚公移山的努力。
《案例》
鸡兔同笼问题
这个问题源于1500年前的《孙子算经》原文如下:
今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?
参考代码:(此文仅用受众较广的 Java 实现,语言可替换,思想最重要!)
图码详解算法|理解八大思想,胜刷百道力扣!相关推荐
- Pytroch nn.Unfold() 与 nn.Fold()图码详解
文章目录 Unfold()与Fold()的用途 nn.Unfold() Unfold()与Fold() 变化模式图解 nn.Fold() 单通道 滑动窗口无重叠 模拟图片数据(b,3,9,9),通道数 ...
- fdct算法 java_ImageSharp源码详解之JPEG压缩原理(3)DCT变换
DCT变换可谓是JPEG编码原理里面数学难度最高的一环,我也是因为DCT变换的算法才对JPEG编码感兴趣(真是不自量力).这一章我就把我对DCT的研究心得体会分享出来,希望各位大神也不吝赐教. 1.离 ...
- 【 反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10)】
反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10) 数学推导 BP算法 BP神经网络可以说机器学习的最基础网络.对于普通的简单 ...
- Tensorflow 2.x源码详解之开宗明义:基本介绍和张量(万文多图)
大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...
- 【5G/4G】加/解密+完整性保护/校验算法源码详解
文章目录 加/解密+完整性保护/校验算法源码详解 一.加解密算法 二.完整性保护/校验算法 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目 ...
- echart关系树状图_echart——关系图graph详解
VueEchart组件见上一篇 export default { data () { const title = { // show: true, //是否显示 text: "画布关系图&q ...
- ❤️导图整理数组6:四数组的四数之和,详解Counter类实现哈希表计数,力扣454❤️
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...
- AidLux“换脸”案例源码详解 (Python)
"换脸"案例源码详解 (Python) faceswap_gui.py用于换脸,可与facemovie_gui.py身体互换源码(上一篇文章)对照观看 打开faceswap_gui ...
- 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】
卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...
最新文章
- Mysql元数据分析
- UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0x8b in position 1: invalid start byte
- WCF(五) 深入理解绑定
- 我们和优秀工程师的差距在哪儿
- 软件系统架构师大概工作过程
- 关于jQuery性能优化
- ASP.NET中使用System.Net.Mail发邮件
- 第九章 CSS-DOM
- Serenity框架官方文档翻译(1-2开始、安装和界面)
- python空间数据处理_基于Python语言的空间数据处理
- python 画折线图怎么控制x轴间隔_用Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围...
- 入过滤(Ingress Filtering)
- JavaScript代码具体是怎么引入到HTML中的?
- Flutter 动画篇
- 外键约束的作用以及如何创建外键约束
- #HHD32F107# SPI通信
- 4G军备竞赛:中兴华为领跑国内 三星独霸一方
- 修改json字符串中某个key对应的value值
- 南昌大学 计算机专业,考研:计算机专业选深圳大学和南昌大学?老师给出一个实用建议...
- Viso制作各种顺序结构流程图(具体步骤含实例)