第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

對(duì)排序的字符串?dāng)?shù)組進(jìn)行遞歸二分搜索

對(duì)排序的字符串?dāng)?shù)組進(jìn)行遞歸二分搜索

我制作了一個(gè)長(zhǎng)度為 10 的數(shù)組。每個(gè)插槽都有一個(gè)名稱(chēng)。我的目標(biāo)是隨機(jī)選擇一個(gè)名稱(chēng)并進(jìn)行二分搜索來(lái)找到它。我不明白它有什么問(wèn)題,但如果您至少能給我一個(gè)提示,那將非常有幫助,謝謝。這是我的代碼:    private int iRecursiveCalls = 0;    public void runRecursiveTest(){        String[] iArraySize = new String[10];        String[] aiNumbers = new String[iArraySize.length];        SecureRandom oRand = new SecureRandom();        iArraySize[0] = "John";        iArraySize[1] = "Max";        iArraySize[2] = "Kyle";        iArraySize[3] = "Sam";        iArraySize[4] = "Robert";        iArraySize[5] = "Alex";        iArraySize[6] = "Bob";        iArraySize[7] = "Daniel";        iArraySize[8] = "Felix";        iArraySize[9] = "Michael";        String iTarget = aiNumbers[oRand.nextInt(iArraySize.length)];        Arrays.sort(aiNumbers);        System.out.println("Target num: " + iTarget);        System.out.println("--- Begin Binary Search ---");        long lBegTime = System.nanoTime();        findNumbersBinarySearch(aiNumbers, iTarget, 0, iArraySize.length -1);        long lEndTime = System.nanoTime();        System.out.println("Elapsed time: " + (lEndTime - lBegTime));        System.out.println("Recursive calls: " + iRecursiveCalls);        System.out.println("--- End Binary Search ---");    }    private int findNumbersBinarySearch(String[] aiNumbers, String iTarget,                                        int iLow, int iHigh){        iRecursiveCalls++;        int iMiddle = (iHigh + iLow) / 2;        if(iTarget.equals(aiNumbers[iMiddle])){            return iMiddle;        }        else if(iTarget.compareTo(aiNumbers[iMiddle])>0){            return findNumbersBinarySearch(aiNumbers, iTarget,                    iMiddle + 1, iHigh);        }        else{            return findNumbersBinarySearch(aiNumbers, iTarget,                    iLow, iMiddle - 1);        }    }}我能做些什么來(lái)修復(fù)它?
查看完整描述

1 回答

?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊

您的算法不起作用,因?yàn)槟趯?duì)一個(gè)空數(shù)組進(jìn)行索引、排序和傳遞給您的函數(shù)。您可能在iArraySize和之間感到困惑aiNumbers;這兩個(gè)都是誤導(dǎo)性的變量名稱(chēng),因?yàn)槟鷮⒆址Q(chēng)添加到iArraySize并且aiNumbers不包含數(shù)字。您的二分搜索函數(shù)名稱(chēng)和其他變量同樣具有誤導(dǎo)性;即使函數(shù)頭采用數(shù)組,它們也使用單詞Numbers和前綴 。iString[]


此外,如果在數(shù)組中找不到目標(biāo),您的代碼將破壞調(diào)用堆棧。經(jīng)典的二分查找會(huì)返回失敗一次lo > hi;我想不出任何不包括base case 的理由。


另一個(gè)二分搜索問(wèn)題是使用公式mid = (hi - lo) / 2 + lo。這避免了如果hi + lo > Integer.MAX_SIZE.


這段代碼通過(guò)在整個(gè)過(guò)程中堅(jiān)持一個(gè)數(shù)組來(lái)解決這些問(wèn)題,使用更準(zhǔn)確的變量名并且不會(huì)溢出堆棧:


import java.util.*;

import java.security.SecureRandom;


class Main {

    private static int recursiveCalls = 0;


    public static void main(String[] args) {

        runRecursiveTest();

    }


    public static void runRecursiveTest() {

        SecureRandom rand = new SecureRandom();

        String[] names = {

            "John",

            "Max",

            "Kyle",

            "Sam",

            "Robert",

            "Alex",

            "Bob",

            "Daniel",

            "Felix",

            "Michael"

        };


        String target = names[rand.nextInt(names.length)];

        Arrays.sort(names);


        System.out.println("Target string: " + target);

        System.out.println("--- Begin Binary Search ---");


        long begin = System.nanoTime();

        System.out.println(bisect(names, target, 0, names.length - 1));

        long end = System.nanoTime();


        System.out.println("Elapsed time: " + (end - begin));

        System.out.println("Recursive calls: " + recursiveCalls);

        System.out.println("--- End Binary Search ---");

    }


    private static int bisect(String[] arr, String target, int lo, int hi) {

        recursiveCalls++;


        if (lo > hi) { return -1; }


        int mid = (hi - lo) / 2 + lo;


        if (target.equals(arr[mid])) {

            return mid;

        }

        else if (target.compareTo(arr[mid]) > 0) {

            return bisect(arr, target, mid + 1, hi);

        }


        return bisect(arr, target, lo, mid - 1);

    }

}

輸出:


Target string: Sam

--- Begin Binary Search ---

9

Elapsed time: 81385

Recursive calls: 4

--- End Binary Search ---


查看完整回答
反對(duì) 回復(fù) 2021-10-20
  • 1 回答
  • 0 關(guān)注
  • 191 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)