文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题
三、设计 LCS-LENGTH的带备忘的版本,运行时间为O(mn)。需要写代码的时候,请用go语言。
文心一言,代码正常运行:
LCS-LENGTH(Longest Common Subsequence Length)问题的带备忘的版本通常指的是使用动态规划(Dynamic Programming, DP)和备忘录(Memoization)来优化算法性能,避免重复计算。通过维护一个表(即“备忘录”)来存储已经计算过的子问题的解,从而在解决新问题时可以直接查找已存储的结果,而不是重新计算。
以下是使用Go语言实现的一个带备忘的LCS-LENGTH算法的示例。在这个示例中,lcsLength 函数计算两个字符串的最长公共子序列长度,并且使用一个二维数组 memo 来存储子问题的解,其中 memo[i][j] 存储的是 str1 的前 i 个字符和 str2 的前 j 个字符的最长公共子序列长度。
package main
import (
"fmt"
)
func lcsLength(str1, str2 string) int {
m, n := len(str1), len(str2)
memo := make([][]int, m+1)
for i := range memo {
memo[i] = make([]int, n+1)
}
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if str1[i-1] == str2[j-1] {
memo[i][j] = memo[i-1][j-1] + 1
} else {
memo[i][j] = max(memo[i-1][j], memo[i][j-1])
}
}
}
return memo[m][n]
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
str1 := "ABCDEFG"
str2 := "XYZABCDEFGHIJKL"
length := lcsLength(str1, str2)
fmt.Printf("The length of the Longest Common Subsequence is: %d\n", length)
}
在这个实现中,lcsLength 函数首先初始化一个 (m+1) x (n+1) 的二维数组 memo,其中 m 和 n 分别是两个输入字符串 str1 和 str2 的长度。然后,它使用两个嵌套的循环来遍历 str1 和 str2 的所有字符组合。
如果 str1 的第 i 个字符和 str2 的第 j 个字符相同,则最长公共子序列的长度加一,即 memo[i][j] = memo[i-1][j-1] + 1。如果不同,则最长公共子序列的长度是去掉 str1 的第 i 个字符后的最长公共子序列和去掉 str2 的第 j 个字符后的最长公共子序列中的较大值,即 memo[i][j] = max(memo[i-1][j], memo[i][j-1])。
最后,函数返回 memo[m][n],即两个字符串的最长公共子序列的长度。
请注意,这个实现的时间复杂度是 O(mn),其中 m 和 n 分别是两个输入字符串的长度。这是因为我们需要填充一个 m x n 的表,而每个表项的计算时间是常数时间。



讯飞星火,代码正常运行:
在Go语言中,我们可以使用动态规划来解决这个问题。以下是实现LCS-LENGTH的带备忘的版本的代码:
package main
import "fmt"
func max(a, b int) int {
if a > b {
return a
}
return b
}
func lcsLength(X, Y []int) int {
m := len(X)
n := len(Y)
c := make([][]int, m+1)
for i := range c {
c[i] = make([]int, n+1)
}
for i := 0; i <= m; i++ {
for j := 0; j <= n; j++ {
if i == 0 || j == 0 {
c[i][j] = 0
} else if X[i-1] == Y[j-1] {
c[i][j] = c[i-1][j-1] + 1
} else {
c[i][j] = max(c[i-1][j], c[i][j-1])
}
}
}
return c[m][n]
}
func main() {
X := []int{1, 3, 4, 5, 6, 7, 7, 8}
Y := []int{2, 3, 5, 6, 7, 8, 9, 10}
fmt.Println("Length of LCS is", lcsLength(X, Y))
}
在这个程序中,我们首先定义了一个二维数组c,用于存储子问题的解。然后,我们遍历两个输入序列,如果当前位置的元素相同,则该位置的LCS长度为左上角元素的LCS长度加一;否则,该位置的LCS长度为左边元素和上边元素中较大的那个LCS长度。最后,右下角的元素就是整个序列的LCS长度。


360智脑,代码不能运行:
以下是一个使用Go语言实现的LCS-Length带备忘的版本:
package main
func lcsLength(memo map[int][int]int, X string, Y string, m int, n int) int {
if m == 0 || n == 0 {
return 0
}
if v, ok := memo[m][n]; ok {
return v
}
if X[m-1] == Y[n-1] {
memo[m][n] = lcsLength(memo, X, Y, m-1, n-1) + 1
} else {
memo[m][n] = max(lcsLength(memo, X, Y, m-1, n), lcsLength(memo, X, Y, m, n-1))
}
return memo[m][n]
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
X := "ABCBDAB"
Y := "BDCAB"
memo := make(map[int][int]int)
m := len(X)
n := len(Y)
fmt.Println(lcsLength(memo, X, Y, m, n))
}
在这个代码中,我们使用了一个备忘录(memo)来存储之前计算过的LCS长度。当我们计算LCS长度时,我们首先检查备忘录中是否已经有这个值。如果有,我们就直接返回它;如果没有,我们就计算它,并将其存储在备忘录中。
这个算法的运行时间为O(mn),因为我们在计算LCS长度时,最多需要遍历X和Y字符串的每个字符。


智谱清言,代码正常运行:
为了设计一个运行时间为O(mn)的LCS-LENGTH算法,我们可以使用动态规划(DP)技术,并辅以带备忘的递归方法来避免重复计算。在下面给出的Go语言代码中,我们将计算两个字符串str1和str2的最长公共子序列的长度。
package main
import (
"fmt"
)
// LCSLength 计算两个字符串的最长公共子序列的长度
// 使用带备忘的递归方法
func LCSLength(str1, str2 string) int {
// 创建一个二维切片来保存子问题的结果
// dp[i][j] 表示str1的前i个字符与str2的前j个字符的LCS长度
dp := make([][]int, len(str1)+1)
for i := range dp {
dp[i] = make([]int, len(str2)+1)
}
// 初始化dp数组
for i := 0; i <= len(str1); i++ {
for j := 0; j <= len(str2); j++ {
if i == 0 || j == 0 {
dp[i][j] = 0
}
}
}
// 递归计算LCS长度,同时更新dp数组
return recursiveLCSLength(str1, str2, 0, 0, dp)
}
// recursiveLCSLength 递归计算最长公共子序列的长度
// 同时更新dp数组以避免重复计算
func recursiveLCSLength(str1, str2 string, i, j int, dp [][]int) int {
// 检查是否已经计算过这个子问题
if dp[i][j] != 0 {
return dp[i][j]
}
// 如果i或j为0,那么LCS长度为0
if i == 0 || j == 0 {
dp[i][j] = 0
return 0
}
// 如果str1[i-1] == str2[j-1],那么当前字符是LCS的一部分
if str1[i-1] == str2[j-1] {
dp[i][j] = 1 + recursiveLCSLength(str1, str2, i-1, j-1, dp)
} else {
// 否则,取左侧或上侧的LCS长度中的较大值
dp[i][j] = max(recursiveLCSLength(str1, str2, i-1, j, dp), recursiveLCSLength(str1, str2, i, j-1, dp))
}
return dp[i][j]
}
// max 返回两个整数中的较大值
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
str1 := "ABCBDAB"
str2 := "BDCAB"
fmt.Println("The length of LCS is:", LCSLength(str1, str2))
}
这段代码定义了一个LCSLength函数,它使用一个二维切片dp来存储子问题的解,并且通过递归函数recursiveLCSLength来计算最长公共子序列的长度。递归函数会在每次需要计算相同子问题时,检查是否已经在dp中存储了结果,以避免重复计算。
main函数中给出了一个例子,计算字符串"ABCBDAB"和"BDCAB"的最长公共子序列的长度,并打印结果。



