일반 클래스 라이브러리 - 버그, 설명, 질문, 사용 기능 및 제안 사항

 

2017년 12월 6일부터 메타트레이더 5의 표준 제공에는 데이터 저장 및 검색을 위한 효율적인 알고리즘을 구현하는 소위 일반 클래스가 포함되었습니다. 이 스레드는 이러한 클래스와 해당 클래스를 사용한 작업 예제 및 작업 개선을 위한 제안을 설명하기 위해 작성되었습니다.

제네릭이란 무엇인가 ? 제네릭 클래스는 사용자 정의 데이터 유형을 저장할 수 있는 특수 템플릿 클래스입니다. 컴파일 시 유형 식별이 수행되므로 높은 성능을 제공합니다.

왜 제네릭인가요? 일반적으로 초보 프로그래머는 배열이라는 하나의 컬렉션 유형에만 익숙합니다. 그러나 배열로 작업하는 것이 비효율적인 작업이 많습니다. 예를 들어 천 개의 주문과 같이 백만 개의 고유 식별자로 구성된 배열이 있다고 상상해 보세요. 이 천 개의 주문 중 번호가 N인 주문이 하나 있는지 어떻게 확인할 수 있을까요? 일반 클래스 중 하나를 사용하면 이 작업을 거의 즉시, 일정한 시간 동안 수행할 수 있으며 검색이 수행되는 요소의 수에 의존하지 않습니다. 일반 컬렉션의 올바른 알고리즘이 프로그래머가 개발한 알고리즘보다 더 빠를 수 있는 다른 작업도 있습니다.

일반 알고리즘. 아래는 일반 클래스의 표로, 각 클래스의 기능에 대한 간략한 설명이 나와 있습니다:

클래스설명
CArrayList.자동 크기 재분할 기능을 갖춘 배열. 배열 외부로 나가는 것을 제어할 필요 없이 배열을 활용할 수 있습니다.
CHashMap키-값 집합. 키로 요소를 효율적으로 삽입, 검색, 검색할 수 있습니다. 키는 고유해야 합니다. 예를 들어, CHashMap은 숫자가 키로 사용되는 지정된 숫자의 순서를 즉시 찾을 수 있습니다.
CHashSet고유한 요소의 집합입니다. CHashMap과 동일한 작업을 수행할 수 있지만 키가 필요하지 않습니다. 이 컬렉션에 저장된 요소는 반복되지 않아야 합니다. 또한 항목을 즉시 검색, 검색 및 추가할 수 있습니다.
CLinkedList이중 링크된 목록입니다. 항목을 쉽게 삽입하고 삭제할 수 있습니다. 그러나 원하는 항목을 찾는 데 목록의 항목 수에 따라 선형적으로 시간이 걸립니다.
CQueue힙. FIFO 형식의 큐를 구성합니다.
CStack스택. LIFO 타입의 큐를 구성합니다.
CRedBlackTree레드블랙트리. 요소를 빠르게(로그 시간 내에) 삽입하고, 추출하고, 찾을 수 있습니다. CHashMap 및 CHashSet과 달리, 이보다 큼, 이보다 작음, 사이 등과 같은 추가 관계 알고리즘을 효율적으로 구현할 수 있습니다.
CSortedMap키별로 정렬된 집합. 키-값 값을 저장합니다. 이 경우 키가 정렬됩니다.
CSortedSet값별로 정렬된 집합입니다. 정렬된 값 집합을 저장합니다.

나중에 계속하여 이러한 클래스의 구현 기능을 살펴보겠습니다.

 
바실리 소콜로프 :

예를 들어 1000개의 주문과 같이 100만 개의 고유 식별자로 구성된 배열이 있다고 상상해 보십시오. 이 천 주문 중 번호가 N인 주문이 하나 있는지 확인하는 방법은 무엇입니까? 일반 클래스 중 하나를 사용하는 경우 이 작업 은 검색이 수행되는 요소의 수에 의존하지 않는 일정한 시간 내에 거의 즉시 완료될 수 있습니다.

