Описание:
Рассматривается двумерный массив значений типа double в терминах БД. Массив состоит из С колонок и R строк. Подразумевается, что значения в колонке нормализованы одинаково.
Основные реализованные функции:
1. Array.Sort(double &a[], int order[], int sort.mode=MODE_QUICK3)
- сортировка массива в произвольном порядке колонок, в произвольном направлении каждой колонки. Реализован алгоритм сортировки quicksort-3way (http://www.sorting-algorithms.com/quick-sort-3-way). Краткое описание: время сортировки стремится к O(R·lg(R)) (быстрый, для сравнения: пузырьковый метод сортировки имеет время порядка O(R^2)), взаимный порядок строк с одинаковыми значениями ключа сортировки не сохраняется (нестабильный), сортировка "почти упорядоченных" данных занимает меньшее время в сравнении с random-последовательностью (адаптивный). Здесь a - упорядочиваемый массив, order - перечень колонок упорядочивания, с указанием направления сортировки. Направление указывается знаком. С этой целью нумерация колонок по абсолютному значению начинается с 1 (!). Например, задать упорядочивание массива по a[0] ASC, a[3] DESC, a[2] ASC, a[5] DESC
int order[] = { 1, -4, 3, -6};
Array.Sort(a, order);
2. Array.Group(double &a[][], int groups[], int sums[], double &dest[][])
- группировка строк массива с совпадающими ключами, опционно - с вычислением сумм в указываемых дополнительно колонках. Здесь a и groups - см. выше по аналогии, sums - перечень суммируемых колонок (нумерация также с 1; хотя насущной необходимости в этом не было, ввел по аналогии с массивами групп и сортировки во избежание дополнительной путаницы), dest - выходной массив. Перед суммированием массив сортируется автоматически (дополнительной сортировки перед вызовом процедуры не требуется).
double a[10000][9];
...... with array
double d[][5];
int g[] = { -1, 2, 5}, s[] = { 6, 7};
Array.Group(a, g, s, d);
3. Array.Select(double &a[][], double & filter[][], double & dest[][])
- выборка из массива подмножества, удовлетворяющего заданным критериям. Здесь a и dest - см. выше по аналогии, filter - массив состоящий из трех колонок и произвольного количества строк, описывающий набор условий. Условия простейшие - нахождение значения колонки в диапазоне минимального и максимального значений. filter[1..C][0] - номер колонки; filter[][1] - min, filter[][2] - max. Требование к dest - количество колонок равное С. Строки добавятся автоматически. Исходный массив не сортируется (простой перебор).
При необходимости можно воспользоваться служебными функциями Array.Swap(a, i1, i2) (меняет местами строки массива a с номерами i1 и i2) и Array.Compare(a, i1, i2, order) (сравниваются строки i1 и i2 массива а в разрезе указанного набора (по ключам) order, возвращаемые значения - {-1| 0| 1}).
Прилагается скрипт, иллюстрирующий возможности библиотеки.
Установка:
experts\libraries\ArrayEx.mq4
experts\scripts\Sort_Array.mq4
|
zigan писал(а):
Спасибо, нужная библиотека.
Если можно, поясните пож-ста, что означает: значения в колонке нормализованы одинаково.
Вообще, для безошибочного сравнения значений типа double оба сравниваемых значения должны быть нормализованы при помощи функции NormalizeDouble(data, digits). Поэтому при заполнении массива следует избегать выражений типа a[2][3]=1/3; особенно это касается например расчетных значений цены - что-то типа Close[0]+(Close[0]-Close[1]) * 1.618. Подобные выражения нужно нормализовывать - NormalizeDouble( Close[0]+(Close[0]-Close[1]) * 1.618, Digits). Рассматривая массив как базу данных, необходимо обеспечить в одной колонке данные одинаковой размерности - только int, только date, только double c фиксированной точностью. Хотя выполнение алгоритмов от этого не пострадает, смешение в одной колонке разных сущностей (например дата и цена) - не имеет смысла.
Спасибо, нужная библиотека.
Если можно, поясните пож-ста, что означает: значения в колонке нормализованы одинаково.
basile писал(а):
ЕЕЕЕМАЕ........
Это должно означать что-то типа "Нифига! Дайте две" ?
|