算法、解决方法、其性能的比较 - 页 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


正如你所看到的,当 数组的大小增加时,以前的值仍然存在


把它藏在这里纯粹是OOP和一切有用的东西

 
Vladimir Karputov:

下面是对动态数组 的检查 一维的arr_dynamic 和二维的arr_dynamic_multi


正如你所看到的,如果你增加 数组的大小,以前的值仍然存在

谢谢你。这是很有价值的信息。
 

我想讨论一下《印刷与评论》--为什么没有人关注?

 
Vasiliy Sokolov:

有一个神奇的属性:容量,顺便说一下,由于某种原因,CHashMap中没有这个属性(这是开发人员的一个严重疏忽)。通过指定它,我们绕过了重新分区。你可以在这个任务中指定它,所以我认为没有任何问题。

你可以通过构造函数在CHashMap中指定容量

瓦西里-索科洛夫

顺便说一下,为什么他们有不同的比例系数,这也非常奇怪。与简单的CArrayList相比,重新排列CHashMap很困难。

对于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:

找到 最快和最有效的解决方案,将Megs添加到一个数组(列表,字典......),并从数组中检索Megs,未来交易的数量未知。


可以理解的是,不存在开票的问题。

不过,我还是建议你开始用各种东西来复杂化你的代码,比如模板函数