БАГ в quicksearch (bug)
Но это конечно же дурацкое решение, а нужно переписывать алгоритм, может если кто сталкивался, покажите плиз как можно переписать этот алгоритм более эффективно?
Так и задумано. Метод QuickSearch(...) организует "нечёткий" поиск. Это нужно для тог чтобы работали методы SearchGreat(...), SearchLessOrEqual(...) и др.
Чтобы наверняка определить наличие заданной строки используйте Search(...)
{
int i,j,m=-1;
string t_string;
//--- search
i=0;
j=m_data_total-1;
while(j>=i)
{
//--- ">>1" is quick division by 2
m=(j+i)>>1;
if(m<0 || m>=m_data_total) break;
t_string=m_data[m];
if(t_string==element) break;
if(t_string>element) j=m-1;
else i=m+1;
}
//---
return(m);
}
Итак что мы имеем? Если размер массива 1, и в нем нету строки, вместо -1 функйция возвращаяет 0, то есть как будто бы то что мы искали найдено в массиве на позиции 0.
Из за этого все алгоритмы у меня встали, потому что сначала надо в массиве проверить поиском, и если найдено то ничего не делать, а если не найдено то добавлять. И это важно, потому что даже если массив с размером 1, мы должны точно знать соответствует ли эта единственная строка тому что мы искали или нет.
итак что происходит, после деления (0+0)/2 ----> m равна 0, строка больше или меньше элемента, j или i меняется, как будто функция продолжалась бы дальше, а нет. Уже условие while(j>=i) не выполняется, в итоге возвращается последняя m, которая после деления была равна 0, и в этом ошибка!
Если не верите, сами проверьте.
Чтобы продемонстрировать, я сделал временное решение, которое исправляет эту проблему:
if(t_string>element)
{
j=m-1;
if (j>=i) {}
else {m=-1;};
}
else
{
i=m+1;
if (j>=i) {}
else {m=-1;};
}
Но это конечно же дурацкое решение, а нужно переписывать алгоритм, может если кто сталкивался, покажите плиз как можно переписать этот алгоритм более эффективно?