Логическая ошибка с моим кодом - PullRequest
1 голос
/ 16 января 2009

Я написал этот код, и он всегда показывает одни и те же результаты, почему? Код является методом поиска.

using System;
using System.Collections.Generic;
using System.Text;

namespace CArraySe
{
    class Program
    {
        class CArray
        {
            private int[] arr;
            private int upper;
            private int numElements;
            private int compCount;

            public CArray(int size)
            {
                arr = new int[size];
                upper = size - 1;
                numElements = 0;
                compCount = 0;
            }

            public void Insert(int item)
            {
                arr[numElements] = item;
                numElements++;
            }

            public void DisplayElements()
            {
                for (int i = 0; i <= upper; i++)
                {
                    Console.Write(arr[i]);
                    if (i == upper)
                    {
                        Console.WriteLine();
                        continue;
                    }
                    Console.Write(", ");
                }
            }

            public void Clear()
            {
                for (int i = 0; i <= upper; i++)
                    arr[i] = 0;
                numElements = 0;
            }
            public bool SeqSearch(CArray n, int sValue)
            {
                for (int index = 0; index < n.upper; index++)
                {
                    if (arr[index] == sValue)

                        return true;
                }

                compCount++;
                return false;
            }
            public int binSearch(CArray n, int value)
            {
                int upperBound, lowerBound, mid;
                upperBound = n.upper; lowerBound = 0;

                while (lowerBound <= upperBound)
                {
                    mid = (upperBound + lowerBound) / 2;

                    if (arr[mid] == value)
                        return mid;

                    else if (value < arr[mid]) upperBound = mid - 1;

                    else lowerBound = mid + 1;
                }
                compCount++;
                return -1;
            }

            static void Main(string[] args)
            {
                CArray nums = new CArray(10);
                Random rnd = new Random(100);
                for (int i = 0; i < 10; i++)
                    nums.Insert((int)(rnd.NextDouble() * 100));

                Console.WriteLine();
                Console.Write("The Binary Search Result is: ");
                Console.WriteLine(nums.binSearch(nums, 500));
                Console.WriteLine(nums.compCount);
                nums.Clear();
                for (int i = 0; i < 10; i++)
                    nums.Insert((int)(rnd.NextDouble() * 100));

                Console.Write("The Sequential Search result is: ");
                Console.WriteLine(nums.SeqSearch(nums, 500));
                Console.WriteLine(nums.compCount);
           }
       }
    }
}

Он всегда показывает один и тот же результат, даже если я меняю номер, который ищу.

Вывод:

The Binary Search Result is: -1
1
The Sequential Search result is: False
2
Press any key to continue . . .

Ответы [ 6 ]

8 голосов
/ 16 января 2009

Я думаю, что ваше значение для поиска (500) не найдено. Попробуйте вывести массив nums и убедиться, что то, что вы ищете, находится в массиве.

Плюс, один поиск возвращает int, а другой возвращает bool. Есть ли конкретная причина для этого?

Редактировать: Также Бинарный поиск работает только с отсортированными списками.

4 голосов
/ 16 января 2009

Ваш метод binSearch возвращает «-1», когда число не найдено. Поскольку вы заполняете свой массив случайными значениями, вероятность того, что искомое число не будет найдено, очень высока. Таким образом, вы всегда получаете «-1».

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

0 голосов
/ 17 января 2009

Хотя это, вероятно, не отвечает на ваш вопрос напрямую, вот некоторые наблюдения, которые затрудняют понимание и отладку вашего кода:

Вам нужен либо один из элементов numElements, либо верхний, а не оба. В Clear () вы устанавливаете только numElements на 0, в то время как вы используете верхний в своих циклах везде? Двоичный поиск работает только с отсортированными массивами Если SeqSearch и BinSearch получают экземпляр массива, не должны ли они быть статическими методами вместо методов экземпляра?
0 голосов
/ 17 января 2009

Запуск того, что вы указали, не добавляет значения выше 100. Если вы измените свое добавление на это:

        for (int i = 0; i < 9; i++)
            nums.Insert((int)(rnd.NextDouble() * 100));
        nums.Insert(500);

binSearch возвращает 9, но SeqSearch возвращает false, потому что ваш цикл поиска имеет индекс

        nums.Insert(500);
        for (int i = 0; i < 9; i++)
            nums.Insert((int)(rnd.NextDouble() * 100));

Вернет -1; и верно для SeqSearch.

0 голосов
/ 16 января 2009

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

0 голосов
/ 16 января 2009

Первый ответ правильный. Кроме того, даже если вы используете случайное число, каждый запуск программы будет генерировать одинаковую последовательность случайных чисел. Вы должны заполнять его новым номером каждый раз, когда запускаете программу, если хотите хорошо протестировать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...