如何设计算法?常见的算法范式介绍

如何设计算法?常见的算法范式介绍

如何设计算法?下面本篇文章给大家分析一下常见的算法范式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

首先明确三个概念:

算法: 按步骤解决问题的过程。

范式: 思考问题的模式。

算法范式: 为问题构建高效解决方案的常规方法。

本文讨论一些常用的算法范式,例如

分治算法动态规划贪婪算法回溯算法

分治法

在排序算法中,合并和快速排序这两种算法的共同点就是分而治之的算法。

分而治之是一种常见的算法设计,它的思路是把问题分解为与原始问题相似的较小子问题。通常以递归方式解决子问题,并结合子问题的解决方案来解决原始问题。

分治法的逻辑可以分为三个步骤:

将原始问题划分为较小的子问题。通过递归解决子问题,解决完毕之后返回子问题的解决方案。将子问题的解决方案合并为原始问题的解决方案。

分治法的例子:二叉搜索

下面是用分治实现的二叉搜索。

function binarySearchRecursive(array, value, low, high) {    if (low  value) {            return binarySearchRecursive(array, value, low, mid - 1);        } else {            return mid;        }    }    return null;}export function binarySearch(array, value) {    const sortedArray = quickSort(array);    const low = 0;    const high = sortedArray.length - 1;    return binarySearchRecursive(array, value, low, high);}

登录后复制

请注意,上面的 binarySearch 函数是供他人调用的,而 binarySearchRecursive 是实现分治法的地方。

动态规划法

动态规划是一种优化技术,用于通过把复杂问题分解为较小的子问题来解决。看上去很像是分治法,但动态规划不是把问题分解为独立的子问题然后再组合在一起,而是只把问题分解为独立的子问题。

算法逻辑分为三个步骤:

定义子问题。重复解决子问题。识别并解决基本问题。

动态规划案例:最小硬币找零问题

这是一个名为为硬币找零问题的常见面试题。硬币找零问题是给定找零的金额,找出可以用多少特定数量的硬币来找零的方式。最小硬币找零问题只是找到使用给定面额的钱所需的最少硬币数量。例如,如果需要找零 3 毛 7 分,则可以使用 1 个 2 分,1个 5 分,1 个 1 毛钱和1个 2 毛钱。

