Java資料結構和演算法(二)——數組__Java資料結構和演算法

來源:互聯網
上載者:User

評論舉出了很多錯誤,一直沒再去改正,太懶,確實工作之後變懶了,答應了某人的事情一直也沒開始,開頭不易,

雖荒廢很多時間,但是種下一棵樹最好是在十年前,或者是現在。立下的目標也會逐一去實現。

記於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)。


數組的缺點呢,就是大小固定,尋找慢,如果你要經常尋找百萬層級的資料,還會用數組嗎。不會的,所以資料結構的選用要結合具體的實際情況,達到最大的效率值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.