天工,代码正常运行:
Certainly! Below is an implementation of the LCS problem with memoization in Go that runs in O(mn) time, where m and n are the lengths of the two input strings. This implementation uses a二维数组 to store the results of subproblems, avoiding重复计算.
package main
import "fmt"
// LCSMemo computes the length of the longest common subsequence between X and Y using memoization.
func LCSMemo(X, Y string) int {
m, n := len(X), len(Y)
dp := make([][]int, m+1)
for i := range dp {
dp[i] = make([]int, n+1)
}
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if X[i-1] == Y[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
}
}
}
return dp[m][n]
}
// max returns the larger of two integers.
func max(a, b int) int {
if a >= b {
return a
}
return b
}
func main() {
X := "AGGTAB"
Y := "GXTXAYB"
length := LCSMemo(X, Y)
fmt.Printf("Length of LCS: %d\n", length)
}
To use this code, simply run it with the Go runtime and it will output the length of the longest common subsequence between the two given strings. The max function is used to handle the comparison of integers, as int in Go does not guarantee a specific signedness.


灵小智,代码正常运行:
下面是用Go语言编写的带备忘录的最长公共子序列(LCS)问题的代码示例:
package main
import (
"fmt"
)
func max(a, b int) int {
if a > b {
return a
}
return b
}
func lcsLengthMemoized(X, Y string, m, n int, memo [][]int) int {
if m == 0 || n == 0 {
return 0
}
if memo[m][n] != -1 {
return memo[m][n]
}
if X[m-1] == Y[n-1] {
memo[m][n] = 1 + lcsLengthMemoized(X, Y, m-1, n-1, memo)
return memo[m][n]
}
memo[m][n] = max(lcsLengthMemoized(X, Y, m-1, n, memo), lcsLengthMemoized(X, Y, m, n-1, memo))
return memo[m][n]
}
func lcsLength(X, Y string) int {
m := len(X)
n := len(Y)
memo := make([][]int, m+1)
for i := range memo {
memo[i] = make([]int, n+1)
for j := range memo[i] {
memo[i][j] = -1
}
}
return lcsLengthMemoized(X, Y, m, n, memo)
}
func main() {
X := "ABCBDAB"
Y := "BDCAB"
fmt.Printf("Length of LCS: %d\n", lcsLength(X, Y))
}
在这个代码中,我们使用了备忘录(memo)来保存已计算过的子问题的结果,以避免重复计算。通过将已计算过的结果存储在备忘录中,我们可以将算法的运行时间从指数级别降低到线性级别。这样,算法的运行时间为O(mn),其中m和n分别是字符串X和Y的长度。
以上是用Go语言编写的带备忘录的LCS问题的代码示例,希望对你有帮助!


chatgpt,代码正常运行:
当设计LCS-LENGTH函数的带备忘的版本时,可以使用动态规划的思想。下面是用Go语言实现的代码:
package main
import (
"fmt"
)
func lcsLengthMemo(X, Y string) int {
m := len(X)
n := len(Y)
// 创建并初始化备忘录
memo := make([][]int, m+1)
for i := 0; i <= m; i++ {
memo[i] = make([]int, n+1)
for j := 0; j <= n; j++ {
memo[i][j] = -1
}
}
var lcs func(int, int) int
lcs = func(i, j int) int {
if memo[i][j] != -1 { // 如果已经计算过,直接返回备忘录中的值
return memo[i][j]
}
if i == 0 || j == 0 { // 边界条件,其中一个字符串为空
memo[i][j] = 0
return 0
}
if X[i-1] == Y[j-1] { // 当前字符匹配成功,继续向前匹配
memo[i][j] = lcs(i-1, j-1) + 1
return memo[i][j]
} else { // 当前字符不匹配,取两种情况下的最大值
left := lcs(i-1, j)
top := lcs(i, j-1)
if left > top {
memo[i][j] = left
} else {
memo[i][j] = top
}
return memo[i][j]
}
}
return lcs(m, n)
}
func main() {
X := "ABCBDAB"
Y := "BDCAB"
fmt.Println("LCS长度:", lcsLengthMemo(X, Y))
}
该代码使用了备忘录来存储已经计算过的子问题的结果,避免重复计算。通过递归方式进行动态规划,从后往前匹配字符串,并记录最长公共子序列的长度。运行时间复杂度为O(mn)。


