引子
什麼是數據結構?如果翻閱不同的教材,可以看到五花八門的描述。事實上,這個問題在計算機科學界至今沒有標準的定義。
在計算機科學中,數據結構(英語: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