Javascript常见算法(二)【学习】

动态规划

  • 斐波那契数列

经典的动态规划问题,每个数是前两个数的和。

斐波那契数列(Fibonacci sequence)是一个非常著名的数列,其中每个数是前两个数的和,序列以0和1开始。在JavaScript中,有多种方式可以实现斐波那契数列,下面是一些常见的方法:

方法1:递归

递归是实现斐波那契数列最直接的方式,但它对于较大的数字来说效率很低,因为它会重复计算很多相同的值。

function fibonacciRecursive(n) {  if (n <= 1) return n;  return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);  
}  console.log(fibonacciRecursive(10)); // 输出: 55

方法2:动态规划(使用数组)

为了避免递归中的重复计算,我们可以使用动态规划。这种方法通过存储已经计算过的值来避免重复计算。

function fibonacciDP(n) {  if (n <= 1) return n;  let fibArray = [0, 1];  for (let i = 2; i <= n; i++) {  fibArray[i] = fibArray[i - 1] + fibArray[i - 2];  }  return fibArray[n];  
}  console.log(fibonacciDP(10)); // 输出: 55

方法3:动态规划(不使用额外空间)

如果你想要进一步优化空间使用,可以不使用数组,而只保留前两个值。

function fibonacciIterative(n) {  if (n <= 1) return n;  let a = 0, b = 1, sum;  for (let i = 2; i <= n; i++) {  sum = a + b;  a = b;  b = sum;  }  return b;  
}  console.log(fibonacciIterative(10)); // 输出: 55

方法4:使用生成器

如果你想要一个可以逐个生成斐波那契数列中数字的方法,可以使用生成器。

function* fibonacciGenerator() {  let a = 0, b = 1;  while (true) {  yield a;  [a, b] = [b, a + b];  }  
}  const fibGen = fibonacciGenerator();  
for (let i = 0; i < 10; i++) {  console.log(fibGen.next().value); // 输出斐波那契数列的前10个数字  
}

 

 生成器:JavaScript:4分钟学会生成器函数_哔哩哔哩_bilibili

在JavaScript中,生成器(Generators)是一种特殊的函数,它可以暂停执行和恢复执行,并且可以通过yield关键字返回多次。生成器函数使用function*声明,而不是普通的function声明。生成器非常适合于处理异步操作或需要逐步生成值的场景。

基本用法

生成器函数返回一个迭代器对象,这个对象包含next()return()throw()等方法。调用next()方法会使生成器函数执行到下一个yield表达式,并返回包含valuedone属性的对象。valueyield表达式的结果(如果没有yield表达式,则为undefined),done是一个布尔值,表示生成器是否已经完成执行。

示例

下面是一个简单的生成器函数示例,它逐个生成数字1到3

function* generateNumbers() {  yield 1;  yield 2;  yield 3;  
}  const gen = generateNumbers();  console.log(gen.next()); // { value: 1, done: false }  
console.log(gen.next()); // { value: 2, done: false }  
console.log(gen.next()); // { value: 3, done: false }  
console.log(gen.next()); // { value: undefined, done: true }

异步生成器

从ES2018开始,JavaScript引入了异步生成器(Async Generators),允许生成器处理异步操作。异步生成器函数使用async function*声明,并且可以在yield关键字后面跟上一个Promise。

异步生成器示例

async function* asyncGenerator() {  yield Promise.resolve(1);  yield Promise.resolve(2);  yield Promise.resolve(3);  
}  const asyncGen = asyncGenerator();  async function run() {  for await (const value of asyncGen) {  console.log(value); // 依次打印 1, 2, 3  }  
}  run();

在这个示例中,asyncGenerator是一个异步生成器函数,它逐个yield出解析为数字的Promise。在run函数中,我们使用for await...of循环来遍历这个异步生成器,它能够自动处理每个yield的Promise,并在每个Promise解决后打印其值。 

525c33ceac45499da134f13f3ca2979a.png

d2091f0388f84e498a1154035721ed19.png368c62e555f8411ab243b1a3ae1f38b6.png

2420fa2b687443dcabfc5061e46daa5e.png

 

  • 最长公共子序列(LCS):

寻找两个序列共有的最长子序列的问题。

在JavaScript中,最长公共子序列(Longest Common Subsequence, LCS)是一个在计算机科学中常见的问题。它旨在找到两个序列共有的最长子序列的长度(或具体序列),这里的子序列不需要在原序列中连续出现,但保持相对顺序。

以下是一个用动态规划方法解决LCS问题的JavaScript示例,这个示例将计算并返回两个字符串的最长公共子序列的长度:

function longestCommonSubsequence(str1, str2) {  // 创建一个二维数组来保存子问题的解  // dp[i][j] 表示 str1 的前 i 个字符和 str2 的前 j 个字符的最长公共子序列的长度  const dp = new Array(str1.length + 1).fill(null).map(() => new Array(str2.length + 1).fill(0));  // 填充 dp 数组  for (let i = 1; i <= str1.length; i++) {  for (let j = 1; j <= str2.length; j++) {  if (str1[i - 1] === str2[j - 1]) {  // 如果当前字符相等,则当前位置的最长公共子序列长度等于左上方位置加一  dp[i][j] = dp[i - 1][j - 1] + 1;  } else {  // 如果当前字符不相等,则取左边和上边的最大值  dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);  }  }  }  // dp[str1.length][str2.length] 存储了最长公共子序列的长度  return dp[str1.length][str2.length];  
}  // 示例  
console.log(longestCommonSubsequence("AGGTAB", "GXTXAYB")); // 输出 4,因为最长公共子序列是 "GTAB" 或 "GTAY"

如果你想要获取具体的最长公共子序列(而不仅仅是长度),则需要对上述算法进行一些修改,以追踪构建LCS的字符。这通常涉及到记录如何达到每个dp[i][j]值(例如,通过回溯或使用额外的空间来存储决策)。

以下是一个修改后的版本,用于获取具体的最长公共子序列:

function longestCommonSubsequenceRecursive(str1, str2, i, j, memo = {}) {  if (i === 0 || j === 0) return '';  if (memo[i] && memo[i][j] !== undefined) return memo[i][j];  if (str1[i - 1] === str2[j - 1]) {  memo[i][j] = str1[i - 1] + longestCommonSubsequenceRecursive(str1, str2, i - 1, j - 1, memo);  } else {  const left = longestCommonSubsequenceRecursive(str1, str2, i - 1, j, memo);  const up = longestCommonSubsequenceRecursive(str1, str2, i, j - 1, memo);  if (left.length > up.length) {  memo[i][j] = left;  } else {  memo[i][j] = up;  }  }  return memo[i][j];  
}  function longestCommonSubsequence(str1, str2) {  return longestCommonSubsequenceRecursive(str1, str2, str1.length, str2.length);  
}  // 示例  
console.log(longestCommonSubsequence("AGGTAB", "GXTXAYB")); // 输出 "GTAB" 或 "GTAY"(取决于递归的分支选择)

注意:第二个版本使用了递归和记忆化(memoization)来避免重复计算,这在实际应用中可以显著提高效率,特别是当输入字符串很长时。然而,它使用了额外的空间来存储中间结果。

 

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

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

相关文章

药厂子母钟系统,强抗干扰能力,满足复杂生产环境

在制药行业中&#xff0c;精确的时间同步对于确保药品生产的质量和合规性至关重要。药厂子母钟系统作为一种高度可靠的时间同步解决方案&#xff0c;不仅能够提供准确的时间信息&#xff0c;还具有强大的抗干扰能力&#xff0c;非常适合在复杂的生产环境中使用。本文将详细介绍…

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …

YOLOV8替换Lion优化器

YOLOV8替换Lion优化器 1 优化器介绍博客 参考bilibili讲解视频 论文地址&#xff1a;https://arxiv.org/abs/2302.06675 代码地址&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py """PyTorch implementation of the Lion …

C++初学(11)

不知不觉就第11篇了QWQ 11.1、指针和自由存储空间 之前提到了计算机程序在存储数据时必须跟踪的3个基本属性&#xff1a; &#xff08;1&#xff09;信息存储在何处&#xff1b; &#xff08;2&#xff09;存储的值为多少&#xff1b; &#xff08;3&#xff09;存储的信息…

未授权访问漏洞(非重点 中)

6.Hadoop 1.在 fofa 使用 port"8088" && app"Hadoop" 获取资源 2.打开后若无需登录,则存在漏洞 7.ActiveMQ 1.在 fofa 使用 body"ActiveMQ" && port"8161" 获取资源 2.打开后若点击登录,默认账户密码为 admin/adm…

【css】使用CSS绘制奥运五环--巴黎奥运

使用CSS绘制奥运五环 在2024年巴黎奥运会期间&#xff0c;本文来使用 CSS 来画一个奥运五环。奥运五环由五个相互交叠的圆环组成&#xff0c;分别代表五大洲。 奥运五环是相互连接的&#xff0c;因此在视觉上会产生重叠效果&#xff0c;这也是实现五环最有挑战性的部分 HTML结…

Rabbitmq的死信队列与如何利用死信队列实现延迟队列

如果设置了队列的 TTL 属性&#xff0c;那么一旦消息过期&#xff0c;就会被队列丢弃(如果配置了死信队列被丢到死信队列中)。而如果仅设置消息的 TTL 属性&#xff0c;即使消息过期&#xff0c;也不一定会被马上丢弃&#xff0c;因为消息是否过期是在即将投递到消费者之前判定…

HTML常用标签和CSS的运用

目录 1.HTML标签 1.1 文档结构标签 1.2 文本格式标签 1.3 列表标签 1.4 链接和媒体标签 1.5 表格标签 1.6 表单标签 1.7 分区和布局标签 1.8 元数据标签 2.css样式 2.1 字体样式 2.2 文本样式 2.3 背景样式 2.4 边框样式 2.5 间距样式 2.6 宽度和高度 2.7 显示…

AI算力租赁是什么,哪些行业会有需求?

一、AI算力租赁的定义与概述 AI算力租赁是指基于人工智能&#xff08;AI&#xff09;应用需求&#xff0c;将所需的计算能力&#xff08;即算力&#xff09;通过租赁服务的方式提供给企业和个人用户。这种服务允许用户根据需要租用人工智能计算资源&#xff0c;如图形处理单元…

星座运势网源码/星座屋接口/星座配对网站PHP程序带采集

星座运势网源码/星座屋接口/星座配对网站PHP程序带采集 演示站&#xff1a; https://xz.wengu8.com/ 程序说明&#xff1a; 1、前端模板PC手机端自适应。 2、每日运势/当月/当年星座运势调用星座屋API接口&#xff0c;每天只采集一次接口&#xff0c;后保存到本地调用本地…

科普文:万字梳理高性能 Kafka快的8个原因

概叙 科普文&#xff1a;万字详解Kafka基本原理和应用-CSDN博客 科普文&#xff1a;万字梳理31个Kafka问题-CSDN博客 我们都知道 Kafka 是基于磁盘进行存储的&#xff0c;但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点&#xff0c;其吞吐量动辄几十上百万。 在座的…

Zookeeper未授权访问漏洞

Zookeeper是分布式协同管理工具&#xff0c;常用来管理系统配置信息&#xff0c;提供分布式协同服务。Zookeeper的默认开放端口是2181。Zookeeper安装部署之后默认情况下不需要任何身份验证&#xff0c;造成攻击者可以远程利用Zookeeper&#xff0c;通过服务器收集敏感信息或者…

TiDE时间序列模型预测(Long-term Forecasting with TiDE: Time-series Dense Encoder)

时间序列预测&#xff0c;广泛用于能源、金融、交通等诸多行业&#xff0c;传统的统计模型&#xff0c;例如ARIMA、GARCH等因其简单高效而被广泛使用&#xff0c;近年来&#xff0c;随着深度学习的兴起&#xff0c;基于神经网络的预测模型也备受关注&#xff0c;表现出强大的预…

电线电缆测厚双测径仪联控测厚系统

关键字:线缆测厚系统,绝缘层测厚设备,电线皮套测厚,电缆绝缘层测厚, 产品简介&#xff1a; 双测径仪联控测厚系统的工作原理基于光电测量技术。一台测径仪测量电缆的成品直径&#xff0c;另一台测径仪测量线芯的直径。通过这些测量数据&#xff0c;系统计算出绝缘层或护套层的厚…

结构开发笔记(一):外壳IP防水等级与IP防水铝壳体初步选型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140928101 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

mysql的 undo log、redo log、bin log、buffer pool

文章目录 Buffer Pool为什么需要Buffer PoolBuffer Pool 缓存了什么 Redo log为什么需要 redo log&#xff1f;redo log 什么时候刷盘&#xff1f;redo log 文件写满了怎么办&#xff1f; undo log 本文章内容都来自小林coding博主&#xff0c;基于他的文章内容&#xff0c;加一…

PXE的使用

配置前提 1、挂载镜像源&#xff0c;可正常下载软件 [rootredhat-7 ~]# mkdir -p /rhel7 ----创建挂载点目录 [rootredhat-7 ~]# mount /dev/sr0 /rhel7/ ----挂载镜像源至挂载点&#xff08;临时挂载&#xff0c;重启失效&#xff09;[rootredhat-7 ~]# vim /etc/yum.repos.…

C++ | Leetcode C++题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution { public:int bulbSwitch(int n) {return sqrt(n 0.5);} };

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-02 MAC层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

用Python实现炫酷的代码雨效果(完整代码)

导语 在这个数字时代&#xff0c;编程不仅是一项技能&#xff0c;更是一种艺术。想象一下&#xff0c;在你的屏幕上&#xff0c;一行行代码如同雨滴般落下&#xff0c;闪烁着技术的光芒&#xff0c;是不是既酷炫又充满科技感&#xff1f;今天&#xff0c;我们就将使用 Python …