評論舉出了很多錯誤,一直沒再去改正,太懶,確實工作之後變懶了,答應了某人的事情一直也沒開始,開頭不易,
雖荒廢很多時間,但是種下一棵樹最好是在十年前,或者是現在。立下的目標也會逐一去實現。
記於2016-6-22 23:39:13
評論中的錯誤,find返回number看起來是個bug,不過仔細看下判斷方法,就發現很特別了。
if(ua.find(1) != ua.number){ System.out.println("find,the number index is "+ua.find(1)); }else{ System.out.println("not found!"); }如果返回的是number,那麼說明沒找到。思路不同而已。
二分尋找有問題,確實是while(end>=start)。
數組的用處是什麼呢。——當你需要將30個數進行大小排列的時候,用數組這樣的資料結構儲存是個很好的選擇,當你是一個班的班主任的時候,每次要記錄那些學生的缺勤次數的時候,數組也是很有用。數組可以進行插入,刪除,尋找等。
1)建立和記憶體配置
Java中有兩種資料類型,基本類型和物件類型,也有人稱為參考型別,Java中把數組當成對象,建立數組時使用new操作符。
int array[] = new int[10];
既然是對象,那麼array便是數組的一個引用,根據 Java編程思想(一) —— 一切都是對象 的記憶體配置,array會在棧中開闢空間,並且空間儲存著儲存數組儲存的地址,真正儲存對象的地方是對,new操作在堆中開闢了所需的空間,然後array指向頭地址。
初始化:
public class UseArray { public static void main(String[] args) { int array[] = new int[10]; System.out.println(array[2]); UseArray a[] = new UseArray[12]; System.out.println(a[1]); int array2[] ={1,2,3,4,5,5,6}; }}new後的數組裡面的值被預設初始化為0,而對象的初始化是空的,null,當然還可以通過{}的方式初始化。
2)數組封裝後的使用
public class UseArray { private int[] array; private int number = 0; public UseArray(int max){ array = new int[max]; } public void insert(int value){ array[number] = value; number++; } public int find(int value){ for (int i= 0; i < number; i++) { if(array[i]==value) return i; } return number; } public boolean delete(int value){ int index = find(value); if(index != number){ for (int i = index; i < number-1; i++) { array[i] = array[i+1]; } number--; return true; } return false; } public void display(){ for (int i = 0; i < number; i++) { System.out.printf(array[i]+" "); } } public static void main(String[] args) { UseArray ua = new UseArray(5); ua.insert(1); ua.insert(2); ua.insert(6); ua.insert(7); ua.insert(3); ua.display(); if(ua.find(5) != ua.number){ System.out.println("find,the number index is "+ua.find(5)); }else{ System.out.println("not found!"); } if(ua.delete(5)!=true){ System.out.println("can not delete!"); } ua.display(); }}
將整個數組封裝,用number代替數組的個數,插入資料的時候也不必理會往哪個下標插,當然,也可以自訂一個具體下標的方法。
方法比較簡單就不介紹了,但是存在的一個缺點在delete那裡,其實只是從刪除元素開始的左移而已,所以,雖然number減少了,但是最後一個元素並沒有刪除掉,只是display輸出展示的時候隱藏了而已,但是,下次插入元素的時候新元素便會取代掉最後一個元素的位置。
3)尋找最佳化——二分尋找
public int find(int value){ int start = 0; int end = number-1; while(end>=start){ int index =(end + start)/2; if(array[index]==value){ return index; }else if(array[index] >value){ end = index-1; }else { start = index+1; } } return number; } 二分尋找前提是數組已經有序。剛開始index寫成end和start相減,造成死迴圈。其實要的是相加。1,2,3,6,7。index=2,value=7,3小於7,start=3,那麼index要的是3和4間的中間數,所以是相加之後除以2,6小於7,start=4,find到7。
排序的話倒是看—— Java資料結構和演算法(三)——簡單排序。
儲存物件的話原理一樣。
4)大O標記法
設N為資料總數,加入插入一個資料時間為K。
那麼線性尋找總時間T=K*N/2,因為尋找的話大概為比較數目的一半。
二分尋找的話T=k*log2(N)。
大O標記法,O可以看成是order of,大約是的意思,k/2也是常數,所以可以看成是O(N)。
數組的缺點呢,就是大小固定,尋找慢,如果你要經常尋找百萬層級的資料,還會用數組嗎。不會的,所以資料結構的選用要結合具體的實際情況,達到最大的效率值。