Какой самый быстрый / самый эффективный способ найти младший значащий бит в целом числе в R?

Как вы правильно отметили, один или несколько токенов / идентификаторов вызывают проблему. Механизм автокорреляции VS не подходит для них, и они воспроизводятся как записанные вместо использования динамических значений, генерируемых сервером для каждого сеанса клиента в реальном времени.

Чтобы исправить это, вам нужно найти и вручную коррелируют такие значения динамики, создавая правила и параметры извлечения, которые могут быть довольно трудоемкими. Проверьте наш Web Test Builder для Visual Studio здесь , чтобы автоматически создавать отсутствующие экстракторы и параметр.

3
задан Viktor 19 January 2019 в 17:06
поделиться

2 ответа

Следующее намного быстрее:

f <- function(x){
  log2(bitwAnd(x,-x))
}

Для сравнения:

g <- function(x){
  unlist(lapply(x, function(z) min(which(as.integer(intToBits(z)) == 1))-1))
}

Быстрый тест:

> library(microbenchmark)
> tests <- floor(runif(1000,1,2^31))
> sum(f(tests) == g(tests)) #just to check
[1] 1000
> microbenchmark(f(tests),g(tests))
Unit: microseconds
     expr      min        lq       mean   median        uq       max neval
 f(tests)   38.435   40.5515   45.82673   42.667   45.1355   146.337   100
 g(tests) 1985.940 2083.9680 2530.79036 2131.218 2287.4280 11749.204   100
0
ответ дан John Coleman 19 January 2019 в 17:06
поделиться

Если у вас длинные векторы и вы хотите перейти на C ++, вам может помочь следующий код (вместе с Rcpp и функцией ffs из strings.h):

#include <Rcpp.h>
#include <strings.h>
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::IntegerVector lsb(const IntegerVector x)
{
  IntegerVector res(x.size());
  std::transform(x.begin(), x.end(), res.begin(), ffs);
  return(res-1);  # To start from 0
}

Сохраните код выше в виде файла, скажем lsb.cpp, и скомпилируйте его, используя sourceCpp("lsb.cpp") из пакета Rcpp.

Это немного быстрее - по крайней мере для более длинных входных векторов, где издержки становятся незначительными

> x <- floor(runif(10000,1,2^31))
> microbenchmark::microbenchmark(f(x), g(x), lsb(x))
Unit: microseconds
   expr       min         lq        mean    median         uq       max neval
   f(x)   121.771   129.6360   168.91273   133.241   151.0110  1294.667   100
   g(x) 36165.757 40508.1740 50371.45183 42608.686 60460.5270 94664.255   100
 lsb(x)    25.767    26.8015    34.58856    33.035    35.2385   156.852   100
0
ответ дан ekstroem 19 January 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: