無序數組的優點:插入快,如果知道下標,可以很快的存取 //反正無序的, 隨便放
無序數組的缺點:查找慢,刪除慢,大小固定。 //需要一個一個比較,時間複雜度位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來決定