數據結構與算法概述

引子

什麼是數據結構?如果翻閱不同的教材,可以看到五花八門的描述。事實上,這個問題在計算機科學界至今沒有標準的定義。

在計算機科學中,數據結構(英語:data structure)是計算機中存儲、組織數據的方式(維基百科)

思考問題

書籍擺放

問題:如果你是書店的主人,該如何擺放你的書籍,才能讓顧客最快捷的找到想要的書籍?

  • 方法1:隨便放
放書非常方便,有新書直接插到空位。但是查找很不方便,如果沒有這本書,需要翻遍整個書架
  • 方法2:按照書名的拼音字母順序排放
新書插入需要給新書騰出空間,造成圖書需要向後移動
  • 方法3:把書架分成幾塊區域,每塊區域指定擺放某種類別的圖書;在每種類別內,按照書名的拼音字母順序排放
查找和插入工作量都減少很多,但是無法預估每種類別的圖書會有多少,容易造成空間的浪費

數字打印

問題:寫程序實現一個函數 PrintN,使得傳入一個正整數爲 N 的參數,能順序打印從 1 到 N 的全部正整數

//版本一
function PrintN($n)
{
    for ($i=1; $i <= $n; $i++) { 
        echo "{$i}\n";
    }
}
//版本二
function PrintN($n)
{
    if ($n > 0) {
        PrintN($n-1);
        echo "{$n}\n";
    }
}
當輸入 N 爲 100、1000、10000...,N 變的越來越大時候,實現版本一和版本二有什麼區別?(debug_backtrace)

一元多項式計算

問題:一元多項式的標準表達式可以寫成:f(x) = $a_0$ + $a_1$x + ... + $a_{n-1}$$x^{n-1}$ + $a_n$$x^n$。現給定一個多項式的階數 n,並將全體系數 $\{a_i\}^n_{i=0}$ 存放在數組 a[] 裏。請寫程序計算這個多項式在給定點 x 處的值

function f($n, $a, $x)
{
    $p = $a[0];
    for ($i=1; $i <= $n; $i++) { 
        $p += $a[$i] * pow($x, $i);
    }
    return $p;
}
$x = 2; $n = 1;
$a = [];
for ($i=0; $i <= $n; $i++) { 
    $a[$i] = $i+1;
}
$fn = f($n, $a, $x);
echo $fn . "\n";

通過提公因式 x 減少乘法的運算次數,把多項式改寫爲:

f(x) = $a_0$ + x($a_1$ + x(...($a_{n-1}$ + x($a_n$))...))
function f2($n, $a, $x)
{
    $p = $a[$n];
    for ($i=$n; $i > 0 ; $i--) { 
        $p = $a[$i-1] + $x * $p;
    }
    return $p;
}

解決問題的效率

解決一個非常簡單的問題,往往也有多種方法,且不同方法之間的效率可能相差甚遠。解決問題方法的效率,跟數據的組織方式有關,跟空間的利用效率有關,也跟算法的巧妙程度有關。

《PHP面試問答》https://github.com/colinlet/PHP-Interview-QA 歡迎 star 關注~~
結合實際PHP面試,彙總自己遇到的問題,以及網上其他人遇到的問題,嘗試提供簡潔準確的答案
包含網絡、數據結構與算法、PHP、Web、MySQL、Redis、Linux、安全、設計模式、架構、面試等部分

數據結構

定義

  • 數據結構的定義,首先應該包含數據對象在計算機中的組織方式——這類似於圖書的擺放方法。並且,數據對象必定與一系列加在數據對象上的操作相關聯,就如我們在書架上擺放圖書是爲了能找得到想要的書,或者是插入一本新買的書。
  • 在討論數據結構的時候,關心的是數據對象本身以及它們在計算機中的組織方式,還要關心與它們相關聯的操作集,以及實現這些操作的最高效的算法。
  • 關於數據對象在計算機中的組織方式,包含兩個概念:數據對象集的邏輯結構、數據對象集在計算機中的物理存儲結構

抽象數據類型

  • 抽象數據類型(Abstract Data Type)是一種對"數據結構"的描述,這種描述是"抽象"的。數據類型描述內容:數據對象集、與數據集合相關聯的操作集。
  • 抽象:描述數據類型的方法不依賴於具體實現,即數據對象集合操作集的描述與存放數據的機器無關、與數據存儲的物理結構無關、與實現操作的算法和編程語言均無關。抽象是計算機求解問題的基本方式和重要手段,使得一種設計可以應用於多種場景。

算法

定義

算法(algorithm)自於9世紀波斯數學家,在數學上提出了算法這個概念。

算法是一個有限指令集,它接受一些輸入(非必須),產生輸出,並一定在有限步驟之後終止。

算法不是程序,算法比程序更抽象,強調錶現做什麼,忽略細節性怎麼做。這樣的好處是使整體思路清晰易懂,形成模塊化的風格。

算法複雜度

衡量、比較算法的指標主要有以下兩個:

  • 空間複雜度 S(n):根據算法寫成的程序在執行時佔用存儲單元的長度
  • 時間複雜度 T(n):根據算法寫成的程序在執行時耗時時間的長度

分析一般算法效率:

  • 最壞情況複雜度 $T_{worst}$(n)
  • 平均複雜度 $T_{avg}$(n)

《數據結構與算法概述》 原文鏈接:https://blog.maplemark.cn/2019/07/數據結構與算法概述.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章