文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题
八、用go语言,设 X[1…n]和 Y[1…n]为两个数组,每个都包含n个有序的元素。请设计一个 O(lgn)时间的算法来找出数组 X和Y中所有 2n 个元素的中位数。
文心一言:
要在 O(lgn) 时间内找出两个有序数组 X 和 Y 中所有元素的中位数,可以使用二分查找算法。以下是用 Go 语言实现的算法:
package main import ( "fmt" "math"
) func findMedianSortedArrays(nums1 []int, nums2 []int) float64 { n, m := len(nums1), len(nums2) if n > m { nums1, nums2 = nums2, nums1 n, m = m, n } imin, imax, halfLen := 0, n, (n+m+1)/2 for imin <= imax { i := (imin + imax) / 2 j := halfLen - i if i < n && nums2[j-1] > nums1[i] { i++ } else if i > 0 && nums1[i-1] > nums2[j] { i-- } else { if i == 0 { maxOfLeft := nums2[j-1] } else if j == 0 { maxOfLeft := nums1[i-1] } else { maxOfLeft := max(nums1[i-1], nums2[j-1]) } if (n+m)%2 == 1 { return float64(maxOfLeft) } if i == n { minOfRight := nums2[j] } else if j == m { minOfRight := nums1[i] } else { minOfRight := min(nums1[i], nums2[j]) } return float64((maxOfLeft+minOfRight) / 2) } }
} func max(a, b int) int { if a > b { return a } return b
} func min(a, b int) int { if a < b { return a } return b
} func main() { nums1 := []int{1, 3} nums2 := []int{2, 4} median := findMedianSortedArrays(nums1, nums2) fmt.Println("The median of the two arrays is:", median)
}
这个算法的思路是将问题转化为在 O(lgn) 时间内寻找一个合适的分割点,将两个数组分成两部分,使得左侧所有元素小于等于右侧所有元素,同时左侧元素数量与右侧元素数量之差不超过 1。然后根据分割点的位置,确定中位数是左侧最大元素还是右侧最小元素,或者是它们的平均值。
讯飞星火:
为了在 O(lgn) 时间内找到两个数组 X 和 Y 中所有 2n 个元素的中位数,我们可以使用二分查找算法。以下是使用 Go 语言实现的代码:
package mainimport "fmt"func findMedianSortedArrays(nums1, nums2 []int) float64 {totalLength := len(nums1) + len(nums2)if totalLength%2 == 1 {return float64(findKthElement(nums1, 0, nums2, 0, totalLength/2))} else {return float64(findKthElement(nums1, 0, nums2, 0, totalLength/2-1))}
}func findKthElement(nums1, start1, nums2, start2 int, k int) int {if start1 >= len(nums1) && start2 >= len(nums2) {return -1}if start1 < len(nums1) && nums1[start1] > nums2[start2] {return findKthElement(nums1, start1+1, nums2, start2, k)} else if start2 < len(nums2) && nums1[start1] <= nums2[start2] {return findKthElement(nums1, start1, nums2, start2+1, k)} else {if k == 1 {return min(nums1[start1], nums2[start2])} else if k == 2 {return max(nums1[start1], nums2[start2])} else {return (nums1[start1] + nums2[start2]) / 2.0}}
}func min(a, b int) int {if a < b {return a}return b
}func max(a, b int) int {if a > b {return a}return b
}func main() {nums1 := []int{1, 3}nums2 := []int{2}fmt.Println(findMedianSortedArrays(nums1, nums2)) // 输出:2.0
}
这个算法首先计算两个数组的总长度,然后根据总长度是奇数还是偶数来确定中位数的位置。接下来,我们使用递归函数 findKthElement
来找到第 k 小的元素。在这个函数中,我们比较两个数组的第一个元素,然后将较小的元素所在的数组的起始索引加一,同时更新 k 的值。当其中一个数组的所有元素都被比较过后,我们根据 k 的值返回相应的结果。
360智脑:
以下是使用go语言实现找出两个有序数组中位数的算法:
func findMedianSortedArrays(nums1 []int, nums2 []int) int {m, n := len(nums1), len(nums2)if m == 0 || n == 0 {return 0}if m > n {nums1, nums2 = nums2, nums1m, n = n, m}// 合并两个有序数组i, j, k := m-1, n-1, 0for ; i <= m && j <= n; i, j, k = i+1, j+1, k+1 {if nums1[i] < nums2[j] {nums1[k] = nums1[i]i++} else if nums1[i] > nums2[j] {nums2[k] = nums2[j]j++} else {nums1[k] = nums2[j]j++}}// 计算中位数if i == m {return nums1[j]} else if j == n {return nums2[i]} else {return (nums1[i] + nums2[j]) / 2}
}
该算法的时间复杂度为 O(lgn),其中 n 是数组的长度。
智谱清言:
为了找到数组 X 和 Y 中所有 2n 个元素的中位数,我们可以使用快速排序(quicksort)算法。快速排序的时间复杂度为 O(nlogn),但我们可以通过随机选取一个元素作为基准值(pivot)来将时间复杂度降低到 O(lgn)。以下是使用 Go 语言实现的算法:
package main
import ( "fmt" "math/rand" "time"
)
func main() { rand.Seed(time.Now().UnixNano())x := []int{1, 3, 5, 7, 9} y := []int{2, 4, 6, 8, 10}median := findMedian(x, y) fmt.Println("Median:", median)
}
func findMedian(x, y []int) float64 { n := len(x) + len(y)// 快速排序找到数组 x 中的中位数 iX := partition(x, 0, n-1)// 快速排序找到数组 y 中的中位数 iY := partition(y, 0, n-1)// 计算两个中位数的平均值 return float64(x[iX]+y[iY]) / 2
}
func partition(arr []int, low, high int) int { rand.Shuffle(len(arr), func(i, j int) { arr[i], arr[j] = arr[j], arr[i] })pivot := arr[high] i := low - 1for j := low; j < high; j++ { if arr[j] <= pivot { i++ arr[i], arr[j] = arr[j], arr[i] } }arr[i+1], arr[high] = arr[high], arr[i+1]return i + 1
}
这个程序首先对数组 x 和 y 进行快速排序找到各自的中位数,然后将两个中位数相加并除以 2 得到最终的中位数。为了降低时间复杂度,我们在每次排序时都随机选取一个元素作为基准值(pivot)。
通义千问:
这个问题可以通过合并两个有序数组并找到其中位数来解决。以下是一个使用Go语言实现的示例:
package mainimport ("fmt""sort"
)func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {if len(nums1) > len(nums2) {nums1, nums2 = nums2, nums1}nums := make([]int, 0, len(nums1)+len(nums2))nums = append(nums, nums1...)nums = append(nums, nums2...)sort.Ints(nums)if len(nums)%2 == 0 {return float64(nums[len(nums)/2-1]+nums[len(nums)/2]) / 2.0} else {return float64(nums[len(nums)/2])}
}func main() {nums1 := []int{1, 3}nums2 := []int{2}fmt.Println(findMedianSortedArrays(nums1, nums2)) // Output: 2nums1 = []int{1, 2}nums2 = []int{3, 4}fmt.Println(findMedianSortedArrays(nums1, nums2)) // Output: 2.5
}
这个算法首先检查两个数组的长度,如果第一个数组较短,就交换两个数组。然后,它将两个数组合并到一个新的数组中,并对这个数组进行排序。最后,它检查数组的长度是否为偶数,如果是,就返回中间两个元素的平均值,否则就返回中间的元素。
这个算法的时间复杂度为O((m+n)log(m+n)),其中m和n分别是两个数组的长度。但是,由于我们只关心中位数,所以我们实际上只需要找到数组的中间元素,这可以在O(log(m+n))的时间内完成。
天工:
可以使用类似于快速选择算法的方法来解决这个问题。具体来说,可以通过以下步骤找到数组 X 和 Y 中所有 2n 个元素的中位数:
-
将数组 X 和 Y 合并成一个新的数组 Z,其中 Z[k] = X[k],k = 1, 2, …, n,Z[k] = Y[k-n],k = n+1, n+2, …, 2n。
-
使用快速选择算法找到数组 Z 中的中位数,时间复杂度为 O(lgn)。
-
根据中位数的位置可以确定数组 X 和 Y 中的中位数。如果中位数在数组 X 中,则数组 X 和 Y 的中位数相同;否则,数组 Y 中的中位数更大。
具体实现可以参考以下代码:
func findMedianSortedArrays(X, Y []int) float64 {n := len(X)m := len(Y)if n > m {X, Y = Y, Xn, m = m, n}Z := make([]int, 2*n)copy(Z, X)copy(Z[n:], Y)medianIndex := quickSelect(Z, n, 2*n-1)if medianIndex == n {return float64(X[n-1])} else if medianIndex == n+m {return float64(Y[m-1])} else {return float64(Z[medianIndex])}
}func quickSelect(arr []int, left, right int) int {if left == right {return left}pivot := arr[(left+right)/2]i, j := left,rightfor i < j {for arr[i] <> pivot {i++}for j > i && arr[j] == pivot {j--}if i < j {arr[i], arr[j] = arr[j], arr[i]i++j--}else if i == j {return j}}return j
}
该算法的时间复杂度为 O(lgn),空间复杂度为 O(n)。
chatgpt:
可以使用类似于归并排序的思想来解决这个问题。
首先,我们可以找出X和Y的中位数候选集合,即分别找出X和Y中位置为n和n+1的元素。
这两个元素的下标分别为m1 = (n+1)/2 和 m2 = n/2,可以确定这两个位置元素 X[m1] <= X[m2] 和 Y[m1] <= Y[m2]。
然后,我们可以根据X和Y的中位数候选集合来确定中位数。
如果 X[m2] < Y[m1] ,则中位数一定在X的后半部分和Y的前半部分。因此,我们可以将X[m1:n]和Y[1:m1]作为新的候选集合来进行下一轮迭代。
如果 Y[m2] < X[m1] ,则中位数一定在Y的后半部分和X的前半部分。因此,我们可以将Y[m1:n]和X[1:m1]作为新的候选集合来进行下一轮迭代。
如果 X[m2] = Y[m1] 或 X[m2] = Y[m1],则中位数一定是 X[m2] 或 Y[m1]。可以直接返回其中一个作为中位数。
重复以上步骤,直到找到中位数或候选集合中只剩下一个元素为止。
以下是使用Go语言实现的示例代码:
func findMedian(X []int, Y []int) float64 {n := len(X)m1 := n / 2m2 := (n + 1) / 2for m1 > 0 && m1 < n {if X[m1] <= Y[m2] && Y[m1] <= X[m2] {// 找到中位数if (n+n)%2 == 0 {return float64((max(X[m1], Y[m1]) + min(X[m2], Y[m2])) / 2)} else {return float64(min(X[m2], Y[m2]))}} else if X[m1] > Y[m2] {// 中位数在X的前半部分和Y的后半部分n = m1m1 = n / 2m2 = (n + 1) / 2} else {// 中位数在Y的前半部分和X的后半部分n = m1m1 = (n + 1) / 2m2 = n / 2}}// 只剩下一个元素时,返回该元素作为中位数if m1 == 0 {return float64(min(X[m2], Y[m2]))} else {return float64(max(X[m1], Y[m1]))}
}func max(a, b int) int {if a > b {return a} else {return b}
}func min(a, b int) int {if a < b {return a} else {return b}
}
以上代码中,findMedian 函数接受两个有序数组 X 和 Y,并返回它们的中位数。其中,max 和 min 函数分别为获取最大值和最小值的辅助函数。
由于每次迭代都将候选集合的大小减半,因此总的时间复杂度为O(log n)。
相关文章:
文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题
八、用go语言,设 X[1…n]和 Y[1…n]为两个数组,每个都包含n个有序的元素。请设计一个 O(lgn)时间的算法来找出数组 X和Y中所有 2n 个元素的中位数。 文心一言: 要在 O(lgn) 时间内找出两个有序数组 X 和 Y 中所有元素的中位数,可…...
axios添加缓存请求,防止多次请求,单页面多个同一组件造成多次请求解决方案
在axios中,添加 const cacheMap {};响应拦截添加 try {// 删除缓存const api res.config.url.replace(process.env.VUE_APP_BASE_API, "");if (cacheMap.hasOwnProperty(api)) {delete cacheMap[api];}} catch (err) {}创建两个请求方法 /*** Get缓存…...
Java包装类与自动拆箱装箱
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是 Java 包装类和自动拆箱装箱? Java 中的基本数据类型(如 int、cha…...
基于SpringBoot网上超市的设计与实现【附万字文档(LW)和搭建文档】
主要功能 前台登录: 注册用户:用户名、密码、姓名、联系电话 用户: ①首页、商品信息推荐、商品资讯、查看更多 ②商品信息、商品详情、评论、点我收藏、添加购物车、立即购买 ③个人中心、余额、点我充值、更新信息、我的订单、我的地址、我…...
二、C++项目:仿muduo库实现并发服务器之时间轮的设计
文章目录 一、为什么要设计时间轮?(一)简单的秒级定时任务实现:(二)Linux提供给我们的定时器:1.原型2.例子 二、时间轮(一)思想(一)代码 一、为什…...
计算机竞赛 深度学习OCR中文识别 - opencv python
文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…...
蓝桥等考Python组别五级003
第一部分:选择题 1、Python L5 (15分) 表达式“a >= b”等价于下面哪个表达式?( ) a > b and a == ba > b or a == ba < b and a == ba < b or a > b正确答案:B 2、Python L5 (15分) 当x是偶数时,下面哪个表达式的值一定是True?( …...
学之思项目第一天-完成项目搭建
一、前端 拉下前端代码执行 npm i 然后执行npm run serve就行了 二、后端 搭建父子模块 因为这个涉及到前台以及后台管理所以使用父子模块 并且放置一个公共模块,放置公共的依赖以及公共的代码 2.1 搭建父子工程 这个可以使用直接一个个的maven模块ÿ…...
pandas--->CSV / JSON
csv CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。 CSV 是一种通用的、相对简单的文…...
LeetCode算法二叉树—116. 填充每个节点的下一个右侧节点指针
目录 116. 填充每个节点的下一个右侧节点指针 题解: 代码: 运行结果: 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;N…...
二、2023.9.28.C++基础endC++内存end.2
文章目录 17、说说new和malloc的区别,各自底层实现原理。18、 说说const和define的区别。19、 说说C中函数指针和指针函数的区别?20、 说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点…...
DevSecOps 将会嵌入 DevOps
通常人们在一个项目行将结束时才会考虑到安全,这么做会导致很多问题;将安全融入到DevOps的工作流中已产生了积极结果。 DevSecOps:安全正当时 一直以来,开发人员在构建软件时认为功能需求优先于安全。虽然安全编码实践起着重要作…...
不同管径地下管线的地质雷达响应特征分析
不同管径地下管线的地质雷达响应特征分析 前言 以混凝土管线为例,建立了不同管径的城市地下管线模型,进行二维地质雷达正演模拟,分析不同管径管线的地质雷达响应特征。 文章目录 不同管径地下管线的地质雷达响应特征分析前言1、管径50cm2、…...
【接口测试学习】白盒测试 接口测试 自动化测试
一、什么是白盒测试 白盒测试是一种测试策略,这种策略允许我们检查程序的内部结构,对程序的逻辑结构进行检查,从中获取测试数据。白盒测试的对象基本是源程序,所以它又称为结构测试或逻辑驱动测试,白盒测试方法一般分为…...
7.网络原理之TCP_IP(下)
文章目录 4.传输层重点协议4.1TCP协议4.1.1TCP协议段格式4.1.2TCP原理4.1.2.1确认应答机制 ACK(安全机制)4.1.2.2超时重传机制(安全机制)4.1.2.3连接管理机制(安全机制)4.1.2.4滑动窗口(效率机制…...
Docker Dockerfile解析
Dockerfile是什么 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 官网:Dockerfile reference | Docker Docs 构建三步骤: 编写Dockerfile文件docker build命令构建镜像docker run依镜像运行容…...
浏览器从输入URL到页面展示这个过程中都经历了什么
一. URL输入 URL是统一资源定位符,用于定位互联网上的资源,俗称网址。我们在地址栏输入网址后敲下回车,浏览器会对输入的信息进行以下判断: 1. 检查输入的内容是否是一个合法的URL连接 2. 如果合法的话,则会判断URL…...
2023-09-22 monetdb-事务管理-乐观并发控制-记录
摘要: 2023-09-22 monetdb-事务管理-记录 相关文档: Transaction Management | MonetDB Docs https://en.wikipedia.org/wiki/Optimistic_concurrency_control monetdb事务管理: MonetDB/SQL 支持以 START TRANSACTION 标记并以 COMMIT 或 ROLLBACK 关闭的多语句事务方案。如果…...
蓝桥等考Python组别四级008
第一部分:选择题 1、Python L4 (15分) 字符“D”的ASCII码值比字符“F”的ASCII码值小( )。 1234正确答案:B 2、Python L4 (15分) 下面的Python变量名正…...
SpringMVC 学习(二)Hello SpringMVC
3. Hello SpringMVC (1) 新建 maven 模块 springmvc-02-hellomvc (2) 确认依赖的导入 (3) 配置 web.xml <!--web/WEB-INF/web.xml--> <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee…...
交换机之间配置手动|静态链路聚合
两台交换机,配置链路聚合: 1、禁止自动协商速率,配置固定速率 int G0/0/1 undo negotiation auto speed 100int G0/0/2 undo negotiation auto speed 100 2、配置eth-trunk int eth-trunk 1 mode manual | lacp-staticint G0/0/1 eth-trun…...
Shiro高级及SaaS-HRM的认证授权
Shiro在SpringBoot工程的应用 Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。越来越多的企业使用Shiro作为项目的安全框架,保证项目的平稳运行。 在之前的讲解中只是单独的使用shiro&…...
eclipse svn插件安装
1.进入eclipse的help->Eclipse Marketplace,如下图所示: 2.输入“svn”,再按回车,如下图: 3.这我选择的是 Subversive,点击后面的“install”按钮,如下图 Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive &…...
C语言 cortex-A7核 UART总线 实验
一、C 1)uart4.h #ifndef __UART4_H__ #define __UART4_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h&quo…...
不同走向地下管线的地质雷达响应特征分析
不同走向地下管线的地质雷达响应特征分析 前言 以PVC管线为例,建立不同走向(水平倾斜、垂直倾斜、水平相邻)的三维管线地质模型,进行三维地质雷达数据模拟,分析不同走向地下管线的地质雷达响应特征。 文章目录 不同…...
Nginx负载均衡详解
一、负载均衡介绍 1、负载均衡的定义 单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多…...
基于Spring Boot的宠物咖啡馆平台的设计与实现
目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 看护师信息管理 宠物寄养管理 健康状况管理 点单 宠物体验 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已…...
TYVJ P1026 犁田机器人
描述 Farmer John為了让自己从无穷无尽的犁田工作中解放出来,於是买了个新机器人帮助他犁田。这个机器人可以完成犁田的任务,可惜有一个小小的缺点:这个犁田机器人一次只能犁一个边的长度是整数的长方形的田地。 因為FJ的田地有树和其他障碍…...
软件测试面试经验分享,真实面试题
前言 本人普通本科计算机专业,做测试也有3年的时间了,讲下我的经历,我刚毕业就进了一个小自研薪资还不错,有10.5k(个人觉得我很优秀),在里面呆了两年,积累了一些的经验和技能&#…...
计算机网络 - 链路层
计算机网络 - 链路层 计算机网络 - 链路层 基本问题 1. 封装成帧2. 透明传输3. 差错检测 信道分类 1. 广播信道2. 点对点信道 信道复用技术 1. 频分复用2. 时分复用3. 统计时分复用4. 波分复用5. 码分复用 CSMA/CD 协议PPP 协议MAC 地址局域网以太网交换机虚拟局域网 基本问题…...
武汉站哪家设计公司/推广普通话活动方案
MySQL 8.0.22下载及安装,供大家参考,具体内容如下一. 下载mysql1.进入MySQL官网下载,或直接点击下载,如下图所示:2.点击"DOWNLOADS"3.选择 " MySQL Community(GPL) Downloads"4.选择 “MySQL Comm…...
怎么做网站建设的ppt/网站都有哪些
最近重新学习数据结构和算法,刚刚看完java版的这几个数据结构,比较浅显易懂,有兴趣的可以自己去调试学习,关于这几个的介绍网上很多。 二叉搜索树,比较简单的树结构了 package com.jwetherell.algorithms.data_structu…...
网站备案没公司/优化快速排名教程
问题描述:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。例:给定数组 nums [-1,2,1,-…...
电子商务网站建设收获/湖南网站建设工作室
原文网址:http://blog.sina.com.cn/s/blog_5bdee3020101pvgy.html 市面上,经常充斥着,大量双卡双待手机,而许多消费者只是知道这种手机可以插入两个卡,直接打电话,而你真正的理解其中的含义吗? …...
关于做网站的/营销软文范文
bug出现环境背景 使用Cocospod安装RN的时候,报错 bug分析 [!] Unable to satisfy the following requirements: - Yoga ( 0.44.0.React) required by React/Core (0.44.0) None of your spec sources contain a spec satisfying the dependency: Yoga ( 0.44.0.Reac…...
wordpress 防火墙/百度百科词条
a转载于:https://www.cnblogs.com/menggucaoyuan/archive/2013/04/23/3036903.html...