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;

} // メイン終了

誰か助けてくれませんか

ここで誰かを怒らせたら申し訳ありませんが...私は涙を流していることを理解してください。私が見たのは、それが行われる直前の日曜日に、ループの最後の時間に基づいて毎回最小値を見つけると思っていたので、戻ってくる値が正しくないということを私に突きつけたときに、土壇場でコメントを入れていたからです。パート2でも問題を抱えていた2つのパートがあることに注意してください。少なくとも、パート1でクレジットを回すことができると思っていましたが、少なくとも0よりはましだったという発見に気付かなかったと思います。私はそうではありません誰かに宿題をやってもらいたい! しかし、そこにあるすべてのフォーラムについて、誰が初心者に最も無礼であるか、誰がテクノのおしゃべりを十分に話すことができるか、または誰が最も多くのポイントを獲得して人々に感銘を与えることができるかが、前払いの概念よりも重要になっていると考え始めています. 誰も気にしていないと思いますが、今日の時点で、日曜日から5時間ほど睡眠をとっています。たまたま、夫が(長い間ではありませんが)また浮気をしていることを確認するテキストメッセージを見つけました。それ以来、私がいくらか機能し、少なくともプログラムに似ていて、今では Freddy Kruger が C++ の書き方を学んでいるように見える多くの人々の助けを借りて. この時点で、私が持っていた 3.87 の GPA がホールにドロップ キックされていることは確かですが、肝心なのは、それを提出するという奇跡が起こるかどうかということです。今はどうでもいい、わからないなら今すぐ諦めるべきだから。ほとんどの課題は学んだことの上に成り立っているので、これができない場合は次の課題で何をしますか。申し訳ありませんが、私はこれに少し時間がかかりますが、最終的には概念を理解するので、時々理由と方法が必要なだけです.私は以前よりも気分が悪く、なぜこれがうまくいかなかったのかを教えてくれる人. あなたが言うフォーラムは助けになると言っていますが、誰かが私を助けてくれませんか? 申し訳ありませんが、これについては少し時間がかかりますが、最終的には概念を理解するので、理由と方法が必要な場合があり、この投稿で今、自分の評判や私を感じさせることにあまり関心がない可能性のある人が必要です私がすでに行っているよりも悪く、なぜこれがうまくいかなかったのかを教えてくれる人. あなたが言うフォーラムは助けになると言っていますが、誰かが私を助けてくれませんか? 申し訳ありませんが、これについては少し時間がかかりますが、最終的には概念を理解するので、理由と方法が必要な場合があり、この投稿で今、自分の評判や私を感じさせることにあまり関心がない可能性のある人が必要です私がすでに行っているよりも悪く、なぜこれがうまくいかなかったのかを教えてくれる人. あなたが言うフォーラムは助けになると言っていますが、誰かが私を助けてくれませんか?

私が達成するはずだったのは、この1000要素の配列に乱数を入力することです その配列から検索キーを作成し、その値を割り当てます 線形検索を行い、それを行うのにかかる回数を数えます 配列を順番に並べ替えます 二分検索で同じことを行いますメイン ループ内の 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 に設定されている場合に許可される最大値になります。ただし、署名付きの it を使用している場合は、-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 に答える