Не работает бинарный поиск слова в словаре - 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

Объяснение кода листинга программы

  1. pNumPosKeyBase - это указатель на начало массива NumPosKey.
  2. dwNumPosKeyCnt - это количество элементов в массиве NumPosKey.
  3. iTotal - это переменная для подсчета общего количества найденных записей.
  4. Если используется двоичный поиск (_bBinarySearch равно TRUE), то выполняется двоичный поиск первого вхождения искомого ключа в массиве NumPosKey. Для этого используется функция bsearch, которая принимает на вход указатель на первый элемент в массиве, размер массива, размер одного элемента и функцию сравнения.
  5. Если поиск не успешен, то в цикле выполняется линейный поиск первого вхождения искомого ключа.
  6. Для каждой найденной записи создается объект POSITION_RECORD, заполняются его поля и добавляется в список _PosList.
  7. Если запись успешно добавлена в список, то увеличивается счетчик iTotal.
  8. Если _bBinarySearch равно FALSE, то выполняется линейный поиск первого вхождения искомого ключа в массиве NumPosKey.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы