2016-12-15 65 views
0

我想優化一個計算密集程度非常高的代碼,因爲它處理80個元素集的子集。將值存儲在深度未知的嵌套列表中

我想要加速的關鍵一步是查找我的循環中的當前子集是否已經被處理。目前,我檢查這個子集是否包含在相同大小k(基數)的已處理子集中。將逐步處理的子集存儲在嵌套列表中以檢查子集是否已被處理(O(1)而不是O中的搜索(80選擇k))會更快。

我沒有問題,編寫一個函數來檢查,如果當前子集是我處理過的子集的嵌套列表:access(treated, subset=c(2,5,3))返回TRUE當且僅當treated[[2]][[5]][[3]]==TRUE

但是,我不知道如何來存儲(我的內循環)我處理列表中的當前子集。我想這樣的事情是可能的:treated[h] <- TRUE其中h是我當前的子集(在上面的示例中:h=c(2,5,3)

我面臨的主要問題是「[[..]]」的數量不同在我的循環內。我是否有其他選擇,而不是完成h,使其長度爲80,並放置80「[[..]]」的序列,如:treated[[h[1]]][[h[2]]]...[[h[80]]] <- TRUE

回答

2

如果h值的矢量然後

"[["(treated, h) 

遞歸子集的列表項。 例如,我創建了一個(不那麼高度)嵌套列表:

> a 
[[1]] 
[[1]][[1]] 
[1] 2 

[[1]][[2]] 
[[1]][[2]][[1]] 
[1] 3 

[[2]] 
[1] 1 

下面的命令,正確地遞歸地應用項子集到列表:

> "[["(a, c(1,2,1)) 
[1] 3 

遞歸子集劃分向量的長度可以在不確定[[..]]的數量的情況下變化。例如,使用相同的語法對兩個深度級進行子集化:

> "[["(a, c(1,2)) 
[[1]] 
[1] 3 
+0

太棒了!我不知道這個命令。它是適用於其他事物的更一般語法的一部分嗎? – bixiou

+0

順便說一句,你的解決方案適用於我的情況(完全),因爲我從來沒有輸入元素(i,j)在處理過的嵌套列表中輸入元素(i,j,k)。 – bixiou

+1

LISP是影響R結構的語言之一(實際上我不是LISPER)。在LISP中,所有操作員實際上都是功能。 R中也是這樣:每個操作符都是一個函數調用。 –