簡體   English   中英

編輯:二進制插入不起作用,我認為應該

[英]EDITED: Binary insertion not working as I think it should

仍然對Java陌生; 我們的教授希望我們在將ArrayList元素添加時使用非遞歸二進制搜索。 我不斷遇到出站異常,而我只是找不到原因。 我還注意到調試和逐步操作時的異常行為。 對於我的一生,我似乎無法從邏輯上弄清楚這一點。 他還希望我們也為此使用compare方法。 我的問題是弄清楚為什么/如何使數組越界越好。 任何指示和建議將不勝感激.....我們的教授年齡較大,需要DAYS才能通過電子郵件回來,而且我沒有那么長的時間來解決這個問題。 這是唯一讓我無法完成剩余任務的事情。

    public void enqueue(E item) {
    if(arr.size() == 0) {
        arr.add(item);
    }else {
        int low = 0;
        int high = (arr.size());
        while (low <= high){
            int mid = (low + high)>>1;
            if(arrComp.compare(arr.get(mid), item) < 0){
                low = (mid + 1);
            }
            else if (arrComp.compare(arr.get(mid), item) > 0){
                high = (mid - 1);
            }
            else{
                arr.add(mid,item);
            }
        }
    }
}   

***編輯當我這樣做時:

int low = 0;
int high = (arr.size() - 1);
while (low <= high){
    int mid = (low + high) / 2;
    if(arrComp.compare(arr.get(mid), item) < 0){
        low = (mid + 1);
    }
    else if (arrComp.compare(arr.get(mid), item) > 0){
        high = (mid - 1);
    }
    else{
        arr.add(mid,item);
    }
}

}

或這個:

            if(arr.size() == 0){
                     arr.add(item)
}
            int low = 0;
            int high = (arr.size() - 1);
            while (low <= high){
                int mid = (low + high) / 2;
                if(arrComp.compare(arr.get(mid), item) < 0){
                    low = (mid + 1);
                }
                else if (arrComp.compare(arr.get(mid), item) > 0){
                    high = (mid - 1);
                }
                else{
                    arr.add(mid,item);
                }
            }

    }

兩者都可以運行該方法,但實際上都不能填充arraylist。 我不明白為什么這不起作用,從邏輯上講應該填充數組,否則嗎? 這次運行沒有錯誤,但實際上什么也沒做。 數組大小為0,運行后沒有任何元素,但至少現在運行了。


幾乎完全解決了我的問題,但是現在出現了一個新的問題,我無法弄清!!

        public void enqueue(E item) {
        int low = 0;
        int high = (arr.size());
        int mid =0;
        int cmp;
        if(arr.size()==0) {
            arr.add(item);
        }/**
        else if(arr.size()==1) {
            cmp = arrComp.compare(arr.get(0), item);
            if(cmp < 0){
                arr.add(item);
            }
            else {
                arr.add(0,item);
            }
        } **/
        else {
            while (low < high){
                mid = (low + high) / 2;
                cmp = arrComp.compare(arr.get(mid), item);
                if(cmp < 0){
                    low = (mid + 1);
                }
                else if (cmp > 0){
                    high = (mid - 1);
                }                   
            }
            arr.add(mid, item);
        }

}

我的循環初始化在其他地方。 截至目前,在初始化arraylist時,使用上述enqueue方法,我的輸出為{2,3,4,5,6,6,1}。 我無法為自己的一生而得到這份訂單。 授予,我的初始化已經按順序進行了,但是根據我們的分配,在添加到列表中時,我們必須使用二進制搜索方法對此進行初始化。

為什么第一個初始化項保留在列表的末尾? (1),當所有其他值都添加到它們的正確位置時? 是否僅是因為ArrayLists的.add方法添加到列表的末尾,即使它是我要添加的第一個值(如果列表大小當前為0,則使用.add方法)嗎? 我該如何解決?

我最初的解決方案,即代碼的注釋部分,除了使輸出為{3,4,5,6,1,2}外,什么也沒做,所以我更加困惑了,現在我正在尋求建議。

 int high = (arr.size());// the why

也許您應該通過以下方式更新代碼:

  1. high = arr.size() - 1;
  2. mid = low + (high - low) / 2; //否則,當低點和高點很大時(如果大小很大),它可能會溢出整數;
  3. int cmp = arrComp.compare(arr.get(mid), item); //避免無意義的比較;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM