P 數(shù)據(jù)結(jié)構(gòu) | 算法與數(shù)據(jù)結(jié)構(gòu)



一粉怕、算法


1.1 算法

算法是獨立存在的一種解決問題的方法思想
算法可以用不同的語言進(jìn)行描述實現(xiàn)

eg:

C++描述、Python描述

1.1.1 算法的五大特性

算法的五大特性 描述
輸入 算法有0個或多個輸入
輸出 算法至少有一個輸出
有窮性 算法在有限步驟之后會自動結(jié)束而不會無限循環(huán)镇饮,并且每一個步驟可以在可接受的時間內(nèi)完成
確定性 算法的每一步都有確定的含義喝峦,不會出現(xiàn)二義性
可行性 算法的每一步都是可行的规哲,也就是說算法的每一步能夠執(zhí)行有限的次數(shù)完成

具有算法的五大特性的思路就可以稱為算法


1.2 算法的時間效率

eg(算法的時間效率的引入):

a+b+c = 1000
a**2+b**2 = c**2

求出a,b,c可能的組合

  • 單靠運行的時間來比較算法的優(yōu)劣并不一定是客觀準(zhǔn)確的
    運行時間 = 基本運算總數(shù)*基本運算的單位時間= 時間單位*單位時間

提示:

  • 時間單位對應(yīng)基本操作數(shù)
  • 基本單位的運行時間即單位時間離不開計算機(jī)環(huán)境(軟件系統(tǒng)和硬件系統(tǒng))
  • 評價算法時需要忽略機(jī)器的環(huán)境而客觀反映算法的時間效率即只考慮時間單位
  • 考慮到實際價值耍共,時間單位只看量級,不看常量因子
    示例:基于數(shù)學(xué)的函數(shù)曲線熬甫,第一象限中不管常量因子如何奥邮,n^3始終大于n^2

1.3 算法的復(fù)雜度

算法的時間復(fù)雜度 T(n)和空間復(fù)雜度 S(n)統(tǒng)稱為算法的復(fù)雜度

1.3.1 時間復(fù)雜度

T(n),n稱為問題規(guī)模

  • T(n) = a * n^m 近似于 O(n^m)(大O記法)
    所以以后提到時間復(fù)雜度罗珍,都是T(n)中最特征的部分O(n^m)洽腺,而不是整個T(n)
時間復(fù)雜度 描述
最優(yōu)時間復(fù)雜度
基本不用
算法完成工作最少需要多少基本操作

1. 反映的是最樂觀最理想的情況,價值不大覆旱,
最壞時間復(fù)雜度
常用
算法完成工作最多需要多少基本操作

1. 提供一種保證蘸朋,表明算法在此種程度的基本操作中一定能夠完成工作
平均時間復(fù)雜度 算法完成工作平均需要多少基本操作

1.對算法一個全面的評價,但衡量沒有保證扣唱,不是每個計算都能夠在基本操作中完成藕坯,也會因為算法的實例分布可能并不均勻而難以計算
  • 因此我們最關(guān)注的是算法的最壞情況,即最壞時間復(fù)雜度噪沙,是算法的保證

1. 時間復(fù)雜度的基本計算規(guī)則

基本計算規(guī)則 描述
基本操作 即只有幾個常數(shù)項炼彪,O(1)
順序結(jié)構(gòu) 時間復(fù)雜度按加法計算
循環(huán)結(jié)構(gòu) 時間復(fù)雜度按乘法計算
分支結(jié)構(gòu) 時間復(fù)雜度最大值

eg:

由于程序執(zhí)行if-elif-else時,只會選擇基本的三個分支的一個去執(zhí)行正歼,所以選取三個分支的時間復(fù)雜度的最大值即可
  • 判斷一個算法的效率時辐马,往往只看操作數(shù)量的最高次項,其他次要項和常數(shù)項可以忽略
  • 沒有特殊說明局义,算法的時間復(fù)雜度就是最壞時間復(fù)雜度

2. 常見的時間復(fù)雜度

執(zhí)行次數(shù)函數(shù)示例 非正式語
12 O(1) 常數(shù)階
5log_2n+12 O(logn) 對數(shù)階
2n+12 O(n) 線性階
2n+5nlogn+12 O(nlogn) nlogn
3n^2+2n+12 O(n^2) 平方階
6n^3+3n^2+2n+12 O(n^3) 立方階
2^n O(2^n) 指數(shù)階
n! O(n!) 階乘階
n^n O(n^n) ?
  • 從上往下喜爷,時間復(fù)雜度越來越大

提示:

  • log_2n 簡寫為 logn

3. Python內(nèi)置類型性能分析

(1) timeit模塊

用來測試一小段python代碼的執(zhí)行速度

import timeit


timeit.Timer(stmt='pass', setup='pass')
# timeit()會重新開辟空間運行冗疮,即使用時需要導(dǎo)入含被測函數(shù)的包
avg_res = timeit.Timer.timeit(number=1000000)
參數(shù) 說明
Timer 測試小段代碼執(zhí)行速度的類
stmt 要測試的代碼語句(statment)
setup 運行代碼時需要的設(shè)置
timer Timer()中其他參數(shù)

1. 定時器函數(shù),與平臺有關(guān)
timeit() Timer類中測試語句的執(zhí)行速度的對象方法
number 測試代碼時的測試次數(shù)檩帐,默認(rèn)一百萬次
avg_res 執(zhí)行代碼的平均耗時

1. 數(shù)據(jù)類型:float類型

2. 單位:秒
  • 啟動文件
    當(dāng).py自啟動時术幔,其模塊名應(yīng)該是__main__
    當(dāng)其他.py調(diào)用某.py時,調(diào)用的模塊名應(yīng)該是該.py的文件名
(2) 應(yīng)用

eg:

列表:
內(nèi)置操作的時間復(fù)雜度

定義列表的方式:
my_list = []

  1. my_list.append()my_list.insert()
  2. [] + []
  3. [x for x in range(10000)]
  4. list(range(10000))
import timeit


def test_001():
    my_list = []
    for i in range(10000):
        my_list.append(i)


def test_002():
    my_list = []
    for i in range(10000):
        my_list = my_list + [i]


def test_003():
    my_list = [x for x in range(10000)]


def test_004():
    my_list = list(range(10000))


def test_005():
    my_list = []
    for i in range(10000):
        my_list.insert(0,i)


timer1 = timeit.Timer('test_001()', setup='from __main__ import test_001')
timer2 = timeit.Timer('test_002()', setup='from __main__ import test_002')
timer3 = timeit.Timer('test_003()', setup='from __main__ import test_003')
timer4 = timeit.Timer('test_004()', setup='from __main__ import test_004')
timer5 = timeit.Timer('test_005()', setup='from __main__ import test_005')
res1 = timer1.timeit(number=100)
res2 = timer2.timeit(number=100)
res3 = timer3.timeit(number=100)
res4 = timer4.timeit(number=100)
res5 = timer5.timeit(number=100)

print("append():%.4f" % res1)
print("[] + []:%.4f" % res2)
print("[x for]:%.4f" % res3)
print("list():%.4f" % res4)
print("insert():%.4f" % res5)

結(jié)果:

append():0.1225
[] + []:23.1820
[x for]:0.0504
list():0.0303
insert():3.0051

[]+[]> insert() > append() > [x for] > list()

字典:
內(nèi)置操作的時間復(fù)雜度


1.3.2 空間復(fù)雜度

S(n)

  • 定義為該算法消耗的存儲空間湃密,它是問題規(guī)模n的函數(shù)
  • 是對一個算法在運行過程中臨時占用存儲空間大小的量度

二诅挑、數(shù)據(jù)結(jié)構(gòu)

2.1 數(shù)據(jù)結(jié)構(gòu)

重要概念 描述
數(shù)據(jù) 它是一個抽象的概念,將其進(jìn)行分類后得到程序設(shè)計語言中的基本數(shù)據(jù)類型(只保存一個數(shù)據(jù))
結(jié)構(gòu) 就是各數(shù)據(jù)元素之間存在的特定關(guān)系
數(shù)據(jù)結(jié)構(gòu) 指數(shù)據(jù)對象中數(shù)據(jù)元素之間的關(guān)系

Python的內(nèi)置數(shù)據(jù)結(jié)構(gòu):不需要我們?nèi)ザx的數(shù)據(jù)結(jié)構(gòu)泛源,如:列表拔妥、元組、字典等

Python的擴(kuò)展數(shù)據(jù)結(jié)構(gòu):需要自定義實現(xiàn)這些數(shù)據(jù)的組織方式俩由,如棧毒嫡、隊列等
  • 不同的數(shù)據(jù)結(jié)構(gòu)癌蚁,數(shù)據(jù)存儲方式不同幻梯,就會造成算法的時間復(fù)雜度不同

三、算法與數(shù)據(jù)結(jié)構(gòu)的區(qū)別

名稱 描述
數(shù)據(jù)結(jié)構(gòu) 數(shù)據(jù)結(jié)構(gòu)只是靜態(tài)地描述了數(shù)據(jù)元素之間的關(guān)系

數(shù)據(jù)結(jié)構(gòu)是算法需要處理的問題載體
算法 為了解決實際問題而設(shè)計的
程序 高效地程序需要在數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上設(shè)計和選擇算法
  • 程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法

3.1 抽象數(shù)據(jù)類型

ADT (Abstract Data Type)
指一個數(shù)學(xué)模型以及定義在數(shù)學(xué)模型上的一組操作
即把數(shù)學(xué)類型和數(shù)學(xué)類型上的運算捆綁在一起進(jìn)行封裝

常用數(shù)據(jù)運算 描述
插入 ?
刪除 ?
修改 ?
查找 ?
排序 ?

更新中......


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末努释,一起剝皮案震驚了整個濱河市碘梢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伐蒂,老刑警劉巖煞躬,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逸邦,居然都是意外死亡恩沛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門缕减,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雷客,“玉大人,你說我怎么就攤上這事桥狡〗寥梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵裹芝,是天一觀的道長部逮。 經(jīng)常有香客問我,道長嫂易,這世上最難降的妖魔是什么兄朋? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怜械,結(jié)果婚禮上蜈漓,老公的妹妹穿的比我還像新娘穆桂。我一直安慰自己,他們只是感情好融虽,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布享完。 她就那樣靜靜地躺著,像睡著了一般有额。 火紅的嫁衣襯著肌膚如雪般又。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天巍佑,我揣著相機(jī)與錄音茴迁,去河邊找鬼。 笑死萤衰,一個胖子當(dāng)著我的面吹牛堕义,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脆栋,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼倦卖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了椿争?” 一聲冷哼從身側(cè)響起怕膛,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秦踪,沒想到半個月后褐捻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡椅邓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年柠逞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景馁。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡板壮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裁僧,到底是詐尸還是另有隱情个束,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布聊疲,位于F島的核電站茬底,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏获洲。R本人自食惡果不足惜阱表,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧最爬,春花似錦涉馁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糠悯,卻和暖如春帮坚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背互艾。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工试和, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纫普。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓阅悍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昨稼。 傳聞我的和親對象是個殘疾皇子节视,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容