1

嗨,我想知道是否有人可以告诉我如何为我的最小值设置初始值,以便它们不会受到 0 初始值的偏差。该程序将查看运行二进制搜索与线性搜索所需的时间比较。这是家庭作业,当我意识到自己做了什么时,我正要上交。我现在已经彻底搞砸了我的代码,试图修复它,但我会试着把它恢复原状。感谢你给与我的帮助。

如果需要,将包含更多代码,但不想因为包含太多而受到负面评论,但认为这是最好的,然后如果需要我可以添加更多。我敢肯定它是如此明显,就像你应该使用一个while循环或其他东西,但我的大脑很累,今晚我看不到它。所以请不要笑!!!再次感谢。

using namespace std;

int main()
{
    const int arraySize = 1000;
    int numberArray[arraySize];
    int searchKey = 0, linearCount = 0, binaryCount = 0,
    linearMin = 0, linearMax = 0, linearTotal = 0, 
    binaryMin = 0, binaryMax = 0, binaryTotal = 0;
    double linearAverage = 0 , binaryAverage = 0;

    srand (time(NULL));
    for (int loopCount = 0; loopCount < arraySize; loopCount++)
    {
// gets the random number array populated with 1000 elements
        getRandomNumber(numberArray, arraySize);
// gets the search key from one of the random numbers in the array
        searchKey = getSearchKey(numberArray, arraySize);
// begins the comparisons for the linear Count
        linearCount = doLinearSearch(numberArray, arraySize, searchKey);

// Sort method used was bubbleSort for the requirement of binary search
        bubbleSort(numberArray, arraySize);

        binaryCount = doBinarySearch(numberArray, arraySize, searchKey);

//linearMin = linearCount; HERE'S WHAT I ORIGINALLY HAD BUT NOW KNOW I GOOFED
/* sets the linear Minimums and Maximums and keeps a running total for average
puts the smallest number of times in linearMin and loops through until
it finds the next smallest if any and assigns it this count number*/

       if (linearCount < linearMin) linearMin = linearCount;
       if (linearCount > linearMax) linearMax = linearCount;
       linearTotal = linearTotal + linearCount;
       linearAverage = 1 * linearTotal / arraySize;

// sets the binary Minimums and Maximums and keeps a running total for average
       if (binaryCount < binaryMin) binaryMin = binaryCount;
       if (binaryCount > binaryMax) binaryMax = binaryCount;
       binaryTotal = binaryTotal + binaryCount;
       binaryAverage = 1 * binaryTotal / arraySize;
       }

// Display results
    cout << "After 1000 tests on " << arraySize << " element arrays, \n";
    "The linear search results were:\n";
    cout << "The minimum number of comparisons to find the key was: " << linearMin << endl;
    cout << "The maximum number of comparisons to find the key was: " << linearMax << endl;
    cout << "The average number of comparisons to find the key was: " << linearAverage << endl;

    cout << "After 1000 tests on " << arraySize << " element arrays, \n";
    "The binary search results were:\n";
    cout << "The minimum number of comparisons to find the key was: " << binaryMin << endl;
    cout << "The maximum number of comparisons to find the key was: " << binaryMax << endl;
    cout << "The average number of comparisons to find the key was: " << binaryAverage << endl;

} // 结束主程序

有人能帮帮我吗

如果我在这里冒犯了任何人,我很抱歉... 意识到我在流泪,是的,流泪是因为最初我编写了一个正在运行的程序,是的,这是家庭作业。我看到是因为在周日之前,我在最后一刻发表了一些评论,当它击中我时,返回的值不可能是正确的,因为我认为每次都根据循环的最后一次找到 minimumValue。请注意,有两个部分我在第 2 部分也遇到了问题,但我认为至少我可以在第 1 部分中获得一些信用,直到我发现如果我没有注意到至少我会比 0 更好。我不是想要任何人为我做作业!但是对于那里的所有论坛,我开始认为谁可以对新手最粗鲁,或者谁可以说足够多的技术喋喋不休,或者谁可以获得最多的分数并试图给人们留下深刻印象,这已经变得比向前支付的概念更重要意味着. 我敢肯定没有人在乎那里,但截至今天,自周日以来我已经睡了大约 5 个小时,我碰巧发现一些短信确认我的丈夫(时间不长)再次欺骗我,我已经要求来自许多人的帮助,他们使我有些工作,至少类似于程序,现在看起来像弗雷迪克鲁格一直在学习如何编写 C++。在这一点上,我很确定我的 3.87 GPA 正在被踢出大厅,但底线是我是否真的能奇迹般地把它交出来' 现在没关系,因为如果我无法弄清楚,那么我现在应该放弃。大多数作业都建立在学到的东西上,所以如果我不能做到这一点,我将在下一个作业中做什么。我很抱歉,但我在这方面有点慢,但当我最终掌握了这些概念时,我有时只需要一些为什么和如何做我感觉比现在更糟,有人可以告诉我为什么这不起作用。你说的论坛是为了帮助,有人可以帮助我吗?对不起,但我在这方面有点慢,但当我最终掌握了这些概念时,我有时只需要一些为什么和如何做,现在这篇文章我只需要一个可能对他们的声誉或让我感觉不太感兴趣的人比我已经做的更糟糕,有人可以告诉我为什么这不起作用。你说的论坛是为了帮助,有人可以帮助我吗?对不起,但我在这方面有点慢,但当我最终掌握了这些概念时,我有时只需要一些为什么和如何做,现在这篇文章我只需要一个可能对他们的声誉或让我感觉不太感兴趣的人比我已经做的更糟糕,有人可以告诉我为什么这不起作用。你说的论坛是为了帮助,有人可以帮助我吗?

我应该完成的是这个用随机数填充 1000 个元素的数组从该数组创建一个搜索键并为其分配所述值执行线性搜索并计算执行它所需的次数 # 按顺序对数组进行排序 在二进制搜索中执行相同操作main 在一个循环中调用所有 5 个函数以获取 1000 次迭代的数据

随机生成器和搜索键部分确实单独工作,如果需要我会发布,但这里是搜索和排序的代码

int doLinearSearch(const int randomNumberArray[], const int arraySize, const int key)
{
int index = 0,
    position = -1,
    ctComparisons = 0;
bool keyfound = false;

while (index < arraySize && !keyfound) 
{
    if (randomNumberArray[index] == key)
    {
        keyfound = true;
        position = index;
    }
    index++;
}
ctComparisons = index + 1;
return ctComparisons;

}

void bubbleSort(int randomNumberArray[], const int arraySize)
{
bool swapFlag;
int tempHolder;

do
{
    swapFlag = false;
    for (int count = 0; count < (arraySize - 1); count++)
    {
        if (randomNumberArray[count] > randomNumberArray[count + 1])
        {
            tempHolder = randomNumberArray[count];
            randomNumberArray[count] = randomNumberArray[count + 1];
            randomNumberArray[count + 1] = tempHolder;
            swapFlag = true;
        }
    }
} while (swapFlag);

}

int doBinarySearch(const int randomNumberArray[], const int arraySize, const int key)
{
int firstElement = 0,
    lastElement = arraySize - 1,
    middleSearch,
    position = -1,
    ctComparisons = 0;
bool keyFound = false;

while (!keyFound && firstElement <= lastElement) 
{
    middleSearch = (firstElement + lastElement) / 2;

    if (randomNumberArray[middleSearch] == key)
    {
        keyFound = true;
        position = middleSearch;
    }
    else if (randomNumberArray[middleSearch] > key)
        lastElement = middleSearch -1;
    else
    {
        firstElement = middleSearch + 1;
    }
ctComparisons ++;
}
return ctComparisons;
}

我已经尝试了每个人都给出的建议,然后是一些建议,但这不是我的问题,我并不是说要穷困潦倒或害虫我只是想学习,并且会非常感激,并承诺有一天会支付它出色地。

我运行它,它似乎实际上并没有把我的比较计数放在我循环的最后一次迭代中。我得到的最大数字是全盘的。那么你能告诉我是什么导致这成为噩梦吗?我知道这很简单,可能很可笑,但请......如果你愿意,我会发布所有内容

4

2 回答 2

3

您的问题似乎是:如何让我的“最小值”值检测循环内部的值。

int array[5] = { 5, 4, 3, 2, 1 };
int minVal = /* what */;
for (size_t i = 0; i < 5; ++i) {
    if (array[i] < minVal)
        minVal = array[i];
}
// minVal should be 1, not 0.

答案是:将 minVal 设置为 >= 您的最大值。如果您知道约束是什么,那就很容易了:

int minVal = LARGEST_POSSIBLE_VALUE;

您可以使用以下语法实现此目的:

unsigned int minVal = ~0;

0 的 1 补码,这将是所有位设置为 1 时允许的最大值。但如果您使用带符号的它,它会将其设置为 -1。当然,你可以在那里更具体地做

int minVal = -1;

然后进行检查

if (minVal == -1 || array[i] < minVal)
    minVal = array[i];

除非您绝对需要优化额外的测试。

或者你可以使用 climits

#include <climits>

int minVal = INT_MAX;

现在你的 minVal 将尽可能大,直到找到一个更小的值。由于在循环结束时它可能是 INT_MAX 通过赋值或找不到匹配项,因此请确保您有某种方法来确定它是哪种情况。

于 2013-09-30T06:42:55.387 回答
-2

声明一个范围Static变量..这样它就不会一次又一次地被初始化..

于 2013-09-30T06:36:38.710 回答