找出列表中的任意两个元素的总和是否为R中的特定值
这是一个典型的面试问题。给定一个列表找出列表中的任意两个元素的总和是否为R中的特定值,r,logic,R,Logic,这是一个典型的面试问题。给定一个列表numbers和一个特定值k,找出当求和时numbers中的任意两个元素是否等于k。在r中,如何用单遍算法而不是穷举搜索来解决这个问题 实际上:在r中编写最佳函数,该函数接收一个列表numbers和一个特定值k,如果numbers中有两个元素的和等于k,则返回TRUE。如果没有,则返回FALSE此问题可能被定义为:数字中是否有a和b,例如: a+b=k?考虑到您已经知道了k,并且假设实际上有两个数字在求和时等于k,可以假设: a=k-b或b=k-a 因此,通过
numbers
和一个特定值k
,找出当求和时numbers
中的任意两个元素是否等于k
。在r
中,如何用单遍算法而不是穷举搜索来解决这个问题
实际上:在
r
中编写最佳函数,该函数接收一个列表numbers
和一个特定值k
,如果numbers
中有两个元素的和等于k
,则返回TRUE
。如果没有,则返回FALSE
此问题可能被定义为:数字中是否有a
和b
,例如:
a+b=k
?考虑到您已经知道了k
,并且假设实际上有两个数字在求和时等于k
,可以假设:
a=k-b
或b=k-a
因此,通过做k-numbers
,我们将基本上解决上述两个方程的右边。例如:
numbers我认为您只能在baseR中使用内置函数来实现这一点
让我示范一下-
- 使用
outer
构造一个数向量的和矩阵,比如x
。让我们将中间结果命名为y
- 使用“应用”检查与所需数字相等的
元素,如k
。我使用了arr.ind
argument=T
,这样输出又是矩阵格式的索引
- 在获得所需结果的地方,创建一个包含
x
值的最终矩阵
谢谢你的回复。然而,我相信之前发布的解决方案也使用了BaseR,看起来更简单一些?我错过什么了吗?谢谢:)我还要补充一点,如果有任何两个元素满足问题,那么您使用的任何操作都应返回TRUE,如果没有,则返回FALSE。请注册您的第一条评论-这是个人的选择,因为这两种情况下的结果格式不同。注册你的第二条评论——事实上,如果这是唯一的要求,那么它非常简单,不需要编写任何自定义函数就可以完成。我正在编辑答案,以纳入这一要求。我还想补充一点,接受你认为正确的答案是一种良好的做法。但是,每个问题只能接受一个答案。不过,只要你觉得正确,每个问题的答案你都可以投票。当然!我只是好奇你是否认为另一个答案不对。我喜欢你的编辑,没有考虑使用外部
。建议将any()
更改为sum()>0
?哪个更快?
sum_finder <- function(numbers, k) {
diff_sequence <- k - numbers
condition <- any(numbers %in% diff_sequence)
return(condition)
}
sum_finder <- function(numbers, k) {
return(any(numbers %in% (k - numbers)))
}
# as posted by @eduardokapp
function1 <- function(numbers, k) {
any(numbers %in% (k - numbers))
}
# as posted by @AnilGoyal
function2 <- function(numbers, k) {
any(apply(outer(numbers, numbers, `+`), 1, function(x){x == k}))
}
# Performance Comparison
numbers <- sample(500, 500)
k <- sample(500, 1)
microbenchmark::microbenchmark(
function1(numbers, k),
function2(numbers, k)
)
x <- 25:40
k <- 61
y <- outer(x, x, `+`)
matrix(x[which(apply(y, 1, function(x){x == k}), arr.ind = T)], ncol = 2)
[,1] [,2]
[1,] 36 25
[2,] 35 26
[3,] 34 27
[4,] 33 28
[5,] 32 29
[6,] 31 30
[7,] 30 31
[8,] 29 32
[9,] 28 33
[10,] 27 34
[11,] 26 35
[12,] 25 36
x <- 25:40
k <- 61
sum(outer(x, x, `+`) == k) > 0
[1] TRUE
#OR
x <- 1:6
k <- 1
sum(outer(x, x, `+`) == k) > 0
[1] FALSE