![](/img/trans.png)
[英]Iteratively and efficiently adding elements to a list attribute of vertices in R igraph
[英]Efficiently adding or removing elements to a vector or list in R?
我正在實現一個算法,該算法涉及從集合中添加和刪除大量內容。 在R中,這很慢,因為據我所知,從向量中添加或刪除內容很慢,因為必須重新分配整個向量。 有沒有辦法更有效地做到這一點?
編輯:我當前的解決方案是使用一個布爾向量,其長度與可以在集合中的事物列表相同,並將其用作成員資格表。
R Inferno的第2章對此有一些有趣的評論,包括用於減少內存碎片和分配開銷的perdiodic增長對象。
如果您知道集合的最終大小是什么,那么您建議的方法可能是最好的 - 即使用適當的成員資格向量來自整個宇宙的subset
。 很難知道什么是最好的,但沒有看到你正在嘗試做什么。
如果可以,在算法期間初始化向量使其長度等於其最大長度可能會有所幫助。
例如
vec <- rep(NA,10)
vec[1:3] <- 1:3
vec[4:5] <- 4:5
vec[6:10] <- 6:10
而不是
vec <- 1:3
vec <- c(vec,4:5)
vec <- c(vec,6:10)
相比
> system.time({vec <- rep(NA,10^4); for (i in 1:(10^4)) vec[i] <- i })
user system elapsed
0.043 0.001 0.044
至
> system.time({vec <- NULL; for (i in 1:(10^4)) vec <- c(vec,i) })
user system elapsed
0.249 0.089 0.335
很難說你想要什么。 也許你真的想要像push和pop這樣的堆棧命令。 以下不是那個。 但這是一個快速的解決方案。
分配足夠大的矢量以容納您需要的所有類型的項目。 將每個值設置為NA。 添加項目很簡單。 刪除項目會再次將它們設置為NA。 使用向量只是na.omit(myVec)
myVec <- numeric (maxLength) # a vector of maximum length
is.na(myVec) <- 1:maxLength # set every item in myVec to NA
myVec[c(2,6,20)] <- 5 # add some values
na.omit(myVec)
#This will also work if you can initialize all of your values to something that you know you won't need.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.