二分查找, 數組相關

無序數組的優點:插入快,如果知道下標,可以很快的存取  //反正無序的, 隨便放

無序數組的缺點:查找慢,刪除慢,大小固定。 //需要一個一個比較,時間複雜度位On

有序數組的優點:查找效率高, 使用二分法查找快,(數組必須有序, 有重複數據時需根據情況返回第幾個)

有序數組的缺點:刪除和插入慢,大小固定  //刪除, 插入 都需要 大量移動位置. 

 

簡單二分法實現(有問題指正啊,  本人菜鳥):

二分原理:

如果current就是我們要找的數據項,則返回下標,如果不是,就要分兩種情況來考慮:如果current指向的數據項比我們要找的數據小,則證明該元素只可能在current+1和end之間,即數組後一半中(數組是從小到大排列的),下輪要從後半段檢索;如果current指向的數據項比我們要找的數據大,則證明該元素只可能在start和curIn之間,下一輪要在前半段中檢索
.依次重複上述操作(start  end 一直改變),直到找到這個值,或者最後剩餘一個數據, start==end. 還不是,返回-1,未找到.

也可以遞歸實現, 但是遞歸同樣會有死循環的風險, 而且, 空間複雜度大

/**
 * @description  如果不是無序的, 則會死循環, 比如current下表值, 大於start和end, 或者小於,  有重複值 也會有麻煩.
 * @author huangYaDong
 * @date 2019/5/8
 * @param arry 一個從小到大的數組 無重複值, tar 需要找到的值
 * @return -3長度爲0 -1 未找到. -2未排序 ,  返回下標
 * @other
 */
private static  int find(int[] arry,int tar){
    int start = 0;
    int end = arry.length-1;
    if (end==-1){
        return -3; //數組長度爲0
    }
    int current;
    while (true){
        current = (start+end)/2;
        if(tar==arry[current]){
            return current;
        }else if (current==start){
            if (current==end){
                return  -1;
            }
        }else if ((tar>arry[start]&&tar>arry[end]) || (tar < arry[start]&&tar<arry[end])){
            return -2;  //無序的操作返還. 怕死循環
        }else if(tar>arry[current]){
            start = current+1;
        }else{
            end = current-1;
        }
    }
}

鏈表相對於數組來說. 

class linklist{

int data;//存儲數據

linklist next; //賦值的時候 將此變量 指向下一個linklist對象.

}

List 有序,可重複

ArrayList
優點: 底層數據結構是數組,查詢快,增刪慢。
缺點: 線程不安全,效率高
Vector
優點: 底層數據結構是數組,查詢快,增刪慢。
缺點: 線程安全,效率低
LinkedList
優點: 底層數據結構是鏈表,查詢慢,增刪快。
缺點: 線程不安全,效率高

 

Set 無序,唯一

HashSet
底層數據結構是哈希表。(無序,唯一)
如何來保證元素唯一性?
1.依賴兩個方法:hashCode()和equals()

LinkedHashSet
底層數據結構是鏈表和哈希表。(FIFO插入有序,唯一)
1.由鏈表保證元素有序
2.由哈希表保證元素唯一

TreeSet
底層數據結構是紅黑樹。(唯一,有序)
1. 如何保證元素排序的呢?
自然排序
比較器排序
2.如何保證元素唯一性的呢?
根據比較的返回值是否是0來決定

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章