поиск и диапазон поиска? - PullRequest
1 голос
/ 24 марта 2011

bsearch довольно хорош для прямого поиска, но что мне следует использовать, если мне нужен, например, диапазон поиска?

обновление

например, если я хочу найти диапазон значений между a и b (a> = x обновление

значения диапазона могут быть не равны. поэтому, если у меня есть массив (10,20,30) и я пытаюсь найти «15», я хочу получить адрес (указатель) на минимальный диапазон, который является ближайшим, в этом примере это диапазон (10,20)

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Функция bsearch() предназначена для поиска одного элемента, соответствующего некоторому условию. Согласно справочной странице:

RETURN VALUE
       The bsearch() function returns a pointer to a matching  member  of  the
       array,  or  NULL  if no match is found.  If there are multiple elements
       that match the key, the element returned is unspecified.

Ключ здесь в том, что если есть несколько элементов, которые соответствуют ключу, возвращаемый элемент не указан. Таким образом, вы не знаете, является ли элемент, который вы получаете, первым, последним или где-то посередине диапазона.

Если вы можете изменить свои требования так, чтобы вы искали элементы в массиве между A и B, и вы могли гарантировать, что в массиве ровно один A и ровно один B, то вы можете сначала найти затем найдите B.

start = bsearch(A, array, N, sizeof(*array), compare);
end = bsearch(B, array, N, sizeof(*array), compare);

Вам, вероятно, придется написать собственную функцию, чтобы делать именно то, что вы хотите.

1 голос
/ 24 марта 2011

Один из параметров bsearch принимает количество элементов для поиска.Поэтому вместо, например, 100, сделайте поиск в 42 ...

bsearch("foo", data, /*100*/42, sizeof *data, cmpfx);

После обновления

Я бы сделал бинарный поиск вручную (то есть написал бы код).

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


После 2-го обновления

Вы хотите вернуть пару указателей?

Вы должны обернуть их внутри структуры или передать адреса указателей в функции ... или что-то в этом роде.

Но теперь у вас есть более простой поиск: ищите, пока не найдете значение (и не получите 0-длинный диапазон) или пока вы не собираетесь потерпеть неудачу.Диапазон между значением массива, которое вы в последний раз просматривали, и, в зависимости от того, как именно вы попали в ситуацию сбоя, значением одной из сторон или ПУСТОЙ, если вы находитесь в конце массива.

...