2010-04-20 5 views
-2

이제 어려운 부분이 있습니다. 이 함수를 어떻게 최적화합니까?PHP 사용자 정의 함수 코드 최적화

function coin_matrix($test, $revs) { 
    $coin = array(); 

    for ($i = 0; $i < count($test); $i++) { 
     foreach ($revs as $j => $rev) { 
      foreach ($revs as $k => $rev) { 
      if ($j != $k && 
       $test[$i][$j] != null && 
       $test[$i][$k] != null) { 
        if(!isset($coin[$test[$i][$j]])) { 
         $coin[$test[$i][$j]] = array(); 
        } 
        if(!isset($coin[$test[$i][$j]][$test[$i][$k]])) { 
         $coin[$test[$i][$j]][$test[$i][$k]] = 0; 
        } 

        $coin[$test[$i][$j]][$test[$i][$k]] += 1/($some_var - 1); 
       } 
      } 
     } 
    } 
    return $coin; 
} 

저는이 점이 좋지 않습니다. 배열이 클 경우 영원히 실행됩니다. $coin[$i][$j] += sum_of_pairs_in_array_row/[count(elements_of_row) - 1]

덕분에 많은 :

기능은 두 희미한 배열에서 값의 모든 쌍을 찾아 다음과 같이이를 더할 예정이다!

+0

난 그냥 배우려고 노력하지만 아래쪽 투표에 대한 감사 어쨌든거야. – Alex

+1

이 기능을 어떻게해야합니까? 때로는 코드 샘플이 먼 길을 간다,하지만 때로는 명확한 영어 설명이 더 간다. – Matchu

+0

어떻게해야할까요? – animuson

답변

1

배열에서 3 개 항목의 모든 조합을 실제로 실행해야하는 경우 대용량 배열의 경우 대부분 중단됩니다. 주요 요소는 함수가 입방체라는 것입니다. 입력이 증가하면 출력 시간이 천문학적으로 증가한다는 사실에 대해서는 아무 것도 할 수 없습니다. 예를 들어 현재 위치의 30 %까지 시간을 줄일 수는 있지만 시간이 이미 3 주인 경우 1 주일 동안 실행 시간이 거의 걸리지 않습니다.

그런데, 당신은 여전히 ​​가장 안쪽 루프 내부에 자신을 저장할 수 있습니다. 코드를 올바르게 해석하는 경우 아직 설정되지 않은 각 k 항목을 확인하는 대신 i-j 조합 당 한 번만 $coin[$i][$j] = array()을 설정할 수 있습니다.

그 이유는 함수가 수행해야 할 작업이 아직 명확하지 않기 때문에 coin 대신 $coin 대신 자신감있게 다른 편집을 제공 할 수는 없으므로 PHP 파서를 약간 저장해야합니다. 노력의. 이 이전에 지적되지 않은 이유를 모르겠어요

+0

그건 오타입니다.corrected – Alex

+1

if 문에는 여전히 두 개가 있습니다. – Matchu

+0

네, 고마워요! 또한 정정되었다. 함수 – Alex

0

: 변경 :

for ($i = 0; $i < count($test); $i++) { 

사람 :

$count = count($test); 
for ($i = 0; $i < $count; $i++) { 

당신에게 꽤 많은 시간을 절약 할 수 있습니다.

내가이 맞다면 확실하지 않다 (더 $ 테스트가 더 큰 경우),하지만 $의 some_var으로 상당히 둔화가 존재하지 않는 발생할 것 :

$coin[$test[$i][$j]][$test[$i][$k]] += 1/($some_var - 1); 

마지막으로, 내가 ' 아직도 무엇을해야할지 모르겠다. 어쩌면 좋은 입력 및 출력 값을 제공 할 수 있습니다. 귀하의 명시된 목적이 여전히 의미가 없기 때문입니다. $ 회전 속도를 올린다 게다가, 이유는 다음과 같습니다

$coin[$i][$j] += sum_of_pairs_in_array_row/[count(elements_of_row) - 1] 

대신 :

$coin[$row] += sum_of_pairs_in_array_row/[count(elements_of_row) - 1] 
+0

뒤에있는 수식에 대한 설명은 위의 설명에서 Krippendorff의 Alpha에 대한 일치 행렬을 계산합니다. 함수가 반환해야하는 행렬의 각 요소에 대한 정확한 공식은 다음과 같습니다. http://bit.ly/bS9a92 (위키 백과 링크). $ test는 2 차원 행렬입니다. $ revs는 벡터이고 $ revs의 키는 $ test의 행 번호와 일치합니다 – Alex