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

來源:互聯網
上載者:User

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

數組的用處是什麼呢?——當你需要將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){        int index = 0;        for (int i= 0; i < number; i++) {            if(array[i]==value)                return index;        }        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();        }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)。


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


JAVA資料結構與演算法

給你寫了答案如下,有問題再追問。
B
A
C
確切性
3
infexOf
隊頭指標指向隊尾


順序表:尋找方便,但插入困難;
鏈表:尋找困難,但插入方便。
// 最大值public static int getMax(int n, int[] arr) {//n是數組最後一個元素的indexif(n == 0)return arr[0];if(arr[n] > getMax(n - 1, arr))return arr[n];return getMax(n - 1, arr);}// 平均值public static int getAverage(int n, int[] arr) {//n是數組最後一個元素的indexif(n == 1)return arr[0];return (arr[n] + getAverage(n - 1, arr) * (n - 1)) / n;}//刪除節點public static Node rmNode(Node head, Node node) {Node temp = head;while(temp.next != null) {if(temp.next == node) {temp.next = node.next;break;}elsetemp = temp.next;}return head;}// 數組元素逆置public static int[] inverseArray(int[] arr) {int start = 0;int end = arr.length - 1;for(; start < arr.length / 2; start++, end--) {int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}return arr;
 
編寫一個java程式,要可以完成排序與尋找,分別使用鏈表,數組與二叉樹等資料結構,比較各種方法的優缺點

不會java,但是這個問題本質上就是個資料結構的問題,所謂排序和尋找效率依賴的是演算法和資料結構的配合,你現在定下了鏈表(沒有具體說明的話,這裡應該指的是單向鏈表吧)、數組和二叉樹,這幾個之中,那排序和尋找的資料就看用什麼演算法和相應的資料結構配合了~~~

排序演算法中,快速排序是最快的,比較適合用鏈表來處理,但是鏈表的尋找是比較慢的(雙向鏈表的話可以加快尋找速度)。
數組排序會比較慢,不是演算法的問題,而是數組的調整因為需要位移,但是數組一旦排號順序後,尋找是很快的——折半尋找。
二叉數較為平局,排序可以採用堆排序,尋找可以建二叉排序樹來找(用B+或B-樹的話可以更快)。

個人看法,不一定對,歡迎拍磚,具體代碼知道演算法了就自己上網找吧。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.