首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用二进制搜索在向量中找到最近的值

用二进制搜索在向量中找到最近的值
EN

Stack Overflow用户
提问于 2013-11-21 22:33:21
回答 7查看 31K关注 0票数 51

作为一个愚蠢的玩具例子,假设

代码语言:javascript
复制
x=4.5
w=c(1,2,4,6,7)

我想知道是否有一个简单的R函数可以在x中找到与w最接近的索引。因此,如果foo是该函数,foo(w,x)将返回3。函数match是正确的想法,但似乎只适用于精确匹配。

解决方案这里 (例如which.min(abs(w - x))which(abs(w-x)==min(abs(w-x)))等)都是O(n)而不是log(n) (我假设w已经排序了)。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-11-21 22:48:44

您可以使用data.table进行二进制搜索:

代码语言:javascript
复制
dt = data.table(w, val = w) # you'll see why val is needed in a sec
setattr(dt, "sorted", "w")  # let data.table know that w is sorted

注意,如果列w尚未排序,则必须使用setkey(dt, w)而不是setattr(.)

代码语言:javascript
复制
# binary search and "roll" to the nearest neighbour
dt[J(x), roll = "nearest"]
#     w val
#1: 4.5   4

在最后一个表达式中,val列将包含您要查找的内容。

代码语言:javascript
复制
# or to get the index as Josh points out
# (and then you don't need the val column):
dt[J(x), .I, roll = "nearest", by = .EACHI]
#     w .I
#1: 4.5  3

# or to get the index alone
dt[J(x), roll = "nearest", which = TRUE]
#[1] 3
票数 44
EN

Stack Overflow用户

发布于 2015-04-10 03:38:16

代码语言:javascript
复制
R>findInterval(4.5, c(1,2,4,5,6))
[1] 3

将与价格是正确的匹配(最近而不超过)。

票数 46
EN

Stack Overflow用户

发布于 2018-10-02 18:52:23

请参见match.closest()包中的MALDIquant:

代码语言:javascript
复制
> library(MALDIquant)
> match.closest(x, w)
[1] 3
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20133344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档