我撰寫了下面的代碼來計算 Collat??z 序列。基本演算法步驟與 CRAN 提供的庫“ collat??z ”中使用的代碼幾乎相同。(源 tarball 在這里) 但是,我的 hack 代碼運行速度比庫的hailstone_sequence函式慢 10 到 50 倍。
我不知道為什么,除非通過存盤重用的常量lockBinding會有所不同。任何人都可以看看這兩組代碼并提出導致差異的原因嗎?我查看了運行的結果,Rprof并沒有什么明顯的地方。
{{我的代碼如下}}
collatz<-function(x, div=2, mul=3, add= 1, maxKnown=1, maxiter = 1000) {
y <- as.bigz(x[1]) #silent dumping
maxKnown <- as.bigz(floor(maxKnown))
cyclic = FALSE
for (jj in 2:maxiter) {
y[[jj]] <- collatz_fun(y[[jj-1]],div,mul,add)
# bigz/bigz returns a bigq even if that bigq has denominator 1
# so we do a divq, "%/%", instead of div, to just get the bigz.
if (y[[jj]] <= maxKnown ) break
if(any(y[[jj]] == y[[1:(jj-1)]])) {
cyclic = TRUE
break
}
}
if (jj >= maxiter) warning('not converged (yet)')
return(invisible(list(y = y, div = div, mul=mul, add= add, cyclic = cyclic) ) )
}
collatz_fun <- function(n, d, m, a){
if (n%%d ==0 ) ( n %/% d ) else (m*n) a
}
uj5u.com熱心網友回復:
原來我是在自欺欺人!對于一些特定的起始值,例如 737 , hailstone_sequence速度更快。但是,總的來說,我的“collat??z”代碼更快。這是一個表格,顯示了大小增加的亂數的 tictoc 時間(以毫秒為單位)。
Collatz, ms hailstone, ms start
[1,] "2" "2" "89"
[2,] "7" "8" "505"
[3,] "10" "13" "4760"
[4,] "5" "8" "46125"
[5,] "57" "89" "706047"
[6,] "52" "77" "7426598"
[7,] "114" "179" "71693193"
[8,] "76" "128" "195808257"
[9,] "75" "111" "4082229980"
[10,] "89" "133" "29816905510"
[11,] "56" "86" "850451975896"
[12,] "240" "390" "5056177278457"
[13,] "179" "288" "23497279632257"
[14,] "133" "217" "667081939494479"
[15,] "183" "286" "8724848384524922"
[16,] "126" "199" "20376642404589490"
[17,] "175" "271" "195397921609459067"
[18,] "96" "146" "9068592584569983840"
[19,] "203" "317" "98435723276783667011"
[20,] "189" "288" "906945269554050299597"
[21,] "586" "934" "1942663519120549652842"
[22,] "288" "414" "32708032219025335530871"
[23,] "331" "459" "815908776331672807666938"
[24,] "379" "581" "6894029370205376937364345"
[25,] "811" "1182" "49809117889125237920557852"
[26,] "415" "605" "583415680232489269692462895"
[27,] "559" "793" "9220767227146002168685568453"
[28,] "733" "1082" "60679473842196546847954821109"
[29,] "894" "1228" "698657027947326650828429401951"
[30,] "1320" "1932" "8336688931823299843178876023479"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/533231.html
標籤:r表现
上一篇:使用具有99.7%快取率的Cloudflare時,服務器位置有多重要?
下一篇:優化去除名字中敬語的功能
