数据结构与算法JavaScript描述练习------第14章高级算法

embedded/2024/10/20 14:51:34/

1. 写一个程序,使用暴力技巧来寻找最长公共子串。

function lcsBruteForce(word1, word2) {var maxLength = 0;var longestSubstring = "";for (var i = 0; i < word1.length; i++) {for (var j = i + 1; j <= word1.length; j++) {var substring = word1.substring(i, j);if (word2.includes(substring) && substring.length > maxLength) {maxLength = substring.length;longestSubstring = substring;}}}return longestSubstring;
}
var word1 = "ABABC";
var word2 = "BABCA";
console.log(lcsBruteForce(word1, word2));

2. 写一个程序,允许用户改变背包问题的约束条件,以便于观察条件的变化对结果的影 响。比如,你可以改变背包的容量、物品的价值,或物品的重量。每次最好只改一个约 束条件。

function knapsack(capacity, size, value, n) { if (n == 0 || capacity == 0) { return 0; } if (size[n - 1] > capacity) { return knapsack(capacity, size, value, n - 1); } else { return max(value[n - 1] + knapsack(capacity - size[n - 1], size, value, n - 1), knapsack(capacity, size, value, n - 1)); } 
} function dKnapsack(capacity, size, value, n) { var K = []; for (var i = 0; i <= capacity + 1; i++) { K[i] = []; } for (var i = 0; i <= n; i++) { for (var w = 0; w <= capacity; w++) { if (i == 0 || w == 0) { K[i][w] = 0; } else if (size[i - 1] <= w) { K[i][w] = max(value[i - 1] + K[i-1][w-size[i-1]], K[i-1][w]); } else { K[i][w] = K[i - 1][w]; } console.log(K[i][w] + " "); } } return K[n][capacity]; 
}

3. 使用贪心算法找零钱,不过这次不允许使用 10 美分,假设要找的零钱一共是 30 美分, 请尝试找到一个解。这个解是最优解吗?

function makeChange(origAmt, coins) { var remainAmt = 0; if (origAmt % .25 < origAmt) { coins[3] = parseInt(origAmt / .25); remainAmt = origAmt % .25; origAmt = remainAmt; } 
/*	if (origAmt % .1 < origAmt) { coins[2] = parseInt(origAmt / .1); remainAmt = origAmt % .1; origAmt = remainAmt; } 
*/	if (origAmt % .05 < origAmt) { coins[1] = parseInt(origAmt / .05); remainAmt = origAmt % .05; origAmt = remainAmt; } coins[0] = parseInt(origAmt / .01);
} function showChange(coins) { if (coins[3] > 0) { console.log("25 美分的数量 - " + coins[3] + " - " + coins[3] * .25); } 
/*	if (coins[2] > 0) { console.log("10 美分的数量 - " + coins[2] + " - " + coins[2] * .10); } 
*/	if (coins[1] > 0) { console.log("5 美分的数量 - " + coins[1] + " - " + coins[1] * .05); } if (coins[0] > 0) { console.log("1 美分的数量 - " + coins[0] + " - " + coins[0] * .01); } 
} var origAmt = .3; 
var coins = []; 
makeChange(origAmt, coins); 
showChange(coins);

本章实验代码:

