주어진 요소의 배열 지우기 - 페이지 21

 
어떻게 행동해야 할지 모르겠어
 ArraySetAsSeries (array, true );
마지막 버전에서도 그를 확인했습니다. 필요한 사람이 사용할 수 있습니다.
파일:
 
Реter Konow :

권리. 그러나 제공된 알고리즘이 빈 공간을 남기지 않는다는 것을 어떻게 알 수 있습니까? 체크섬은 이것을 증명하지 않습니다. 요소의 수도 있습니다. 결국 이 함수는 배열의 크기가 조정되기 전의 요소를 계산합니다.

제시된 거의 모든 것에서 이것은 NULL로 요청을 보내 문제 없이 구현됩니다.

피터 코노우 :

알고리즘에 대한 또 다른 요구 사항이 있습니다. 즉, 불필요한 요소를 제거한 후 배열 내부에 요소를 올바르게 배치해야 합니다. 이 검사를 먼저 수행했어야 합니다. 다음으로 속도 테스트입니다.

무엇을 반환하는 코드에 설명이 있습니다. 혼합 배열이 있습니다. 다른 배열에 있습니다.

PS 글쎄요. 내 기능에서 일부 수표가 등록되었지만 사용되지는 않습니다. 그러나 이 모든 것과 그 이상이 있습니다.

 

나는 참가자들의 전문성과 그들의 위치를 의심하지 않는다. 방금 체크섬 검사의 결함과 새 어레이에서 요소의 올바른 배열에 대한 추가 검증의 필요성을 지적했습니다.

이 모든 것이 맞다면 나는 당연히 끝에서 두 번째 자리를 차지했습니다.

내 연습에서는 특정 작업의 속도에 대해 거의 생각하지 않습니다. 나는 솔루션의 간결성과 명확성에 더 관심이 있습니다. 이 항목이 다음과 같이 나와 놀랐습니다.

 if (Arr[q]==val){deleted++; q--;}

느려질 수 있습니다.

그러나 알고리즘을 평가하는 기준을 하나 더 추가한다면 - 솔루션의 간결함 - 아마도 내가 첫 번째 위치에 있을 것입니다.

속도와 간결성이라는 두 가지 기준을 결합하고 알고리즘의 평균 점수를 계산하면 표에서 더 높은 자리를 차지할 것입니다.

그러나 Fedoseev의 버전은 내 것보다 훨씬 더 간결합니다.
 
Реter Konow :

그러나 알고리즘을 평가하는 기준을 하나 더 추가한다면 - 솔루션의 간결함 - 아마도 내가 첫 번째 위치에 있을 것입니다.

메인 루프의 버전:

 for ( int a1= 0 ; a1< ArraySize (Arr); a1++)
     {
       if (deleted)Arr[q]=Arr[q+deleted];
       if (Arr[q]==val)
        {
         deleted++; 
         q--;
        }
      q++;
     }

그리고 이것은 페도세바입니다:

 for (;i<sz;i++)
     {
       if (a[i]!=v)
        {
         a[j]=a[i];
         j++;
        }
     }

두 옵션 모두 동일한 작업을 수행합니다. 누가 더 간결합니까?

 
Nikolai Semko :

메인 루프의 버전:

그리고 이것은 페도세바입니다:

두 옵션 모두 동일한 작업을 수행합니다. 누가 더 간결합니까?

그에게. 그는 대신

 for ( int a1= 0 ; a1< ArraySize (Arr); a1++)
 for (;i<sz;i++)

이것은 더 간결합니다.))

 
Реter Konow :

그에게. 그는 대신

이것은 더 간결합니다.))

컴파일러와 동일합니다.

불필요한 Peter가 많기 때문에 가장 느리게 작동합니다(나는 주제의 첫 번째 옵션을 전혀 고려하지 않음)

Fedoseev에는 주기의 한 패스에서 하나 의 수표, 하나 의 할당 및 하나 의 증분이 있습니다.(나는 주기를 구성할 때 검증과 증분을 고려하지 않습니다).

두 개의 검사, 두 변수의 합 하나 , 증분 세 개 , 할당 하나 가 있습니다.

 
for ( int a1= 0 ; a1< ArraySize (Arr); a1++)

컴파일러에 의한 최적화에 대한 모든 희망, 그렇지 않으면 ArraySize 가 각 반복에서 실행됩니다.

 
Aleksey Lebedev :

컴파일러에 의한 최적화에 대한 모든 희망, 그렇지 않으면 ArraySize가 각 반복에서 실행됩니다.

예, 컴파일러는 분명히 루프에서 배열 차원 이 변경되지 않으면 이 함수를 한 값으로 독립적으로 대체하여 이 함수를 한 번만 평가하는지 확인합니다.
어쨌든 이렇게 하면:

 const int size= ArraySize (Arr);
for ( int a1= 0 ; a1<size; a1++)

함수의 실행 시간은 변경되지 않습니다.

따라서 더 간결하게 작성하려면 Peter가 한 것처럼 정확하게 작성하는 것이 좋습니다. :)
하지만 개인적으로 눈이 아프다는 데 동의합니다. 함수가 매번 호출될 것 같은 느낌.

 
Nikolai Semko :

하지만 개인적으로 눈이 아프다는 데 동의합니다. 함수가 매번 호출될 것 같은 느낌.

imho 컴파일러에게 선택권을주지 않는 것이 좋습니다)

물어보자,

if(count>6) { 배열 복사

6개 이상 - 과학적 찌르기의 방법으로 값을 얻었거나 어떤 정당성이 있습니까?)
 
Aleksey Lebedev :

imho 컴파일러에게 선택권을주지 않는 것이 좋습니다)

물어보자,

if(count>6) { 배열 복사

6개 이상 - 과학적 찌르기의 방법으로 값을 얻었거나 어떤 정당성이 있습니까?)

네, 바로 그 사람입니다. 과학적인 찌르기 방법. 사실, 내 관찰에 따르면 5에서 8까지입니다. 매번 이 숫자를 자동 조정하여 이 프로세스를 자동화할 수 있습니다. 실제로 다른 프로세서와 시스템에서 이 숫자는 다를 수 있습니다.

예를 들어 이 원칙에 따라 CCanvas 클래스의 ArrayCopy와 ArrayFill을 모두 변경하면 캔버스 속도에서 좋은 이득을 얻을 수 있습니다.