проблема с двоичным поиском (вычислите первое, последнее, среднее с новыми значениями) - PullRequest
0 голосов
/ 25 декабря 2010

Код ниже относится к алгоритму двоичного поиска.Пользователь вводит числа в textbox1 и вводит число, которое он хочет найти, с помощью binarysearch в textbox2.теперь у меня есть проблема с этим, я хочу, чтобы, когда значение mid, first, last изменилось, оно снова начало функцию.функция начинается снова и вычисляется с новым значением last (я прокомментировал коды для более подробного объяснения)

Ответы [ 4 ]

2 голосов
/ 25 декабря 2010

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

   1- Splitt the string with ',' and store in the int[] array.

  string[] strArray = textBox1.Text.split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries);

    List<int> lstInts = new List<int>();      
   foreach(string str in strArray)
   {
      int j;
      int k=0;

      if(int.TryParse(str,out j))
        {
           lstInts.Add(j);
        }
    }
     int[] bsArray = lstInts.ToArray();

   2- Now Sort the Array.
      Array.Sort(bsArray);

   3- Now use Array.Binaryearch() , if you wanna use  framework implementation which is optimized also

      Array.BinarySearch(bsArray, valueToBeSearched)

     if you don't wanna use Framework implementation than follow below algorithm

   public int DoBinarySearchNoNRecursively(int[] array, int value)
    {
        int high = array.Length - 1;

        int low = 0;

        while (low < high)
        {
            int mid = low + (high - low) / 2;

            if (value == array[mid])
                return mid;
            else if (value > array[mid])
                low = mid + 1;
            else if (value < array[mid])
                high = mid;

        }

        return -1;
    }
1 голос
/ 25 декабря 2010

Первая проблема заключается в том, что вы никогда не меняете значение strsearchnum - поэтому вы всегда получите исключение Stackoverflow, поскольку его бесконечная рекурсия.В общем, для рекурсивного двоичного поиска вы хотите, чтобы ваш метод binarySearch передавал искомое число, минимальное и максимальное и изменял минимальное и максимальное в соответствии с алгоритмом двоичного поиска.Подпись метода должна выглядеть примерно так:

int binarySearch(int min, int max, int num)
{

}

Это должно помочь вам начать работу.

0 голосов
/ 29 декабря 2010

Так работает BinarySearch ...

Бинарный алгоритм поиска больше эффективнее, чем линейный поиск алгоритм, но он требует, чтобы массив будет отсортирован.

    // perform a binary search on the data      
     public int binarysearch(string strsearchnum)
{

    string[] source = textBox1.Text.Split(',');
    int[] data = new int[source.Length];
    for (int i = 0; i < source.Length; i++)
    {
        data[i] = Convert.ToInt32(source[i]);
    }


  int low = 0 ; // low end of the search area                
  int high = data.length - 1 ; // high end of the search area
  int middle = ( low + high + 1 ) / 2 ; // middle element    
  int location = -1; // return value; -1 if not found        

  do // loop to search for element
     {


    // if the element is found at the middle               
     if ( searchElement == data[ middle ] )                 
    location = middle; // location is the current middle

    // middle element is too high                      
    else if ( searchElement < data[ middle ] )         
    high = middle - 1 ; // eliminate the higher half
    else // middle element is too low                  
    low = middle + 1 ; // eliminate the lower half  

    middle = ( low + high + 1 ) / 2 ; // recalculate the middle
    } while ( ( low <= high ) && ( location == -1 ) );            

    return location; // return location of search key
   } // end method binarySearch                         
0 голосов
/ 25 декабря 2010

Я исправил код, как показано ниже, и он исправил:

 public int binarysearch(int searchnum)
    {
        string[] source = textBox1.Text.Split(',');
        int[] nums = new int[source.Length];
        for (int i = 0; i < source.Length; i++)
        {
            nums[i] = Convert.ToInt32(source[i]);
        }
        int first = 0;
        int last = nums.Length - 1;


        while (1 <= nums.Length)
        {
            int mid = (int)Math.Floor((first + last) / 2.0);
            if (first > last)
            {
                break;
            }
            if (searchnum < nums[mid])
            {
                last = mid - 1;
            }
            if (searchnum > nums[mid])
            {
                first = mid + 1;
            }
            if (searchnum == nums[mid])
            {
                return nums[mid];
            }
        }
        return -1;

    }
...