kimi,代码正常运行:
在 Go 语言中,设计一个带有备忘(Memoization)的 LCS-LENGTH 版本,可以通过创建一个额外的二维切片来存储已经计算过的子问题的解。这样,当我们需要计算一个新的子问题时,我们首先检查这个解是否已经被计算过。如果已经计算过,我们可以直接使用这个解,而不需要重新计算,从而提高算法的效率。
以下是带有备忘的 LCS-LENGTH 函数的 Go 语言实现:
package main
import (
"fmt"
)
// LCS-LENGTH 函数计算两个序列的最长公共子序列的长度
func LCSLength(x, y []int) int {
m, n := len(x), len(y)
memo := make([][]int, m+1)
for i := range memo {
memo[i] = make([]int, n+1)
}
return lcsLengthMemo(x, y, m, n, memo)
}
// lcsLengthMemo 是 LCS-LENGTH 的递归实现,带有备忘
func lcsLengthMemo(x, y []int, m, n int, memo [][]int) int {
if m == 0 || n == 0 {
return 0
}
// 检查解是否已经在备忘数组中
if memo[m][n] != 0 {
return memo[m][n]
}
if x[m-1] == y[n-1] {
// 如果当前元素相同,递归计算去掉这两个元素后的子问题的解
memo[m][n] = 1 + lcsLengthMemo(x, y, m-1, n-1, memo)
} else {
// 如果当前元素不同,分别计算两种情况的解,并取最大值
memo[m][n] = max(
lcsLengthMemo(x, y, m-1, n, memo),
lcsLengthMemo(x, y, m, n-1, memo),
)
}
return memo[m][n]
}
// max 返回两个整数中的最大值
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
x := []int{1, 0, 0, 1, 0, 1, 0, 1}
y := []int{0, 1, 0, 1, 1, 0, 1, 1, 0}
length := LCSLength(x, y)
fmt.Printf("Length of LCS: %d\n", length)
}
在这个实现中,LCSLength 函数是用户调用的接口,它初始化备忘数组并调用 lcsLengthMemo 函数。lcsLengthMemo 函数是递归实现,它使用备忘数组来避免重复计算。这个算法的时间复杂度是 O(m * n),因为每个子问题只计算一次,并且我们使用 O(m * n) 的空间来存储备忘数组。


混元,代码正常运行:
带备忘的 LCS-LENGTH 算法是一种动态规划方法,用于计算两个字符串的最长公共子序列的长度。以下是使用 Go 语言实现的带备忘的 LCS-LENGTH 算法:
package main
import (
"fmt"
)
func lcsLengthMemo(x, y string, m, n int, memo [][]int) int {
if m == 0 || n == 0 {
return 0
}
if memo[m][n] != -1 {
return memo[m][n]
}
if x[m-1] == y[n-1] {
memo[m][n] = 1 + lcsLengthMemo(x, y, m-1, n-1, memo)
} else {
memo[m][n] = max(lcsLengthMemo(x, y, m-1, n, memo), lcsLengthMemo(x, y, m, n-1, memo))
}
return memo[m][n]
}
func lcsLength(x, y string) int {
m, n := len(x), len(y)
memo := make([][]int, m+1)
for i := range memo {
memo[i] = make([]int, n+1)
for j := range memo[i] {
memo[i][j] = -1
}
}
return lcsLengthMemo(x, y, m, n, memo)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
x := "ABCBDAB"
y := "BDCAB"
fmt.Printf("The length of the LCS is: %d\n", lcsLength(x, y))
}
这个实现首先创建一个二维数组 memo 用于存储已经计算过的子问题的解。lcsLengthMemo 函数是一个递归函数,用于计算两个字符串的最长公共子序列的长度。当递归到基本情况时,它会返回 0。如果当前子问题已经计算过,它会直接返回已经计算的结果。否则,它会计算当前子问题的解,并将其存储在备忘录中,然后返回解。
lcsLength 函数是一个包装函数,用于初始化备忘录并调用 lcsLengthMemo 函数。最后,main 函数调用 lcsLength 函数并打印结果。


文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题的更多相关文章
- 【对比】文心一言对飚ChatGPT实操对比体验
前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...
- 【个人首测】百度文心一言 VS ChatGPT GPT-4
昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...
- 文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入
"文心"取自<文心雕龙>一书的开篇,作者刘勰在书中引述了一个古代典故:春秋时期,鲁国有一位名叫孔文子的大夫,他在学问上非常有造诣,但是他的儿子却不学无术,孔文子非常痛心 ...
- 获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果
百度在3月16日召开了关于文心一言(知识增强大语言模型)的发布会,但是会上并没现场展示demo.如果要测试的文心一言 也要获取邀请码,才能进行测试的. 我这边通过预约得到了邀请码,大概是在3月17日晚 ...
- 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)
目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...
- 阿里版ChatGPT:通义千问pk文心一言
随着 ChatGPT 热潮卷起来,百度发布了文心一言.Google 发布了 Bard,「阿里云」官方终于也宣布了,旗下的 AI 大模型"通义千问"正式开启测试! 申请地址:http ...
- 基于讯飞语音API应用开发之——离线词典构建
最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不 ...
- android用讯飞实现TTS语音合成 实现中文版
Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...
- android讯飞语音开发常遇到的问题
场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...
- 初探机器学习之使用讯飞TTS服务实现在线语音合成
最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...
随机推荐
- windwos使用FRP方式
FRP使用方法 流程图如下 建议查看流程图哦 访问FRP官方项目 https://freefrp.net 下面是windwos演示 进入网站选择客户端下载 客户端版本选择 windwos是adm64 ...
- c++基础之语句
上一次总结了一下c++中表达式的相关内容,这篇博文主要总结语句的基础内容 简单语句 c++ 中语句主要是以分号作为结束符的,最简单的语句是一个空语句,空语句主要用于,语法上需要某个地方,但是逻辑上不需 ...
- Markdown-CSDN自带帮助语法
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- C++ 实现的Ping类的封装
Ping 使用 Internet 控制消息协议(ICMP)来测试主机之间的连接.当用户发送一个 ping 请求时,则对应的发送一个 ICMP Echo 请求消息到目标主机,并等待目标主机回复一个 IC ...
- 4.3 Windows驱动开发:监控进程与线程对象操作
在内核中,可以使用ObRegisterCallbacks这个内核回调函数来实现监控进程和线程对象操作.通过注册一个OB_CALLBACK_REGISTRATION回调结构体,可以指定所需的回调函数和回 ...
- 使用Nuget快速集成.Net三维控件
据老一辈的程序员说开发三维程序门槛很高,需要学若干年才能入门,自从遇上AnyCAD三维控件后,开发三维应用变的简单了.当结合nuget后,一切更简单了. 1 准备工作 安装VS201x以后,就可以开始 ...
- 【C语言深度解剖】一篇解决程序的环境【编译+链接详解】让面试官给我们竖起大拇指
文章目录 程序的翻译环境 翻译环境详解 编译 预编译 编译 汇编 关于形成符号表 链接 运行环境 尾声 [C语言深度解剖][Linux操作系统]程序的环境[编译+链接详解] 那么这里博主先安利一下一些 ...
- Kafka-基本介绍和常见问题
1.kafka 1.1.kafka介绍 kafka是最初由linkedin公司开发的,使用scala语言编写,kafka是一个分布式,分区的,多副本的,多订阅者的消息队列系统. 1.2.kafka ...
- ES6学习 第六章 数值的扩展
前言 本章介绍数值的扩展.新增了很多方法,有些不常用的方法了解即可. 本章原文链接:数值的扩展 进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. ...
- NC16544 简单环
题目链接 题目 题目描述 给定一张n个点m条边的无向图,求出图中所有简单环的数量.(简单环:简单环又称简单回路,图的顶点序列中,除了第一个顶点和最后一个顶点相同外,其余顶点不重复出现的回路叫简单回路. ...