Алгоритмы, методы решений, сравнение их производительности - страница 18

 
Реter Konow:
Почему идеальное решение конкретной задачи воспринимается как издевательство? Серьезно, не понимаю...

У Вас задача какая была? Напомните ее для себя здесь публично пожалуйста.

 
Vasiliy Sokolov:

Вы фигню какую-то написали. По сути вариант доступа к массиву по его индексу. В реальности номера сделок случайны, и весь Ваш пример обрушиться, когда потребуется решить реальную задачу.


Да погоди ща напишет правильно все, уверен что уже завтра 

 
Реter Konow:

***

Если бы я был уверен, что данные не исчезают из массива при изменении его размера, ***

Вот проверка для динамических массивов: одномерного arr_dynamic и двумерного arr_dynamic_multi.

//+------------------------------------------------------------------+
//|                                                  ArrayResize.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявим динамические массивы
   double arr_dynamic[];
   double arr_dynamic_multi[][2];
//--- новый размер в первом измерении массива
   if(ArrayResize(arr_dynamic,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }

   for(int i=0;i<ArraySize(arr_dynamic);i++)
      arr_dynamic[i]=i;
   for(int i=0;i<ArrayRange(arr_dynamic_multi,0);i++)
     {
      arr_dynamic_multi[i][0]=i;
      arr_dynamic_multi[i][1]=i*10;
     }

//--- распечатка значений до увеличения размера
   Print("Перед ArrayResize массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("Перед ArrayResize массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- увеличим размер на два элемента
   if(ArrayResize(arr_dynamic,ArraySize(arr_dynamic)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,ArrayRange(arr_dynamic_multi,0)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после увеличения размера
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- новый размер в первом измерении массива установим равным 3 (то есть уменьшим размер массива)
   if(ArrayResize(arr_dynamic,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после уменьшение размера
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);
  }
//+------------------------------------------------------------------+


Как видите при увеличении размера у массива предыдущие значения остаются:

Перед ArrayResize массив "arr_dynamic" имеет такие элементы:
0.00000 1.00000 2.00000 3.00000 4.00000
Перед ArrayResize массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
После ArrayResize (увеличения размера) массив "arr_dynamic" имеет такие элементы:
  0.00000   1.00000   2.00000   3.00000   4.00000  -0.00000  +0.00000
После ArrayResize (увеличения размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
[5,] +0.00000 +0.00000
[6,] +0.00000 +0.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic" имеет такие элементы:
0.00000 1.00000 2.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
Файлы:
 
Vasiliy Sokolov:

Вы фигню какую-то написали. По сути вариант доступа к массиву по его индексу. В реальности номера сделок случайны, и весь Ваш пример обрушиться, когда потребуется решить реальную задачу.

Вы имеете ввиду тикеты, наверное. Я имею ввиду порядковые номера сделок.

Для записи тикетов можно сделать параллельный массив рядом. 

Или несколько параллельных массивов для записи остальных данных кажого ордера.

 
Vladimir Karputov:

Вот проверка для динамических массивов: одномерного arr_dynamic и двумерного arr_dynamic_multi.


Как видите при увеличении размера у массива предыдущие значения остаются:


спрячьте это тут чисто ООП и все полезное

 
Vladimir Karputov:

Вот проверка для динамических массивов: одномерного arr_dynamic и двумерного arr_dynamic_multi.


Как видите при увеличении размера у массива предыдущие значения остаются:

Спасибо. Это очень ценная информация.
 

Хотелось бы обсудить тему Принта и Комента - почему никто внимание не обращает

 
Vasiliy Sokolov:

Есть такое волшебное свойство: Capacity, которое кстати почему-то отсутствует у CHashMap (что является грубейши промахом разработчиков). Указав его, мы обходим перераземетку. В данной задаче его указать можно, поэтому не вижу проблем.

У CHashMap можно задать Capacity через конструктор.

Vasiliy Sokolov:

Почему кстати коэффициенты мастштаба у них разные - тоже очень странно. Переразмечать CHashMap посложней будет, чем более простой CArrayList.

Для CHashMap размер словаря должен быть простом числом для соблюдения равномерности распределения хешей по словарю.
CHashMap для выбора простых чисел использует CPrimeGenerator.
Но, к сожалению, реализация CPrimeGenerator не отвечает ожиданиям и содержит только нижеперечисленные значения:

const static int  CPrimeGenerator::s_primes[]=
  {
   3,7,11,17,23,29,37,47,59,71,89,107,131,163,197,239,293,353,431,521,631,761,919,
   1103,1327,1597,1931,2333,2801,3371,4049,4861,5839,7013,8419,10103,12143,14591,
   17519,21023,25229,30293,36353,43627,52361,62851,75431,90523,108631,130363,156437,
   187751,225307,270371,324449,389357,467237,560689,672827,807403,968897,1162687,1395263,
   1674319,2009191,2411033,2893249,3471899,4166287,4999559,5999471,7199369
  };
 Средний коэффициент роста порядка 1.2
 
Vasiliy Sokolov:

У Вас задача какая была? Напомните ее для себя здесь публично пожалуйста.

Найти максимально быстрое и эффективное решение добавления мегиков в массив (список, словарь...), и получение мегиков из массива по порядковому номеру сделки, при неизвестном количестве будущих сделок.

 
Реter Konow:

Найти максимально быстрое и эффективное решение добавления мегиков в массив (список, словарь...), и получения мегиков из массива, при неизвестном количестве будущих сделок.


понятно о тикетах речи не было

все же советую начинать усложнять код всякими примочками типо шаблонных функций
Причина обращения: