一、數據結構與算法概述


一、數據結構與算法概述

1.1什么是數據結構?

官方解釋:

數據結構是一門研究非數值計算的程序設計問題中的操作對象, 以及他們之間的關系和操作等相關問題的學科。

大白話:

數據結構就是把數據元素按照一定的關系組織起來的集合, 用來組織和存儲數據

1.2數據結構分類

傳統上,我們可以把數據結構分為邏輯結構物理結構兩大類。

邏輯結構分類:

​ 邏輯結構是從具體問題中抽象出來的模型,是抽象意義上 的結構,按照對象中數據元素之間的相互關系分類。

a.集合結構:集合結構中數據元素除了屬於同一個集合外,他們之 間沒有任何其他的關系。

b.線性結構:線性結構中的數據元素之間存在一對一的關系

c.樹形結構:樹形結構中的數據元素之間存在一對多的層次關系

d.圖形結構:圖形結構的數據元素是多對多的關系

物理結構分類:

​ 邏輯結構在計算機中真正的表示方式(又稱為映像)稱為物理結構, 也可以叫做存儲結構。常見的物理結構有順序 存儲結構、鏈式存儲結構。

順序存儲結構:

​ 把數據元素放到地址連續的存儲單元里面,其數據間的邏 輯關系和物理關系是一致的 ,比如我們常用的數組就是 順序存儲結構。

順序存儲結構存在一定的弊端,就像生活中排時也會有人插隊也可 能有人有特殊情況突然離開,這時候整個結構都 處於變化中,此時就需要鏈式存儲結構。

鏈式存儲結構:

是把數據元素存放在任意的存儲單元里面,這組存儲單元可以是連續的也可以是不連續的。此時,數據元素之間並 不能反映元素間的邏輯關系,因此在鏈式存儲結構中引進了一個指針存放數據元素的地址,這樣通過地址就可以找 到相關聯數據元素的位置。

1.3什么是算法?

官方解釋:

​ 算法是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。

大白話:

​ 根據一定的條件,對一些數據進行計算,得到需要的結果。

1.4算法初體驗

一個優秀的算法追求以下兩個目標:

​ 1.花最少的時間完成需求;

​ 2.占用最少的內存空間完成需求;

需求1:

​ 計算1到100的和。

第一種解法:
    public static void main(String[] args) {
        int sum = 0;
        int n=100;
        for (int i = 1; i <= n; i++) {
            sum += i;
        }
        System.out.println("sum=" + sum);
    }

第二種解法:
    public static void main(String[] args) {
        int sum = 0;
        int n=100;
        sum = (n+1)*n/2;
        System.out.println("sum="+sum);
    }

第一種解法要完成需求,要完成以下幾個動作:
 1.定義兩個整型變量;
 2.執行100次加法運算;
 3.打印結果到控制台;
第二種解法要完成需求,要完成以下幾個動作:
 1.定義兩個整型變量;
 2.執行1次加法運算,1次乘法運算,一次除法運算,總共3次運算;
 3.打印結果到控制台;
很明顯,第二種算法完成需求,花費的時間更少一些。

需求2:

​ 計算10的階乘

第一種解法:
public class Test {
    public static void main(String[] args) {
//測試,計算10的階乘
        long result = fun1(10);
        System.out.println(result);
    }
    //計算n的階乘
    public static long fun1(long n){
        if (n==1){
            return 1;
        }
        return n*fun1(n-1);
    }
}

第二種解法:
public class Test {
    public static void main(String[] args) {
//測試,計算10的階乘
        long result = fun2(10);
        System.out.println(result);
    }
    //計算n的階乘
    public static long fun2(long n){
        int result=1;
        for (long i = 1; i <= n; i++) {
            result*=i;
        }
        return result;
    }
}

第一種解法,使用遞歸完成需求,fun1方法會執行10次,並且第
一次執行未完畢,調用第二次執行,第二次執行
未完畢,調用第三次執行...最終,最多的時候,需要在棧內存同
時開辟10塊內存分別執行10個fun1方法。
第二種解法,使用for循環完成需求,fun2方法只會執行一次,
最終,只需要在棧內存開辟一塊內存執行fun2方法
即可。
很明顯,第二種算法完成需求,占用的內存空間更小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM