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

 
Nikolai Semko :
사실 모든 알고리즘은 동일합니다. 모든 사람이 요소별로 배열 요소 수정을 수행하고 모든 사람이 Fedoseev 변형을 사용하는 경향이 있습니다. 그는 추가로 아무것도 없습니다.
저에게만 ArrayCopy를 사용하는 블록에서 발생하므로 속도 향상이 존재합니다.

그리고 베드로는 어떻습니까? 모두 "찢어"? 아무도 그의 코드를 체커에 삽입하지 않았습니다. 그가 어떻게, 그리고 얼마나 많은 사람들을 게시판에 흩어놓았는지 궁금합니다.

 
Vladimir :

그 이유를 곰곰이 생각해보고 0.1%가 아닌 1/3의 요소가 삭제되도록 2줄을 수정했습니다.

결론: 숫자 사이에 임의의 거리가 있는 배열의 주소를 계산하는 것은 행의 요소를 처리하는 것보다 여전히 나쁩니다. 주어진 단계, 특히 1단계에서 컴파일러는 이를 최적화할 수 있습니다.

그리고 무슨 말인지 이해합니다. 어쩐지 그 문장이 그리웠다.
예, 물론 이것은 이해할 수 있지만 모든 세 번째 요소를 버려야 하는 경우에도 마찬가지입니다(그런 다음 ArrayCopy 가 작동을 멈추고 이득이 사라짐). 다른 그림이 있습니다.

 2018.11 . 13 13 : 46 : 01.524 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 66640 микросекунд
2018.11 . 13 13 : 46 : 01.531 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5932 микросекунд
2018.11 . 13 13 : 46 : 01.537 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5142 микросекунд
2018.11 . 13 13 : 46 : 01.544 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5831 микросекунд
2018.11 . 13 13 : 46 : 01.552 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5493 микросекунд
2018.11 . 13 13 : 46 : 01.563 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 958449 ; элементов - 667202 ; время выполнения = 11026 микросекунд

Pavlov에는 실제로 작동하지 않는 옵션이 있지만 올바른 체크섬을 제공한 다음 잘못된 체크섬을 제공하기도 합니다.

파일:
 
Artyom Trishkin :

그리고 베드로는 어떻습니까? 모두 "찢어"? 아무도 그의 코드를 체커에 삽입하지 않았습니다. 그가 어떻게, 그리고 얼마나 많은 사람들을 게시판에 흩어놓았는지 궁금합니다.

그리고 나는 그의 상상의 비행을 결코 이해하지 못했습니다. 그는 완성된 기능을 제공하지 않았습니다. 그리고 내가 그를 위해 쓰기를 마치면, 그들은 내가 그곳에서 모든 것을 다시 만들었다고 다시 나를 비난할 것입니다. ))

 
Nikolai Semko :

그리고 나는 그의 상상의 비행을 결코 이해하지 못했습니다. 그는 완성된 기능을 제공하지 않았습니다. 그리고 내가 그를 위해 쓰기를 마치면, 그들은 내가 그곳에서 모든 것을 다시 만들었다고 다시 나를 비난할 것입니다. ))

글쎄요, 모바일에서 그의 코드를 보니 그가 "직접적으로" 작성하고 있다는 느낌을 받았습니다. 따라서 그는 기능을 제공하지 않았습니다. 그는 모든 것을 연속적으로 가지고 있습니다. 그리고 그의 스크립트에는 함수가 아니라 직선 코드가 있습니다. 그런 스크립트가 기능을 내포하지 않을 수도 있다는 것은 분명하지만... goto만으로는 날아가기에 충분하지 않다고 생각합니다 :)

그러나 이것들은 단지 나의 감정일 뿐입니다.

 
Nikolai Semko :

Pavlov의 버전이 수정되었습니다.
당신은 이상한 가치를 가지고 있습니다. 프로파일링 후 스크립트를 실행했거나 코드를 다시 컴파일하지 않고 디버거를 실행했습니까?
나는 다음과 같이 얻는다.

그리고 귀하의 변형에서 잘못된 체크섬을 생성합니다. 그리고 일반적으로 어레이를 추가로 생성하면 이점이 없지만 프로세스가 느려지고 리소스가 추가로 소모됩니다.

수정했습니다.

 int ArrayDelV( int &a[], const int val)
  { // вариант Vladimir
   bool Flags[]; // массив пометок на удаление
   int N,NewN,i,j;
   N= ArraySize (a);
   ArrayResize (Flags,N);
   if ( ArrayInitialize (Flags, false )!=N) return (- 1 );
   NewN=N; // Сколько останется
   for (i= 0 ;i<N;i++) { if (a[i]==val) {Flags[i]= true ; NewN--;}}
   j= 0 ;
   for (i= 0 ;i<N;i++) { if (!Flags[i]) {a[j]=a[i]; j++;}}
   ArrayResize (a,NewN);
   return (NewN);
  }

나는 그것을 여러 번 실행했는데 결과가 매달려 있습니다. 컴퓨터가 많이로드되어 토요일에만 출시됩니다. 다른 사람에게 확인하는 것이 좋습니다. 그러나 이제 체크섬이 일치합니다. 매우 희소한 정크 값의 경우(0.1%)

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) 파투샤크 변형: 체크섬 = 497057781; 요소 - 998984; 실행 시간 = 418662마이크로초
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) Korotky 변형: 체크섬 = 497057781; 요소 - 998984; 실행 시간 = 10683마이크로초
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) Fedoseev 변형: 체크섬 = 497057781; 요소 - 998984; 실행 시간 = 9740 마이크로초
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) Semko 변형: 체크섬 = 497057781; 요소 - 998984; 실행 시간 = 4691마이크로초
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) Pavlov 변형: 체크섬 = 497057781; 요소 - 998984; 실행 시간 = 12512마이크로초
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) 니키틴 변형: 체크섬 = 497057781; 요소 - 998984; 실행 시간 = 10720마이크로초
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) 블라디미르 옵션: 체크섬 = 497057781; 요소 - 998984; 실행 시간 = 17197 마이크로초

세 번째

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) 파투샤크 변형: 체크섬 = 668222; 요소 - 667065; 실행 시간 = 65732마이크로초
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) Korotky 변형: 체크섬 = 668222; 요소 - 667065; 실행 시간 = 4757 마이크로초
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) Fedoseev 변형: 체크섬 = 668222; 요소 - 667065; 실행 시간 = 4815마이크로초
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Semko 변형: 체크섬 = 668222; 요소 - 667065; 실행 시간 = 5812마이크로초
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Pavlov 변형: 체크섬 = 1001157; 요소 - 667065; 런타임 = 0마이크로초
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) 니키틴 변형: 체크섬 = 668222; 요소 - 667065; 실행 시간 = 4749마이크로초
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) 블라디미르 옵션: 체크섬 = 668222; 요소 - 667065; 실행 시간 = 9814마이크로초
Pavlov는 다시 실패합니다.

대부분의 경우 for 루프를 통한 통과 속도를 높이는 것에 대한 나의 결론은 MQL 언어에 대해 올바르지 않습니다.

그리고 추가 배열을 생성하면 불필요한 배열을 대량 삭제하는 실제 트랜잭션의 기간을 줄여 필요한 시작 순간까지 배열을 변경하지 않고 유지해야 합니다. 지금까지 데이터 보안은 여기에서 논의되지 않았습니다.

 
Artyom Trishkin :

그리고 베드로는 어떻습니까? 모두 "찢어"? 아무도 그의 코드를 체커에 삽입하지 않았습니다. 그가 어떻게, 그리고 얼마나 많은 사람들을 게시판에 흩어놓았는지 궁금합니다.

그럼에도 불구하고 그는 Peter의 옵션을 마스터했습니다.

 int PeterArray( int &Arr[], const int val) // вариант Peter Konov
  {
   int deleted= 0 ,q= 0 ;
   for ( int a1= 0 ; a1< ArraySize (Arr); a1++)
     {
       if (deleted)Arr[q]=Arr[q+deleted];
       if (Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize (Arr,q);
   return (q);
  }

아주 컴팩트하고 제대로 작동합니다. 피터에게 경의를 표합니다.
하지만 속도면에서는 끝에서 2위를 차지한다. 또는이 지점 소유자의 원래 버전을 제외하고 속도에 완전히 부적합한 끝에서 첫 번째 장소.

 2018.11 . 13 14 : 08 : 32.857 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 150492 микросекунд
2018.11 . 13 14 : 08 : 32.861 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 2441 микросекунд
2018.11 . 13 14 : 08 : 32.865 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 1852 микросекунд
2018.11 . 13 14 : 08 : 32.867 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 779 микросекунд
2018.11 . 13 14 : 08 : 32.871 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 2374 микросекунд
2018.11 . 13 14 : 08 : 32.876 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 3720 микросекунд
2018.11 . 13 14 : 08 : 32.885 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 7266 микросекунд
파일:
 

:-) 순서를 지키려고 하지 않으면 시간은 O(1) , 모든 루프의 총 단계 수 = 배열 크기

너무 게으른 코딩 :-)

1. 왼쪽에서 오른쪽으로 첫 번째 3구를 찾고 있습니다.

2. 발견되면 오른쪽에서 왼쪽으로 3이 아닌 항목을 찾습니다. 발견된 항목을 3의 위치에 복사합니다.

1,2가 교차할 때까지 계속하고 복사본 수만큼 배열을 자릅니다.

이념적으로 이것은 정확히 " 버블 정렬 "의 1/2입니다 :-) 복사하는 대신 스왑을 수행하면 출력이 부분적으로 정렬된 배열입니다(3개 모두 오른쪽으로 이동됨)

 
Реter Konow :

또 다른 개선 사항:

죄송합니다. 그들은 당신이 훌륭한 마케터지만 프로그래머는... 나보다 더 나쁘다고 합니다.

1. 삭제된 내부 정수 변수는 초기화되지 않습니다. 즉, 0과 같지만 보장되지는 않습니다. 루프에서 백시프트는 두 가지 이유로(처음으로) 발생하지 않습니다.

2. (메인) 먼저 배열의 요소를 이동한 다음 삭제된 변수의 값을 늘리면 주기가 있고 다음 이동은 필요 이상으로 1만큼 발생합니다. 즉, 코드가 눈사태처럼 원래 배열을 파괴합니다.

 
익스트림 옵션:
배열에 추가 요소가 없습니다.
 2018.11 . 13 14 : 44 : 33.512 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 137515 микросекунд
2018.11 . 13 14 : 44 : 33.514 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 1408 микросекунд
2018.11 . 13 14 : 44 : 33.517 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 1807 микросекунд
2018.11 . 13 14 : 44 : 33.519 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 672 микросекунд
2018.11 . 13 14 : 44 : 33.522 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 1433 микросекунд
2018.11 . 13 14 : 44 : 33.527 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 4025 микросекунд
2018.11 . 13 14 : 44 : 33.533 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 4297 микросекунд
배열에서 모든 추가 요소:
 2018.11 . 13 14 : 47 : 15.338 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 2000000000 ; элементов - 0 ; время выполнения = 2093 микросекунд
2018.11 . 13 14 : 47 : 15.341 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 2257 микросекунд
2018.11 . 13 14 : 47 : 15.343 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 1078 микросекунд
2018.11 . 13 14 : 47 : 15.345 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 665 микросекунд
2018.11 . 13 14 : 47 : 15.348 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 1580 микросекунд
2018.11 . 13 14 : 47 : 15.353 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 4064 микросекунд
2018.11 . 13 14 : 47 : 15.362 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 7982 микросекунд
파일:
 
Алексей Тарабанов :

죄송합니다. 그들은 당신이 좋은 마케팅 담당자이지만 프로그래머는 ... 나보다 더 나쁘다고 말합니다.


Alexey, 당신은 정말로 젊은 인재를 죽이고 있습니다 ...

이 마케터는 5년 동안 판매를 시작하지 못했습니다. 그리고 당신은 프로그래머로서 그가 더 나쁘다고 말합니다 :-)