Некорректная работа ArrayBsearch

 

Да, видел уже несколько попыток доказать, что ArrayBsearch работает не так, как надо.

Но сделаю еще одну.

Рассмотрим код

  double d[4] = {2,1,1,0};
  Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);

  int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
  Print("i=", i);

В логе:

01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 0
01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: i=1


Т.е. все правильно, в массиве, отсортированном по убыванию, нашел первую "1", которая стоит вторым элементом.

Если теперь заменить в массиве последний элемент с "0" на "1"

  double d[4] = {2,1,1,1};
  Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);   
  int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
  Print("i=", i);

В логе:

01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 1
01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: i=3


Вроде бы, судя по логике, результат не должен меняться, должно все так же возвращаться "1", однако, поиск выдает последний элемент массива.

И ладно еще в тесте четыре элемента. В оригинале несколько тысяч повторяющихся элементов постоянно ищутся, а потом еще и сортируются.

Что за ерунда?

 
gli писал(а) >>

Да, видел уже несколько попыток доказать, что ArrayBsearch работает не так, как надо.

Но сделаю еще одну.

Рассмотрим код

double d[4] = {2,1,1,0};
Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);

int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
Print("i=", i);

В логе:

01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 0
01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: i=1

Т.е. все правильно, в массиве, отсортированном по убыванию, нашел первую "1", которая стоит вторым элементом.

Если теперь заменить в массиве последний элемент с "0" на "1"

double d[4] = {2,1,1,1};
Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);
int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
Print("i=", i);

В логе:

01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 1
01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: i=3

Вроде бы, судя по логике, результат не должен меняться, должно все так же возвращаться "1", однако, поиск выдает последний элемент массива.

И ладно еще в тесте четыре элемента. В оригинале несколько тысяч повторяющихся элементов постоянно ищутся, а потом еще и сортируются.

Что за ерунда?

Я посмотрел справочник. Функция работает в полном соответствии со своим описанием. Никто не обещал, что это будет первое (или последнее) вхождение

значения в направлении поиска.

По-видимому, в ней реализован алгоритм двоичного поиска, и она возвращает первое найденное значение.

Поэтому, если есть повторяющиеся значения, то, при определенных вариантах, индекс может указать на любое из них.

 
Mislaid >>:

По-видимому, в ней реализован алгоритм двоичного поиска, и она возвращает первое найденное значение.

Поэтому, если есть повторяющиеся значения, то, при определенных вариантах, индекс может указать на любое из них.

В справке сказано https://docs.mql4.com/ru/array/ArrayBsearch:

int ArrayBsearch( double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND)

Возвращает индекс первого найденного элемента в первом измерении массива.
Если элемент с указанным значением в массиве отсутствует, функция вернет индекс ближайшего меньшего по значению из элементов, между которыми расположено искомое значение.
Функция не может применяться к массивами строк и таймсериям (исключение составляет таймсерия времени открытия бара).

Замечание: двоичный поиск обрабатывает только сортированные массивы. Для сортировки числового массива используется функция ArraySort().

 
Mislaid >>:

Я посмотрел справочник. Функция работает в полном соответствии со своим описанием. Никто не обещал, что это будет первое (или последнее) вхождение

значения в направлении поиска.

По-видимому, в ней реализован алгоритм двоичного поиска, и она возвращает первое найденное значение.

Поэтому, если есть повторяющиеся значения, то, при определенных вариантах, индекс может указать на любое из них.

Согласен, в документации не сказано, что это должен быть первый или любой из набора. Я об этом не подумал.

В любом случае ошибка :) Либо в документации, либо в коде.

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

Rosh >>:

В справке сказано https://docs.mql4.com/ru/array/ArrayBsearch:

Я не очень понял, уважаемый, вы это к чему? У меня вполне отсортированный по убыванию массив, разве нет? Или я зря обратил внимание на выделенный кусок цитаты?

 
gli >>:

Я не очень понял, уважаемый, вы это к чему? У меня вполне отсортированный по убыванию массив, разве нет? Или я зря обратил внимание на выделенный кусок цитаты?


К механизму поиска.