0

二分探索に問題があります。

最初は機能しますが、ユーザーがメニューからこのオプションを選択すると、配列にないリゾートでは機能せず、まったく機能しないこともあります。なぜ機能しないのかわかりません。ここでさまざまなスレッドを読んで理解しようとしましたが、困惑しています。

編集:私はそれがうまくいったと思います。コード全体を取り出して書き直しました。最終結果を見ると唯一の違いは、if else if ステートメントの括弧です。

                    if (resorts[middle].getName().compareTo(getDataFor) > 0)
                    {
                        high = middle - 1;
                    }
                    else if (resorts[middle].getName().compareTo(getDataFor) < 0)
                    {
                        low = middle + 1;
                    }
                    else
                    {
                        resorts[middle].display();
                        found = true;
                    }

お手伝いありがとう!

  else if (choice == '2')
        {
            found = false;
            while (!found)
            {    
                System.out.print("Which resort would you like data for?: ");
                getDataFor = kb.nextLine().toUpperCase();
                low = 0;
                high = resorts.length;
                while (low <= high && !found)
                {
                    middle = (high + low) / 2;
                    if (resorts[middle].getName().compareTo(getDataFor) > 0)
                        high = middle - 1;
                    else if (resorts[middle].getName().compareTo(getDataFor) < 0)
                        low = middle + 1;
                    else
                    {
                        resorts[middle].display();
                        found = true;
                    }
                }
                if (!found)
                    System.out.println("Resort not found, please try again.");
            }
        }
4

1 に答える 1

0

ゼロではなく に初期化する必要があり、一致しないセットごとに、lowまたは何も加算または減算せず にに初期化する必要があります。-1lowhighmiddle

lowおよびhighが、既に調べられていて一致する可能性がないエントリを指していることを視覚化します。配列の「外側」で両方の要素を開始します。が一致しないことが判明した場合、一致しない可能性のあるエントリの外側の境界としてorをmiddle置き換えます。lowhigh

または、候補範囲の「内側の境界」を表現するlowとを使用してコードを記述できます。この場合、 andは正しく、初期条件はandになります。highmiddle-1middle+1low=0high=length-1

どちらのビジュアライゼーションも選択できますが、開始条件 (lowおよびhigh値) に一貫性がありません。

于 2013-09-25T23:16:22.263 に答える