Не работает бинарный поиск слова в словаре - C (СИ)
Формулировка задачи:
Вторую неделю пытаюсь поймать ошибку в программке на С. Моя реализация бинарного поиска в словаре. Не могу понять что я упускаю - вроде все должно работать ан нет. Найдите время гляньте программку - где ошибка а то мозг уже закипает.
Буду премного благодарен за конструктивные мысли и критику тоже.
bool binarySearch(string word,int startArrayIndex, int endArrayIndex)
{
//initialize new wordForSearch
int stringLength = strlen(word);
// если слово не найдено
if( startArrayIndex > endArrayIndex)
{
return false;
}
else
{
//вычисляем середину массива
int middleIndex = (int)(startArrayIndex + (endArrayIndex - startArrayIndex)/2);
bool findWord = false;
//срваниваем слово с тем что в середине словаря - побуквенно
for(int i = 0; i < stringLength; i++)
{
// если какая-то буква не равна запускаем новый поиск
if( word[i] < dictionary.words[middleIndex].letters[i])
{
printf("our word = %s, dict word = %s\n",word,dictionary.words[middleIndex].letters);
printf("Middle index = %d\n",middleIndex);
binarySearch(word,startArrayIndex,middleIndex);
}
// если какая-то буква не равна запускаем новый поиск
if( word[i] > dictionary.words[middleIndex].letters[i])
{
printf("our word = %s, dict word = %s\n",word,dictionary.words[middleIndex].letters);
printf("Middle index = %d\n",middleIndex);
binarySearch( word,middleIndex,endArrayIndex);
}
//если последняя буква слова равна последней букве слова в словаре
if( word[stringLength] == dictionary.words[middleIndex].letters[stringLength])
{
printf("our word = %s, dict word =%s\n",word,dictionary.words[middleIndex].letters);
printf("Middle index = %d\n",middleIndex);
findWord = true;
}
}
return findWord;
}
}Решение задачи: «Не работает бинарный поиск слова в словаре»
textual
Листинг программы
BYTE* pNumPosKeyBase = MF_NumPosKey.Buffer();
DWORD dwNumPosKeyCnt = MF_NumPosKey.Size() / sizeof(NumPosKey);
int iTotal = 0;
if (_bBinarySearch)
{
// Binary Search
NumPosKey NumPosKeyKey;
memset(&NumPosKeyKey,0,sizeof(NumPosKey));
memcpy(NumPosKeyKey._pKey,&dwKey,3);
// Find Any
NumPosKey* pNumPosKey = (NumPosKey*)bsearch(&NumPosKeyKey,pNumPosKeyBase,dwNumPosKeyCnt,sizeof(NumPosKey),NumPosNumS2Searcher);
if (pNumPosKey)
{
// Find very first key
DWORD dwFirst = ((BYTE*)pNumPosKey - pNumPosKeyBase) / sizeof(NumPosKey);
while (pNumPosKey && dwFirst && !memcmp(pNumPosKey->_pKey,&dwKey,3))
{
--dwFirst;
--pNumPosKey;
}
// Accumulate
++dwFirst;
++pNumPosKey;
DWORD dwRecNum = dwFirst;
while (pNumPosKey && (dwRecNum < dwNumPosKeyCnt) && !memcmp(pNumPosKey->_pKey,&dwKey,3))
{
POSITION_RECORD* pPosRec = new POSITION_RECORD;
if (pPosRec)
{
memset(pPosRec,0,sizeof(POSITION_RECORD));
pPosRec->_iNum = iTotal + 1;
memcpy(&pPosRec->_dwIdxPos,pNumPosKey->_pPos,3);
if (_PosList.Insert(pPosRec) != -1)
{
++iTotal;
}
}
++dwRecNum;
++pNumPosKey;
}
}
}
else
{
// Linear Search
Объяснение кода листинга программы
pNumPosKeyBase- это указатель на начало массиваNumPosKey.dwNumPosKeyCnt- это количество элементов в массивеNumPosKey.iTotal- это переменная для подсчета общего количества найденных записей.- Если используется двоичный поиск (
_bBinarySearchравно TRUE), то выполняется двоичный поиск первого вхождения искомого ключа в массивеNumPosKey. Для этого используется функцияbsearch, которая принимает на вход указатель на первый элемент в массиве, размер массива, размер одного элемента и функцию сравнения. - Если поиск не успешен, то в цикле выполняется линейный поиск первого вхождения искомого ключа.
- Для каждой найденной записи создается объект
POSITION_RECORD, заполняются его поля и добавляется в список_PosList. - Если запись успешно добавлена в список, то увеличивается счетчик
iTotal. - Если
_bBinarySearchравно FALSE, то выполняется линейный поиск первого вхождения искомого ключа в массивеNumPosKey.