function minCoinChange(coins, amount) {    const cache = [];    const makeChange = (value) => {        if (!value) {            return [];        }        if (cache[value]) {            return cache[value];        }        let min = [];        let newMin;        let newAmount;        for (let i = 0; i = 0) {                newMin = makeChange(newAmount);            }            if (newAmount >= 0 &&             (newMin.length 

在上面的代码中,参数 coins 表示面额(在人民币中为 [1, 2, 5, 10, 20, 50])。为了防止重复计算,用到了一个 cache 。 makeChange 函数是递归实现的,它是一个内部函数,可以访问 cache。

console.log(minCoinChange([1, 2, 5 10, 20], 37)); // => [2, 5, 10, 20]console.log(minCoinChange([1, 3, 4], 6)) // => [3, 3]

登录后复制

贪心算法

贪心算法与当前的最优解决方案相关,并试图找到一个全局的最佳方案。与动态规划不同,它不考虑全局。贪心算法倾向于简单直观,但可能不是整体最优的解决方案。

贪心算法案例:最小硬币找零问题

上面用动态规划解决的硬币问题也可以用贪心算法解决。这个解决方案的是否能得到最优解取决于所采用的面额。

function minCoinChange(coins, amount) {    const change = [];    let total = 0;    for (let i = coins.length; i>= 0; i--) {        const coin = coins[i];        while (total + coin 

可以看到,贪心算法比动态规划的方案要简单得多。下面看一下同样的求解案例,来了解两者之间的区别:

console.log(minCoinChange([1, 2, 5 10, 20], 37)); // => [2, 5, 10, 20]console.log(minCoinChange([1, 3, 4], 6)) // => [4, 1, 1]

登录后复制

贪心算法给出了第一个问题的最优解,但第二个并不是最优解(应该是 [3,3])。

贪心算法比动态规划算法要简单而且更快,但是得到的有可能不是最优解。

回溯算法

回溯算法非常适合逐步查找和构建解决方案。

尝试以一种方式解决问题。如果它不起作用,就回溯并重复步骤 1,直到找到合适的解决方案为止。

对于回溯算法,我会另写一篇文章来介绍更复杂的算法。究竟写什么我还没想好,也许是写一个对数独求解的程序,如果你对这个感兴趣,请关注我的公众号!

算法是永无止境的,希望本文能帮你了解一些常见的算法范式。

相关免费学习推荐:js视频教程

以上就是如何设计算法?常见的算法范式介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2725126.html

(0)
上一篇 2025年3月7日 23:20:24
下一篇 2025年2月18日 06:28:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 你需要知道的关于javascript计时器的所有内容

    先从一个面试题开始: JavaScript 面试题:setTimeout 和 setInterval 的源代码是在哪里实现的? (不能百度和谷歌 ) 在继续往下看之前,请先在你的头脑中回答问题 你的答案可能会是 V8(或其他VM),但很遗憾…

    2025年3月7日
    200
  • Node.js 15正式版发布,将替代Node.js 14成为当前的的稳定发行版

    前两天,Node.js官方发布了Node.js 15的正式版本,Node.js 15 将替代 Node.js 14 成为当前的的稳定发行版,后者将在本月晚些时候升级为 LTS(长期支持)版本。如果大家想体验下Node.js 15 的最新功能…

    2025年3月7日
    200
  • js数组怎么去重?

    js数组去重方法:1、使用ES6的Set对象去重;2、利用for嵌套for,然后splice去重;3、利用indexOf去重;4、利用对象的属性不能相同的特点进行去重;5、利用Map数据结构去重;6、利用reduce+includes去重。…

    2025年3月7日
    200
  • js数组去重方法的总结

    js数组去重的方法:1、利用ES6 Set去重;2、利用for嵌套for,然后splice去重;3、利用indexOf去重;4、利用sort()去重;5、利用对象的属性不能相同的特点进行去重等等。 推荐:《js视频教程》 数组去重,一般都是…

    2025年3月7日
    200
  • JavaScript 中判断变量是否为数字

    今天javascript栏目如何判断变量是否为数字。 大家都说简历没项目写,我就帮大家找了一个项目。 简介 JavaScript 是一种动态类型语言,这意味着解释器在运行时确定变量的类型。实际上,这也允许我们在相同的代码中使用相同的变量来存…

    2025年3月7日
    200
  • 一些你可能不知道却有用的 Node.js 包

    本篇文章给大家推荐一些你可能不知道的,小众却有用的 node.js 包。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 视频教程推荐:nodejs 教程 yargs yargs 是一个用来处理命令行参数的包,可以帮你处理自…

    2025年3月7日
    200
  • 详解JS中的JSON和JSONP

    简单地使用json并不能支持跨域资源请求,为了解决这个问题,需要采用jsonp数据交互协议。众所周知,js文件的调用不受跨域与否的限制,因此如果想通过纯web端跨域访问数据,只能在远程服务器上设法将json数据封装进js格式的文件中,供客户…

    2025年3月7日
    200
  • 详解构建可运行的JavaScript规范的方法

    编程不仅仅是给计算机下达如何完成一项任务的指令,它还包括以一种精确的方式与他人交流思想,甚至是与未来的自己。这样的交流可以有多个目标,也许是为了共享信息,或者只是为了更容易地修改—如果你不理解或不记得很久以前做过什么,那么就很难修改。 当我…

    2025年3月7日
    200
  • 十五条 JavaScript 编程技巧

    .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markd…

    2025年3月7日 编程技术
    200
  • 分享5个JS函数的高级技巧

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。函数对任何一门语言来说都是一个核心的概念,在javascript中更是如此。本文将深入介绍函数的5个高级技巧。 作用域安全的构造函数 构造函数其实就是一个使用new操作符调用的函数…

    2025年3月7日
    200

发表回复

登录后才能评论