2016-11-07 3 views
0

저는 1 백만 개의 정수가있는 벡터를 오름차순으로 가지고 있으며 1000 개의 서브 세트가있는이 벡터를 정렬했습니다.정렬 된 벡터에서 여러 일치를 수행 할 때 시작 위치를 정의하는 것이 더 빠릅니까?

더 빠를 것은 무엇입니까? samplevec가 커지면 두 번째 버전이 더 빨라질 것입니까?

samplevec=sort(sample(1:10000000, 1000000)) 
matchvec=sort(sample(samplevec, 10000)) 

for (i in matchvec) { 
index=match(i, samplevec) 
print(index) 
} 

또는

samplevec=sort(sample(1:10000000, 1000000)) 
matchvec=sort(sample(samplevec, 10000)) 

previous=1 
for (i in matchvec) { 
index=match(i, samplevec[previous:length(samplevec)]) 
previous=index 
print(index) 
} 

답변

1

그것은 벤치 마크 쉽다. 여기에 단지 두 가지 시점이 있습니다. 포주와 시간의 포인트 수를 늘리기 위해 자동화 할 수 있습니다.

library(microbenchmark) 

set.seed(357) 

samplevec = sort(sample(1:1000, 1000)) 
matchvec = sort(sample(samplevec, 1000)) 

microbenchmark(
    version1 = { 
    previous=1 
    for (i in matchvec) { 
     index=match(i, samplevec[previous:length(samplevec)]) 
     previous=index 
    }}, 
    version2 = { 
    for (i in matchvec) { 
     index = match(i, samplevec) 
    }} 
) 

Unit: milliseconds 
    expr  min  lq  mean median  uq 
version1 10.619105 10.711438 12.057713 10.811051 12.71902 
version2 2.419441 2.487062 2.853868 2.506603 2.56024 

다음은 두 번째 요점입니다. 이것은 좀 더 길다.

set.seed(357) 

samplevec = sort(sample(1:100000, 100000)) 
matchvec = sort(sample(samplevec, 100000)) 

microbenchmark(
    version1 = { 
    previous=1 
    for (i in matchvec) { 
     index=match(i, samplevec[previous:length(samplevec)]) 
     previous=index 
    }}, 
    version2 = { 
    for (i in matchvec) { 
     index=match(i, samplevec) 
    }} 
) 

Unit: seconds 
    expr  min  lq  mean median  uq 
version1 108.96069 109.61137 110.87308 110.70554 111.61337 
version2 15.63668 15.71792 16.20434 15.84646 16.07487 
관련 문제