function recurFib(n) { if (n < 2) { return n; } else { return recurFib(n-1) + recurFib(n-2); } 
} function dynFib(n) { var val = []; for (var i = 0; i <= n; ++i) { val[i] = 0; } if (n == 1 || n == 2) { return 1; } else { val[1] = 1; val[2] = 2; for (var i = 3; i <= n; ++i) { val[i] = val[i-1] + val[i-2]; } return val[n-1]; } 
}function iterFib(n) { var last = 1; var nextLast = 1; var result = 1; for (var i = 2; i < n; ++i) { result = last + nextLast; nextLast = last; last = result; } return result; 
}function lcs(word1, word2) { var max = 0; var index = 0; var lcsarr = new Array(word1.length + 1); for (var i = 0; i < word1.length + 1; ++i) { lcsarr[i] = new Array(word2.length + 1); for (var j = 0; j < word2.length + 1; ++j) { lcsarr[i][j] = 0; } } for (var i = 1; i <= word1.length; ++i) { for (var j = 1; j <= word2.length; ++j) { if (word1[i - 1] == word2[j - 1]) { lcsarr[i][j] = lcsarr[i - 1][j - 1] + 1; if (max < lcsarr[i][j]) { max = lcsarr[i][j]; index = i; } }else { lcsarr[i][j] = 0; } } } var str = ""; if (max == 0) { return ""; } else { for (var i = index - max; i <= max; ++i) { str += word1[i]; } return str; } 
}function lcsBruteForce(word1, word2) {var maxLength = 0;var longestSubstring = "";for (var i = 0; i < word1.length; i++) {for (var j = i + 1; j <= word1.length; j++) {var substring = word1.substring(i, j);if (word2.includes(substring) && substring.length > maxLength) {maxLength = substring.length;longestSubstring = substring;}}}return longestSubstring;
}function max(a, b) { return (a > b) ? a : b; 
} function knapsack(capacity, size, value, n) { if (n == 0 || capacity == 0) { return 0; } if (size[n - 1] > capacity) { return knapsack(capacity, size, value, n - 1); } else { return max(value[n - 1] + knapsack(capacity - size[n - 1], size, value, n - 1), knapsack(capacity, size, value, n - 1)); } 
} function dKnapsack(capacity, size, value, n) { var K = []; for (var i = 0; i <= capacity + 1; i++) { K[i] = []; } for (var i = 0; i <= n; i++) { for (var w = 0; w <= capacity; w++) { if (i == 0 || w == 0) { K[i][w] = 0; } else if (size[i - 1] <= w) { K[i][w] = max(value[i - 1] + K[i-1][w-size[i-1]], K[i-1][w]); } else { K[i][w] = K[i - 1][w]; } console.log(K[i][w] + " "); } } return K[n][capacity]; 
}function ksack(values, weights, capacity) { var load = 0; var i = 0; var w = 0; while (load < capacity && i < 4) { if (weights[i] <= (capacity-load)) { w += values[i]; load += weights[i]; } else { var r = (capacity-load)/weights[i]; w += r * values[i]; load += capacity-load; } ++i; } return w; 
} 
/* 
var items = ["A", "B", "C", "D"]; 
var values = [50, 140, 60, 60]; 
var weights = [5, 20, 10, 12]; 
var capacity = 30; 
console.log(ksack(values, weights, capacity));
*/function makeChange(origAmt, coins) { var remainAmt = 0; if (origAmt % .25 < origAmt) { coins[3] = parseInt(origAmt / .25); remainAmt = origAmt % .25; origAmt = remainAmt; } if (origAmt % .1 < origAmt) { coins[2] = parseInt(origAmt / .1); remainAmt = origAmt % .1; origAmt = remainAmt; } if (origAmt % .05 < origAmt) { coins[1] = parseInt(origAmt / .05); remainAmt = origAmt % .05; origAmt = remainAmt; } coins[0] = parseInt(origAmt / .01);
} function showChange(coins) { if (coins[3] > 0) { console.log("25 美分的数量 - " + coins[3] + " - " + coins[3] * .25); } if (coins[2] > 0) { console.log("10 美分的数量 - " + coins[2] + " - " + coins[2] * .10); } if (coins[1] > 0) { console.log("5 美分的数量 - " + coins[1] + " - " + coins[1] * .05); } if (coins[0] > 0) { console.log("1 美分的数量 - " + coins[0] + " - " + coins[0] * .01); } 
} var origAmt = .63; 
var coins = []; 
makeChange(origAmt, coins); 
showChange(coins);


http://www.ppmy.cn/embedded/129016.html

相关文章

Java基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

微信小程序设计尺寸

微信小程序的设计尺寸规范主要基于‌rpx单位&#xff0c;规定屏幕宽度为750rpx。‌ 在设计微信小程序时&#xff0c;设计师通常以‌iPhone 6的屏幕尺寸&#xff08;375px&#xff09;作为基准&#xff0c;因为1rpx等于0.5px&#xff0c;即1rpx等于1物理像素。这意味着在设计稿上…

Debug-029-el-table实现自动滚动分批请求数据

前情提要 最近做了一个小优化&#xff0c;还是关于展示大屏方面的。大屏中使用el-table展示列表数据&#xff0c;最初的方案是将数据全部返回&#xff0c;确实随着数据变多有性能问题&#xff0c;有时请求时间比较长。这里做的优化就是实现列表的滚动到距离底部一定高度时再次请…

UDP协议和TCP协议

UDP协议&#xff1a; 是一种无连接的、简单的传输层通信协议&#xff0c;它在IP协议&#xff08;网络层&#xff09;之上提供服务。 特点&#xff1a; 无连接&#xff1a;在数据传输前&#xff0c;发送方和接收方之间不需要建立连接&#xff0c;可以直接发送数据。 简单&…

读数据工程之道:设计和构建健壮的数据系统14源系统

1. 源系统中的数据生成 1.1. 数据工程师的工作是从源系统获取数据&#xff0c;对其进行处理&#xff0c;使其有助于为下游用例提供服务 1.2. 数据工程师的角色将在很大程度上转向理解数据源和目的地之间的相互作用 1.3. 数据工程的最基本的数据管道任务——将数据从A移动到B…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

Mybatis-plus

Springboot3Mybatis3.5 基本框架环境依赖导入配置文件实体类业务类结构 基本功能——提供的mapper接口及实现插入删除——返回受影响行数修改数据查询方法自定义mapper&#xff08;和mybatis一样&#xff09; 相关功能——提供的Service方法Service层搭建相关方法添加记录插入或…

SpringCloud第三章:客户端负载均衡与服务调用

正常本章节应该讲解Netflix Ribbon&#xff0c;由于从Netflix Eureka Client 3.0版本开始内置Ribbon实现机制&#xff0c;不需要单独依赖Ribbon&#xff0c;如果引入Ribbon会报错 java.lang.IllegalStateException: No instances available for XXXXXX&#xff0c;并且想要修改…