2013-08-15 5 views
5

ABの2つのセットが与えられます。間隔では、私はc(2,5)のような整列した整数のペアを意味します。私はAから1つと、Bから1つの間隔のすべてのペアを見つける必要があります。例えば間隔(セグメント)のペアごとの重複を見つける

次のようにAとBがある場合:

A=c(c(1,7), c(2,5), c(4, 16)) 
B=c(c(2,3), c(2,20)) 

そしてFindOverlap(A, B)Aの第3間隔はBの第一間隔と重ならないためのみゼロ要素である(以下のような行列を返すべき):

1 1 
1 1 
0 1 

効率的なアイデアはありますか?

答えて

6

間隔パッケージは、ここにソリューションを提供しているようだ:

require("intervals") 
A=rbind(A1=c(1,7), A2=c(2,5), A3=c(4, 16)) 
B=rbind(B1=c(2,3), B2=c(2,20)) 

# here you can also define if it is an closed or open interval 
Aint<-Intervals(A) 
Bint<-Intervals(B) 

# that should be what you are looking for  
interval_overlap(Aint, Bint) 

は素敵なデモンストレーションのために参照してください。Demo

HTH

+0

ワンダフル!ありがとうございました – Ali

1

ここで私は同じことを行うために書いた少し機能があります。 を実質的にに改善することができます。しかし面白い問題。

f <- function(A,B){ 
    tmpA <- lapply(A , function(x) min(x):max(x)) 
    tmpB <- lapply(B , function(x) min(x):max(x)) 
    ids <- expand.grid(seq_along(tmpA) , seq_along(tmpB)) 
    res <- mapply(function(i,j) any(tmpA[[i]] %in% tmpB[[j]]) , i = ids[,1] , j = ids[ ,2]) 
    out <- matrix(res , nrow = length(tmpA)) 
    return(out * 1) 
    } 

f(A,B) 
    [,1] [,2] 
[1,] 1 1 
[2,] 1 1 
[3,] 0 1 
+0

あなたの答えをありがとう。時間複雑度はO(n * m * p)であるが、nはA内の項目の数であり、mはB内の項目の数であり、pは最大の長さであるが、基本R機能のみを使用するという興味深い考えである。間隔。 – Ali

関連する問題