주제에 완전히 익숙하지 않습니다. 그러나 강조 표시된 것은 비논리적으로 들립니다.

 

불행히도, 도서관은 막 나왔고 여전히 축축합니다. 나는 이미 첫 번째 오류를 발견했습니다(저는 마커로 오류를 강조 표시할 것입니다. 중요합니다).

CSortedSet의 오류:

 //+------------------------------------------------------------------+
//| Class CSortedSet<T>.                                             |
//| Usage: Represents a collection of objects that is maintained in  |
//|        sorted order.                                             |
//+------------------------------------------------------------------+
template < typename T>
class CSortedSet: public ISet<T>
  {
   ...
   bool               TryGetMin(T &min)    { return (m_tree. TryGetMin (min)); }
   bool               TryGetMax(T &max)    { return (m_tree. TryGetMin (max)); }
   ...
  }

TryGetMax 메서드는 TryGetMin과 마찬가지로 최대 요소를 반환하지 않고 최소값을 반환합니다.

 
fxsaber :

... 그러나 강조 표시된 것은 비논리적으로 들립니다.

왜요?

 
바실리 소콜로프 :

왜요?

해시를 만들고 오름차순으로 정렬합니다. 그러나 어떤 경우에도 검색됩니다.

 
fxsaber :

주제에 완전히 익숙하지 않습니다. 그러나 강조 표시된 것은 비논리적으로 들립니다.

평균 O(1) 시간은 O(n)보다 나쁘고 성능은 해시에 크게 의존합니다.
 
fxsaber :

해시를 만드세요...

용어를 정의합시다. 즉각적인 것은 없습니다. 모든 작업에는 시간이 걸립니다. 즉석 에서 말할 때는 초보 프로그래머가 이해할 수 있도록 단순화합니다. 엄밀히 말하면, 여러 복잡도 클래스 가 있으며 우리가 다룰 주요 클래스는 다음과 같습니다.

  • 상수 복잡도 c O(1) .
  • 로그: O ( log n) .
  • 선형: c O(n) .
  • 비선형 실행 시간이 필요한 알고리즘.

해시 및 기타 기술적 조작을 계산할 때 발생하는 일종의 상수로 기호 c 를 의도적으로 도입했습니다. 그러나 이 경우 상수 c 최적화에 대한 논의는 이 스레드에서 다루지 않습니다. 우리는 제네릭 클래스와 실제 적용에만 관심이 있습니다.

 
fxsaber :

해시를 만들고 오름차순으로 정렬합니다. 그러나 어떤 경우에도 검색됩니다.

결합기 :
평균 O(1) 시간은 O(n)보다 나쁘고 성능은 해시에 크게 의존합니다.

+

ps 예시로 CHashMap으로 작업하는 것이 잘못된 경우 이 성능이 바로 O(n)으로 떨어지는 예를 아래에 제시하겠습니다.

 
바실리 소콜로프 :

매우 명확하게 작성

강조 표시된 내용을 참조하십시오.

 

나는 이름을 단순화하여 더 논리적으로 만들 것을 제안합니다. 예를 들어, CArrayList 는 여전히 mql5의 Array 또는 List입니다. 둘 다 구현되어 있습니까?

이 모든 것은 질문과 오해를 불러일으킨다. IMHO, C # 또는 Java가 아닌 stl에서 깎는 것이 필요합니다. 또는 C보다 먼저 제거하고 ArrayList로 두십시오.


일반 이름을 만드는 경우:

- 가독성이 크게 향상됩니다.

- 고유한 mql5 스타일을 그립니다.

- 초보자는 즉시 코드를 탐색할 수 있습니다(stl이 표준에 포함되어 있기 때문에)

 
바실리 소콜로프 :

...

가능한 경우 예를 들어 수천 개의 트랜잭션 중에서 검색하는 것과 같습니다.
사유: