Скачать MetaTrader 5

Помогите разобраться как работает ArrayBsearch()

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114269
Forex Trader  
Прошу на примере данного кода обяснить полученные результаты

//+------------------------------------------------------------------+
//|                                                   Test_ARRAY.mq4 |
//|                                            Copyright © 2005, BSL |
//|                                                      http://www. |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, BSL"
#property link      "http://www."

int myarray[10][6];
myarray[0][0]=1;myarray[0][1]=4;myarray[0][2]=5;myarray[0][3]=10;myarray[0][4]=13;myarray[0][5]=94;
myarray[1][0]=3;myarray[1][1]=1;myarray[1][2]=188;myarray[1][3]=2;myarray[1][4]=1;myarray[1][5]=0;
myarray[2][0]=4;myarray[2][1]=2;myarray[2][2]=7;myarray[2][3]=12;myarray[2][4]=35;myarray[2][5]=4;
myarray[3][0]=2;myarray[3][1]=1;myarray[3][2]=13;myarray[3][3]=6;myarray[3][4]=2;myarray[3][5]=0;
myarray[4][0]=4;myarray[4][1]=2;myarray[4][2]=25;myarray[4][3]=18;myarray[4][4]=48;myarray[4][5]=5;
myarray[5][0]=3;myarray[5][1]=2;myarray[5][2]=23;myarray[5][3]=6;myarray[5][4]=6;myarray[5][5]=1;
myarray[6][0]=4;myarray[6][1]=2;myarray[6][2]=9;myarray[6][3]=10;myarray[6][4]=34;myarray[6][5]=6;
myarray[7][0]=2;myarray[7][1]=2;myarray[7][2]=28;myarray[7][3]=24;myarray[7][4]=9;myarray[7][5]=2;
myarray[8][0]=3;myarray[8][1]=4;myarray[8][2]=7;myarray[8][3]=4;myarray[8][4]=36;myarray[8][5]=86;
myarray[9][0]=4;myarray[9][1]=1;myarray[9][2]=248;myarray[9][3]=27;myarray[9][4]=2;myarray[9][5]=0;

int start()
   {
   int i,j;
   string mystr="";
   for (i=0; i<ArrayRange(myarray,0); i++)
      {
      mystr="Несортированный myarray "+i+"=";
      for (j=0; j<ArrayRange(myarray,1); j++)
         {
         mystr=StringConcatenate(mystr,myarray[i][j],";");
         }
      Print(mystr);
      }
      
   Print("Производим сортировку");
   
   ArraySort(myarray);
   for (i=0; i<ArrayRange(myarray,0); i++)
      {
      mystr="Сортированный myarray "+i+"=";
      for (j=0; j<ArrayRange(myarray,1); j++)
         {
         mystr=StringConcatenate(mystr,myarray[i][j],";");
         }
      Print(mystr);
      }

   Print("Производим поиск значения 1");
   Print("Найденный элемент имеет индекс =", ArrayBsearch(myarray,1));

   Print("Производим поиск значения 2");
   Print("Найденный элемент имеет индекс =", ArrayBsearch(myarray,2));

   Print("Производим поиск значения 3");
   Print("Найденный элемент имеет индекс =", ArrayBsearch(myarray,3));

   Print("Производим поиск значения 4");
   Print("Найденный элемент имеет индекс =", ArrayBsearch(myarray,4));

   return(0);
   }




а результаты получаются вот такие:

2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =9
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 4
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =4
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 3
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =2
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 2
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =0
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 1
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 9=4;2;9;10;34;6;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 8=4;1;248;27;2;0;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 7=4;2;7;12;35;4;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 6=4;2;25;18;48;5;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 5=3;2;23;6;6;1;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 4=3;1;188;2;1;0;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 3=3;4;7;4;36;86;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 2=2;2;28;24;9;2;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 1=2;1;13;6;2;0;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Сортированный myarray 0=1;4;5;10;13;94;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим сортировку
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 9=4;1;248;27;2;0;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 8=3;4;7;4;36;86;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 7=2;2;28;24;9;2;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 6=4;2;9;10;34;6;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 5=3;2;23;6;6;1;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 4=4;2;25;18;48;5;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 3=2;1;13;6;2;0;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 2=4;2;7;12;35;4;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 1=3;1;188;2;1;0;
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Несортированный myarray 0=1;4;5;10;13;94;

Поскольку в help функции записано
Возвращает индекс первого найденного элемента в первом измерении массива
то соответственно хотелось бы получить результаты

2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =6
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 4

2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =3
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 3

2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =1
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 2

2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Найденный элемент имеет индекс =0
2006.01.11 22:30:44 test_ARRAY EURUSD,H4: Производим поиск значения 1

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

Заранее благодарен.

ЗЫЖ используется билд 186.

MetaQuotes Software Corp.
Модератор
182643
MetaQuotes Software Corp.  
ArrayBSearch работает правильно.

ArrayBSearch расшифровывается как бинарный поиск в отсортированном массиве. Если массив содержит только уникальные элементы, то все ищется точно.

Если же есть повторяющиеся значения, то находится любая позиция, в которой присутствует поисковое значение. Такова реализация двоичного (делением пополам) поиска.

В данном случае Вам лучше написать свою линейную функцию поиска путем перебора. Или комбинированный поиск на основе ArrayBSearch и последующим откатом назад до первого значения.
Forex Trader
114269
Forex Trader  
2Renat

Если массив содержит только уникальные элементы, то все ищется точно.

Подтверждаю.

Если же есть повторяющиеся значения, то находится любая позиция, в которой присутствует поисковое значение. Такова реализация двоичного (делением пополам) поиска.

Благодарю за разъяснение.


В данном случае Вам лучше написать свою ... функцию ...
.

Не проблема, напишу, найду как мне нужно, но я думаю здесь именно тот случай когда абсолютное
большинство пользователей со мной согласится:
Лучше бы все-же доработать штатную функцию что-бы возвращаемый индекс вместо
... Возвращает индекс первого найденного элемента в первом измерении массива...
.
был-бы
... Возвращает индекс первого найденного элемента в первом измерении массива...
.
иначе нет смысла пользоваться функцией в чистом виде для поиска в массивах с повторяющимися значениями в первом измерении массива.
Я думаю уважаемый ALL согласится со мной что задавая поиск конкретного значения мы как правило
хотим найти именно ПЕРВЫЙ элемент соответствующий условию поиска и он всегда будет удовлетворять
условию "найти любой соответствующий"
. В данном же случае имеем обратное - ищется любой соответствующий который только в случае уникальных элементов действительно будет первым

Или я не прав. Как думаешь уважаемый ALL. И что думают по этому поводу разработчики.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий