Не работает бинарный поиск слова в словаре - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д