Уважаемые знатоки Mql4 и Mql5, есть вопросик насчет реализации алгоритма... - страница 2

 
joo >>:
 Нужно найти все варианты значений из заданного диапазона в массиве произвольного размера?
Да нужно учитывать и то что массив будет меняться от заданного значения пользователем min, max.
значения элементов массива могут быть либо 0 либо 1.
 
PapaYozh >>:

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


Дауж при слове "сдвиагется", и слове "Бит".... голова кругом. :) я наверное туплю.... Но вот в массиве провели одно изменение, потом производиться некие расчеты и нужно сново провести изменение... Важно еще исключить повторяющиеся варианты.
 
Fast писал(а) >>
Да нужно учитывать и то что массив будет меняться от заданного значения пользователем min, max.
значения элементов массива могут быть либо 0 либо 1.

Вот для заданных значений (minIndx и maxIndx):
   int i,i1;
   int arr[6];
   
   for( i=0; i<64; i++ )
   {
      if ( i < minIndx || i > maxIndx )
         continue;
      
      for( i1=0; i1<minIndx; i1++ )
         arr[i1] = 0;
      
      for( i1=0; i1<(maxIndx-minIndx+1); i1++ )
         arr[i1+minIndx] = ( i >> i1 ) & 1;
      
      for( i1=0; i1<(6-maxIndx+1); i1++ )
         arr[i1+maxIndx] = 0;
      
      // массив заполнен, проверим это
      Print("arr: ",arr[5],arr[4],arr[3],arr[2],arr[1],arr[0]);
   }
 
Fast >>:
Да нужно учитывать и то что массив будет меняться от заданного значения пользователем min, max.
значения элементов массива могут быть либо 0 либо 1.

Тогда, простейшим, но не оптимальным по времени исполнения будет такой подход:

1) Генерируем числа из заданного диапазона для всей строки.

2)Пишем эту строку в базу

3)Генерируем новую строку чисел

4)Сверяем с базой

5)Если в базе нет такой строки, дописываем, если есть, п. 3)


И так пока не заполним базу заданного размера. Можно применить и другие критерии останова.

 
Fast писал(а) >>


Дауж при слове "сдвиагется", и слове "Бит".... голова кругом. :) я наверное туплю.... Но вот в массиве провели одно изменение, потом производиться некие расчеты и нужно сново провести изменение... Важно еще исключить повторяющиеся варианты.


1) вынесите то, что внутри цикла

for( i=0; i<64; i++ )
в функцию, а саму эту переменную передавайте в функцию в качестве аргумента.
Результатом функции должен быть заполненный массив и следующее значение итератора i (будете передавать его в функцию при следующем вызове)
2) какие могут быть повторяющиеся элементы, если используется перебор?
 
PapaYozh >>:


Вот для заданных значений (minIndx иmaxIndx):


  Спасибо, попробую Ваш код.
 
PapaYozh >>:
   int i,i1;
   int arr[6];
   
   for( i=1; i<16; i++ )
   {
      for( i1=0; i1<4; i1++ )
      {
         arr[i1+1] = ( i >> i1 ) & 1;
      }
      arr[0] = 0;
      arr[5] = 0;
      
      // массив заполнен, проверим это
      Print("arr: ",arr[5],arr[4],arr[3],arr[2],arr[1],arr[0]);
   }
Попробовал вот этот код.... все работает..., Только как мне еще учесть размер массива...
тоесть вначале проверяются все варианты для массива с 6ю элементами, потом с 7ю, и так например до 15...
массив я обьявляю статический максимальным размером в 15 элементов. есть переменная которая хранит текущее значение размера используемого массива. когда  я увеличиваю количество используемых элементов с 6 ддо 7 и тд..., будет ли работать этот код?
 
Fast писал(а) >>

Спасибо, попробую Ваш код.


Вот Вам функция, тестируйте:

int F1(int i)
{
   int i1;
   
   for( ; i<minIndx; i++ )
      ;

   if ( i > maxIndx )
      return(6);
      
   if ( i < minIndx || i > maxIndx )
      continue;
      
   for( i1=0; i1<minIndx; i1++ )
      arr[i1] = 0;
      
   for( i1=0; i1<(maxIndx-minIndx+1); i1++ )
      arr[i1+minIndx] = ( i >> i1 ) & 1;
      
   for( i1=0; i1<(6-maxIndx+1); i1++ )
      arr[i1+maxIndx] = 0;
      
   // массив заполнен, проверим это
   Print("arr: ",arr[5],arr[4],arr[3],arr[2],arr[1],arr[0]);
     
   return(i);
}

Примечания:
1) переменные minIndx, maxIndx и массив arr[6] должны быть объявлены на глобальном уровне;
2) за корректностью значений minIndx, maxIndx Вы уж сами следите;
3) как только функция начнет возвращать 6, перебор окончен.
 
Fast писал(а) >>
Попробовал вот этот код.... все работает..., Только как мне еще учесть размер массива...
тоесть вначале проверяются все варианты для массива с 6ю элементами, потом с 7ю, и так например до 15...
массив я обьявляю статический максимальным размером в 15 элементов. есть переменная которая хранит текущее значение размера используемого массива. когда я увеличиваю количество используемых элементов с 6 ддо 7 и тд..., будет ли работать этот код?




используйте функцию:

int F1(int i, int arrsize)
{
   int i1;
   string str;
   
   for( ; i<minIndx; i++ )
      ;
   
   if ( i > maxIndx )
      return(arrsize);
      
   if ( i < minIndx || i > maxIndx )
      continue;
      
   for( i1=0; i1<minIndx; i1++ )
      arr[i1] = 0;
      
   for( i1=0; i1<(maxIndx-minIndx+1); i1++ )
      arr[i1+minIndx] = ( i >> i1 ) & 1;
      
   for( i1=0; i1<(arrsize-maxIndx+1); i1++ )
      arr[i1+maxIndx] = 0;
      
   // массив заполнен, проверим это
   str = "";
   for( i1=0; i1<arrsize; i1++ )
      str = StringConcatenate(str,arr[i1]);
   Print("arr: ",str);
      
   return(i);
}
 
PapaYozh >>:


Вот Вам функция, тестируйте:


Примечания:
1) переменные minIndx, maxIndx и массив arr[6] должны быть объявлены на глобальном уровне;
2) за корректностью значений minIndx, maxIndx Вы уж сами следите;
3) как только функция начнет возвращать 6, перебор окончен.


:) Вроде немного стал понимать Ваш код. Вы уж извините что я такой недо программист и понимаю наверное с 10 раза....
За что у Вас отвечают переменные maxIndx и minIndx? Если я правильно понял то за отрывок в массиве который подвергается перебору?
Если да, то минимальное значение не нужно использовать, так как оно всегда равно 0 (это первый элемент массива), а вот размер максимального элемента меняется по нарастающей тоесть в начале он равен 5, что значит в используемом мною массиве arr[15] последним элементом будет считаться 4й. Затем количество элементов увеличивается и последний элемент уже 5й. затем 6й и так далее...
Перебирать нужно с 2го элемента (тоесть это всегда arr[1]) до пред последнего arr[tek_raz-1] (tek_raz это текущий используемый последний элемент массива). Вот в общемто что мне нужно сделать.ТОесть например если это будет функция то нужно перебрать все эелементы в массиве arr учитывая его текущий размер tek_raz.
Причина обращения: