AI:人工智能時代的一些思考


人工智能(Artificial Intelligence),英文縮寫爲AI。它是研究、開發用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。
  • 最近閱讀了阮一峯寫的一本書,書名叫將來世界的倖存者,書中對技術進步帶來的變革有着深度的思考,以「2016年3月,谷歌公司的圍棋程序 AlphaGo打敗了世界冠軍李世石」這一熱點事件觸發思考技術變革對未來人們生活的影響。的確,現今,互聯網進入了AI(人工智能)全新的時代,從PC時代到移動互聯網時代,再到人工智能時代,與此帶來的新名詞也愈來愈多,VR、AR、MR等一系列新技術正在影響着咱們的方方面面。
  • 然而技術的變革和進步也對咱們的前端開發工程師提出更高的要求,那前端是全部端中與用戶最親近的,面對技術變革的機遇和挑戰,咱們該作些什麼,該怎麼作提升本身的技術能力呢?我想這些都是咱們要即將面對和思考實踐的。
  • 下面就分享下算法與數據結構的基礎知識。

算法與數據結構

當「人工智能」、「AlphaGo」、「無人駕駛」」等詞語不斷在人們視野中出現的時候,意味着咱們正步入一個算法的時代。計算機經過提供給人類天天要面臨的各類選擇的最優解,從而讓咱們能更加高效的生活在這個信息爆炸的時代。而對於大多數非算法專業領域的程序員來講,也逐漸意識到了算法的重要性。學習算法,從而更好的應用算法,經過算法去優化代碼,提升程序效率。

1. 計算機

計算機是一門研究用計算機進行信息表示和處理的科學。這裏面涉及到兩個問題:信息的表示,信息的處理。編寫解決實際問題的程序的通常過程:
1. 如何用數據形式描述問題?—即由問題抽象出一個適當的數學模型;
2. 問題所涉及的數據量大小及數據之間的關係;
3. 如何在計算機中存儲數據及體現數據之間的關係?
4. 處理問題時須要對數據做何種運算?
5. 所編寫的程序的性能是否良好?

2. 數據結構

數據結構(Data Structure):是指相互之間具備(存在)必定聯繫(關係)的數據元素的集合。元素之間的相互聯繫(關係)稱爲邏輯結構。數據元素之間的邏輯結構有四種基本類型。


① 集合:結構中的數據元素除了「同屬於一個集合」外,沒有其它關係。
② 線性結構:結構中的數據元素之間存在一對一的關係。
③ 樹型結構:結構中的數據元素之間存在一對多的關係。
④ 圖狀結構或網狀結構:結構中的數據元素之間存在多對多的關係。

3. 數據結構的存儲方式

數據結構在計算機內存中的存儲包括數據元素的存儲和元素之間的關係的表示。
元素之間的關係在計算機中有兩種不一樣的表示方法:順序表示和非順序表示。由此得出兩種不一樣的存儲結構:順序存儲結構和鏈式存儲結構。
– 順序存儲結構:用數據元素在存儲器中的相對位置來表示數據元素之間的邏輯結構(關係)。
– 鏈式存儲結構:在每個數據元素中增長一個存放另外一個元素地址的指針(pointer ),用該指針來表示數據元素之間的邏輯結構(關係)。

例:設有數據集合A={3.0,2.3,5.0,-8.5,11.0} ,兩種不一樣的存儲結構。
順序結構:數據元素存放的地址是連續的;
鏈式結構:數據元素存放的地址是否連續沒有要求。
數據的邏輯結構和物理結構是密不可分的兩個方面,一個算法的設計取決於所選定的邏輯結構,而算法的實現依賴於所採用的存儲結構。

4. 數據結構的三個組成部分:

邏輯結構: 數據元素之間邏輯關係的描述
D_S=(D,S)
存儲結構: 數據元素在計算機中的存儲及其邏輯關係的表現稱爲數據的存儲結構或物理結構。
數據操做: 對數據要進行的運算。

5. 算法

算法(Algorithm):是對特定問題求解方法(步驟)的一種描述,是指令的有限序列,其中每一條指令表示一個或多個操做。算法具備如下五個特性:
① 有窮性: 一個算法必須老是在執行有窮步以後結束,且每一步都在有窮時間內完成。
② 肯定性:算法中每一條指令必須有確切的含義。不存在二義性。且算法只有一個入口和一個出口。
③ 可行性: 一個算法是能行的。即算法描述的操做均可以經過已經實現的基本運算執行有限次來實現。
④ 輸入: 一個算法有零個或多個輸入,這些輸入取自於某個特定的對象集合。
⑤ 輸出: 一個算法有一個或多個輸出,這些輸出是同輸入有着某些特定關係的量。

6. 評價一個好的算法有如下幾個標準
① 正確性(Correctness ): 算法應知足具體問題的需求。
② 可讀性(Readability): 算法應容易供人閱讀和交流。可讀性好的算法有助於對算法的理解和修改。
③ 健壯性(Robustness): 算法應具備容錯處理。當輸入非法或錯誤數據時,算法應能適當地做出反應或進行處理,而不會產生莫名其妙的輸出結果。
④ 通用性(Generality): 算法應具備通常性 ,即算法的處理結果對於通常的數據集合都成立。
⑤ 效率與存儲量需求: 效率指的是算法執行的時間;存儲量需求指算法執行過程當中所須要的最大存儲空間。通常地,這二者與問題的規模有關。

7. 時間複雜度

算法中基本操做重複執行的次數是問題規模n的某個函數,其時間量度記做 T(n)=O(f(n)),稱做算法的漸近時間複雜度(Asymptotic Time complexity),簡稱時間複雜度。
通常地,經常使用最深層循環內的語句中的原操做的執行頻度(重複執行的次數)來表示。
表示時間複雜度的階有:
O(1) :常量時間階 O (n):線性時間階
O(㏒n) :對數時間階 O(n㏒n) :線性對數時間階
O (nk): k≥2 ,k次方時間階
例1 兩個n階方陣的乘法

for(i=1,i<=n; ++i)    for(j=1; j<=n; ++j)        { c[i][j]=0 ;            for(k=1; k<=n; ++k)              c[i][j]+=a[i][k]*b[k][j] ; }          複製代碼
因爲是一個三重循環,每一個循環從1到n,則總次數爲: n×n×n=n3 時間複雜度爲T(n)=O(n3)
例2 

{++x; s=0 ;}複製代碼
將x自增當作是基本操做,則語句頻度爲1,即時間複雜度爲O(1) 。
若是將s=0也當作是基本操做,則語句頻度爲2,其時間複雜度仍爲O(1),即常量階。
例3

for(i=1; i<=n; ++i){ ++x; s+=x ; }複製代碼
語句頻度爲:2n,其時間複雜度爲:O(n) ,即爲線性階。
例4 

for(i=1; i<=n; ++i)    for(j=1; j<=n; ++j)             { ++x; s+=x ; }複製代碼
語句頻度爲:n*n*2 ,其時間複雜度爲:O(n2) ,即爲平方階。
比較關係:

O(1)<O(㏒n)<O(n)<O(n㏒n)<O(n2)<O(n3)複製代碼

8. 空間複雜度

指算法編寫成程序後,在計算機中運行時所需存儲空間大小的度量。記做: S(n)=O(f(n))
其中: n爲問題的規模(或大小)
該存儲空間通常包括三個方面:
指令常數變量所佔用的存儲空間;
輸入數據所佔用的存儲空間;
輔助(存儲)空間。
通常地,算法的空間複雜度指的是輔助空間。
一維數組a[n]: 空間複雜度 O(n)
二維數組a[n][m]: 空間複雜度 O(n*m)

習題
例5

for(i=2;i<=n;++i)

    for(j=2;j<=i-1;++j){     ++x; a[i,j]=x; }複製代碼


算法的學習方法

把全部經典算法寫一遍
看算法有關源碼
加入算法學習社區,相互鼓勵學習
看經典書籍
刷題

常見的數據結構

數組
數組是相同數據類型的元素按必定順序排列的集合,是一塊連續的內存空間。

鏈表
鏈表是一種非連續、非順序的結構,數據元素的邏輯順序是經過鏈表中的指針連接次序實現的,鏈表由一系列結點組成。這些節點沒必要在內存中相連。每一個節點由數據部分Data和鏈部分Next,Next指向下一個節點,這樣當添加或者刪除時,只須要改變相關節點的Next的指向,效率很高。



隊列
隊列是一種特殊的線性表,特殊之處在於它只容許在表的前端進行刪除操做,而在表的後端進行插入操做,亦即所謂的先進先出(FIFO)。
生活中形象舉例:在火車站排隊買票,在超市排隊結帳等。

棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅容許在表的一端進行插入和刪除運算。這一端被稱爲棧頂,相對地,把另外一端稱爲棧底。它體現了後進先出(LIFO)的特色。
棧的應用很是普遍,在平常生活中,有許多相似棧的例子,如刷洗盤子時,依次把每一個洗淨的盤子放到洗好的盤子上。至關於進棧;取用盤子時,從一摞盤子上一個接一個地向下拿,至關於出棧。



集合
集合是指具備某種特定性質的具體的或抽象的對象彙總成的集體,這些對象稱爲該集合的元素,其主要特性是元素不可重複。

散列表
散列表也叫哈希表,是根據關鍵鍵值(Keyvalue)進行訪問的數據結構,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度,這個映射函數叫作散列函數。

樹(tree)是包含n(n>0)個節點的有窮集合,其中:
每一個元素稱爲節點(node);
有一個特定的節點被稱爲根節點或樹根(root)。
除根節點以外的其他數據元素被分爲m(m≥0)個互不相交的結合T1,T2,……Tm-1,其中每個集合Ti(1<=i<=m)自己也是一棵樹,被稱做原樹的子樹(subtree)。


樹這種數據結構在計算機世界中有普遍的應用,好比操做系統中用到了紅黑樹,數據庫用到了B+樹,編譯器中的語法樹,內存管理用到了堆(本質上也是樹),信息論中的哈夫曼編碼等。

二叉樹
定義
二叉樹是每一個節點最多有兩棵子樹的樹結構。一般子樹被稱做「左子樹」和「右子樹」。二叉樹常被用於實現二叉查找樹和二叉堆。

相關性質
二叉樹的每一個結點至多隻有2棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。
二叉樹的第i層至多有2^(i-1)個結點;深度爲k的二叉樹至多有2^k-1個結點。
一棵深度爲k,且有2^k-1個節點的二叉樹稱之爲 滿二叉樹 ;
深度爲k,有n個節點的二叉樹,當且僅當其每個節點都與深度爲k的滿二叉樹中,序號爲1至n的節點對應時,稱之爲 徹底二叉樹 。



樹和二叉樹的區別
(1) 二叉樹每一個節點最多有2個子節點,樹則無限制。
(2) 二叉樹中節點的子樹分爲左子樹和右子樹,即便某節點只有一棵子樹,也要指明該子樹是左子樹仍是右子樹,即二叉樹是有序的。
(3) 樹決不能爲空,它至少有一個節點,而一棵二叉樹能夠是空的。

     數據結構裏最重要的兩個結構就是樹和圖。好比一個公司由上到下的成員職位、一天中要作的事、一輩子的計劃、你的目標能夠分爲一個個小的目標等等都是至關於數據結構中的樹的應用。圖是描述事物之間關係的,當你要想去某個地方時,GPS系統爲何能給指出一條兩地之間的路線,這就是利用了圖的存儲和遍歷運算,求出最優解。在現實生活中不少複雜的關係均可以用圖來描述並利用圖去解決一些問題。
相關文章
相關標籤/搜索