2011-08-31 5 views
1

이다, 코드가 명백해 :선택적 패턴이 가장 효율적인 방법으로 값을 확보 따기 : 속도가 나는 다음과 같은 문제가 문제

In[1]:= f[1][{1, 2}] = 112 
Out[1]= 112 
In[2]:= f[1][{3, 4}] = 114 
Out[2]= 114 
In[3]:= f[2][{1, 6}] = 216 
Out[3]= 216 
In[4]:= f[2][{2, 7}] = 227 
Out[4]= 227 
In[5]:= DownValues[f] 
Out[5]= {} 
In[6]:= SubValues[f] 
Out[6]= {HoldPattern[f[1][{1, 2}]] :> 112, 
HoldPattern[f[1][{3, 4}]] :> 114, HoldPattern[f[2][{1, 6}]] :> 216, 
HoldPattern[f[2][{2, 7}]] :> 227} 
In[7]:= SubValues[f[1]] 
During evaluation of In[7]:= SubValues::sym: Argument f[1] at position 1 is expected to be a symbol. >> 
Out[7]= SubValues[f[1]] 

편집 : 위의 값이 하드 코딩되어 있지 않습니다. 런타임시 점진적으로 생성됩니다. 그들은 다음과 같은 알고리즘을 사용하여 구성됩니다

f[_Integer][{_Integer..}] :=0 
... 
someplace later in the code, e.g., 
index = get index; 
c = get random configuration (i.e. a pair of integers) = {n1, n2}; 
f[index][c] = f[index][c] + 1; 
which tags that configuration c has occured once more in the simulation at time instance index 

것을 마지막 줄에서 일어나는 것은 왼쪽이 오른쪽이고, F [인덱스]가 처음으로 가치를 평가되지 않는다는 점에 유의하세요 [C] 찾은 경우 찾지 못하면 0 + 1을 제공하는 오류 규칙이 사용됩니다. 발견되면 이전 값이 1 씩 증가되어 저장됩니다. 이 모든 것은 일정한 시간이어야합니다. 배열을 사용하는 경우, 요소가 추가 될 때 전체 배열을 복사해야하므로 이차 복잡성이 발생합니다.

문제는 나중에 SubValues ​​[f 1]에 패턴이없는 f 1과 관련된 정의 목록을 제공하지만 SubValues ​​구문을 사용하면 모든 항목을 검색해야한다는 것입니다. 물론 이것은 f 1 s를 추출해야하기 때문에 나중에 속도에 영향을줍니다 (예 : 1 [{1, 2}] = 112, f 1 [{3, 4}] = 114) 가능하면 매우 긴 목록에서.

Ultimatelly 문제 1 데이터 f를 수확하는 다음과 같은 구조가 반환되도록 :

{list1, list2} 

여기서

list1 = {{1,2}, {3,4}} 
list2 = {112, 134} 

I 하나는 케이스를 사용할 수 있다는 것을 알고 [하위 값 [F] suitablePattern ] 그리고 원하는 결과를 얻기 위해 결과에 대한 작업을 수행하지만이 방법을보다 효율적으로 (런타임이 여러 번 반복되므로)보다 직접적으로 효율적으로 수행하려고합니다.

감사 조란

편집 : 문제가 잘 공식화되지 않은 것으로 보인다. 하여 같은 문제의 더 나은 버전은 여기에서 찾을 수 있습니다 :

better formulated problem

그래서 처음부터 명확없는 및 사과 "배를 포기"하십시오.

답변

1

왜 하위 값을 사용합니까? 그런 다음

m = { 
     { {{1, 2}, {3, 4}}, {112, 114} }, 
     { {{1, 6}, {2, 7}}, {216, 227} } 
    }; 

: 당신이 좋아, 매트릭스에서 귀하의 정보를 넣을 경우 는 항상 가장 빠른 될 것

f[i_] := m[[i]]; 
f[1] 

가 동의

{{{1, 2}, {3, 4}}, {112, 114}} 
+0

제공합니다,하지만 난 할 수 없어 이 값들은 하드 코딩되어 있지 않기 때문입니다. 방금 예제로 입력했습니다. 이 값을 채우는 샘플링 알고리즘이 있으며 값 (112, ...)과 "키"({1,2}, {3,4})는 모두 될 수 있으며 런타임에 알 수 없습니다. 실제로 점증 적으로 추가됩니다. 간단히 말해서, 이러한 값들이 생성되는 방식은 하위 값으로 저장되도록 강제합니다. 제가 논의하고있는 문제는 추출 부분과 관련이 있습니다. – zorank

+0

물론 스마트 인덱싱을 사용하여 배열 수준에서 작동하는 구성 절차를 디자인 할 수도 있지만 그렇게하기 전에 설명 된 방식으로 원하는 값을 선택하는 스마트하고 효율적인 방법이 없다는 것을 확실히 알고 싶습니다. . 꼭 도와 줘서 고마워. – zorank

관련 문제