成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用 PHP 的方式實(shí)現(xiàn)的各類算法合集

Karrdy / 773人閱讀

摘要:數(shù)據(jù)項(xiàng)是數(shù)據(jù)的不可分割的最小單位。數(shù)據(jù)項(xiàng)是對(duì)客觀事物某一方面特性的數(shù)據(jù)描述。數(shù)據(jù)對(duì)象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。數(shù)據(jù)的邏輯結(jié)構(gòu)數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)。

項(xiàng)目地址 https://github.com/m9rco/algo...

每周最少一更,求出題,求虐待 At least once a week, ask for problems and abuse
簡(jiǎn)易結(jié)構(gòu)
├──Package
│    ├── Sort  排序篇
│    │    ├── BubbleSort.php          冒泡排序
│    │    ├── HeapSort.php            堆排序   大根堆
│    │    ├── MBaseSort.php           基數(shù)排序 MSD
│    │    ├── LBaseSort.php           基數(shù)排序 LSD
│    │    ├── QuickSort.php           快速排序
│    │    ├── ShellSort.php           希爾排序
│    │    ├── MergeSort.php           歸并排序
│    │    ├── InsertSort.php          插入排序
│    │    └── SelectSort.php          選擇排序
│    │
│    ├── Query 查找篇
│    │    ├── BinaryQuery.php         二分查找
│    │    ├── InseertQuery.php        插入查找
│    │    ├── FibonacciQuery.php      斐波那契查找
│    │    └── QulickQuery.php         快速查找
│    │     
│    ├── Structure 數(shù)據(jù)結(jié)構(gòu)
│    │    ├── StackExample.php         堆棧   先進(jìn)后出 LIFO (Last In First Out)
│    │    ├── LinearChain.php          線性表 單鏈存儲(chǔ)
│    │    └── LinearOrder.php          線性表 順序存儲(chǔ) 
│    │     
│    ├── Tools 小工具集
│    │    └──  SystemSwitch.php       堆棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換  
│    │  
│    └── Other 其他
│         ├──  MonkeyKing.php         約瑟夫環(huán)
│         ├──  DynamicProgramming.php 動(dòng)態(tài)規(guī)劃
│         ├──  Fibonacci.php          斐波那契數(shù)列
│         ├──  StealingApples.php     偷蘋(píng)果求余
│         ├──  HanoiGames.php         漢諾塔游戲
│         ├──  BidirectionalQueue.php 雙向隊(duì)列
│         ├──  ColorBricks.php        彩色磚塊
│         ├──  GetCattle.php          牛年求牛
│         ├──  OnlyNumbers.php        求唯一數(shù)
│         ├──  PokerGames.php         洗撲克牌
│         └──  BigSmallReplace.php    Hello World 輸出 Olleh Dlrow
│     
├──LICENSE
└──README.md
要做什么?
記錄自己理解算法,數(shù)據(jù)結(jié)構(gòu)的過(guò)程,盡可能的簡(jiǎn)單全面以及詳細(xì),讓算法學(xué)習(xí)運(yùn)用靈活自如,加油(? ??_??)?
當(dāng)然
用 PHP 實(shí)現(xiàn)算法并替代官方提供的函數(shù)是愚蠢的事情 .但這覺(jué)不代表斟酌算法就是件無(wú)意義的事 , 每個(gè)算法都是一種思想的結(jié)晶 , 學(xué)習(xí)優(yōu)秀的思想 , 開(kāi)拓思維
什么是算法?

直白地說(shuō),算法就是任何明確定義的計(jì)算過(guò)程,它接收一些值或集合作為輸入,并產(chǎn)生一些值或集合作為輸出。這樣,算法就是將輸入轉(zhuǎn)換為輸出的一系列計(jì)算過(guò)程。來(lái)源:Thomas H. Cormen, Chales E. Leiserson (2009), 《算法導(dǎo)論第三版》。

簡(jiǎn)而言之,我們可以說(shuō)算法就是用來(lái)解決一個(gè)特定任務(wù)的一系列步驟(是的,不止計(jì)算機(jī)在使用算法,人類也同樣如此)。目前,一個(gè)有效的算法應(yīng)該含有三個(gè)重要特性:

它必須是有限的:如果你設(shè)計(jì)的算法永無(wú)休止地嘗試解決問(wèn)題,那么它是無(wú)用的。

它必須具備明確定義的指令:算法的每一步都必須準(zhǔn)確定義,在任何場(chǎng)景下指令都應(yīng)當(dāng)沒(méi)有歧義。

它必須是有效的:一個(gè)算法被設(shè)計(jì)用以解決某個(gè)問(wèn)題,那么它就應(yīng)當(dāng)能解決這個(gè)問(wèn)題,并且僅僅使用紙和筆就能證明該算法是收斂的。

對(duì)數(shù)

log10100 相當(dāng)于問(wèn)"降多少個(gè)10相乘的結(jié)果為100",答案當(dāng)然是2個(gè)了
因此log10100=2,即對(duì)數(shù)運(yùn)算是冪運(yùn)算的逆運(yùn)算

left right
23 = 8 log28 = 3
24 = 16 log216 = 4
25 = 32 log232 = 5

戰(zhàn)斗吧!少年

運(yùn)行時(shí)間

以二分查找為例,使用它可節(jié)省多少時(shí)間呢?簡(jiǎn)單查找諸葛地檢查數(shù)字,如果列表包含100個(gè)數(shù)字,最多需要猜100次。
換而言之最多需要猜測(cè)的次數(shù)與列表長(zhǎng)度相同,這被稱為線性時(shí)間(linear time),而二分查找則不同,如果列表包含100個(gè)元素
最多需要7次,如果列表包含40億個(gè)數(shù)字,最多需猜32次,而分查找的運(yùn)行時(shí)間為對(duì)數(shù)時(shí)間 O(log)

大O表示法

大O表示法是一種特殊的表示法 ,指出了算法的速度有多快。有個(gè)屌用啊,實(shí)際上,你經(jīng)常要去復(fù)制別人的代碼。
在這種情況下,知道這些算法的速度有快有慢

算法的運(yùn)行時(shí)間以不同的速度增加

例如簡(jiǎn)單查找與二分查找的區(qū)別

元素 簡(jiǎn)單查找 二分查找
100個(gè)元素 100ms 7ms
10000個(gè)元素 10s 14ms
1 000 000 000 個(gè)元素 11天 30ms

O表示發(fā)指出了算法有多快,例如列表包含n個(gè)元素,簡(jiǎn)單查找需要檢查每個(gè)元素,因此需要執(zhí)行n次操作
使用大O表示發(fā)這個(gè)運(yùn)行時(shí)間為O(n),二分查找需要執(zhí)行l(wèi)ogn次操作,使用大O表示為O(log n)

一些常見(jiàn)的大O運(yùn)行時(shí)間

O(log n) ,也叫對(duì)數(shù)時(shí)間,這樣的算法包括二分算法

O(n),也叫線性時(shí)間,這樣的算法包括簡(jiǎn)單查找。

O(n * log n) 快速排序

O(n2),選擇排序

O(n!) 即階乘時(shí)間

這里是重點(diǎn)

算法的速度指的并非時(shí)間,而是操作數(shù)的增速

談?wù)撍惴ǖ乃俣葧r(shí)間時(shí),我們說(shuō)的是隨著輸入的增加,其運(yùn)行時(shí)間將以什么樣的速度增加

算法的運(yùn)行時(shí)間用大O表示發(fā)表示

O(log n)比O(n)快,當(dāng)需要搜索的元素越多時(shí),前者比后者快的越多

編寫(xiě)解決實(shí)際問(wèn)題的程序過(guò)程

如何用數(shù)據(jù)形式描述問(wèn)題,即將問(wèn)題抽象為一個(gè)數(shù)學(xué)模型

問(wèn)題所涉及到的數(shù)據(jù)量的大小及數(shù)據(jù)之間的關(guān)系

如何在計(jì)算機(jī)中儲(chǔ)存數(shù)據(jù)及體現(xiàn)數(shù)據(jù)之間的關(guān)系

處理數(shù)據(jù)時(shí)需要對(duì)數(shù)據(jù)執(zhí)行的操作

編寫(xiě)的程序的性能是否良好

數(shù)據(jù)(Data)

是客觀事物的符號(hào)表示,在計(jì)算機(jī)科學(xué)中指的是所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序處理的符號(hào)的總稱。

數(shù)據(jù)元素(Data Element) :是數(shù)據(jù)的基本單位,在程序中通常作為一個(gè)整體來(lái)進(jìn)行考慮和處理。一個(gè)數(shù)據(jù)元素可由若干個(gè)數(shù)據(jù)項(xiàng)(Data Item)組成。

數(shù)據(jù)項(xiàng)(Data Item) : 是數(shù)據(jù)的不可分割的最小單位。數(shù)據(jù)項(xiàng)是對(duì)客觀事物某一方面特性的數(shù)據(jù)描述。

數(shù)據(jù)對(duì)象(Data Object) :是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。如字符集合C={‘A’,’B’,’C,…} 。

數(shù)據(jù)結(jié)構(gòu) :相互之間具有一定聯(lián)系的數(shù)據(jù)元素的集合。

數(shù)據(jù)的邏輯結(jié)構(gòu) : 數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)。

數(shù)據(jù)操作 : 對(duì)數(shù)據(jù)要進(jìn)行的運(yùn)算

數(shù)據(jù)類型(Data Type):指的是一個(gè)值的集合和定義在該值集上的一組操作的總稱。

數(shù)據(jù)的邏輯結(jié)構(gòu)有四種基本類型

集合:結(jié)構(gòu)中數(shù)據(jù)元素之間除了“屬于同一個(gè)集合"外,再也沒(méi)有其他的關(guān)系

線性結(jié)構(gòu):結(jié)構(gòu)中的數(shù)據(jù)元素存在一對(duì)一的關(guān)系

樹(shù)形結(jié)構(gòu):結(jié)構(gòu)中的數(shù)據(jù)元素存在一對(duì)多的關(guān)系

網(wǎng)狀或者圖狀結(jié)構(gòu):結(jié)構(gòu)中的數(shù)據(jù)元素存在多對(duì)多的關(guān)系

數(shù)據(jù)結(jié)構(gòu)的儲(chǔ)存方式

由數(shù)據(jù)元素之間的關(guān)系在計(jì)算機(jī)中有兩種不同的表示方法——順序表示和非順序表示,從則導(dǎo)出兩種儲(chǔ)存方式,順序儲(chǔ)存結(jié)構(gòu)和鏈?zhǔn)絻?chǔ)存結(jié)構(gòu)

順序存儲(chǔ)結(jié)構(gòu):用數(shù)據(jù)元素在存儲(chǔ)器中的相對(duì)位置來(lái)表示數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)(關(guān)系),數(shù)據(jù)元素存放的地址是連續(xù)的

鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):在每一個(gè)數(shù)據(jù)元素中增加一個(gè)存放另一個(gè)元素地址的指針(pointer),用該指針來(lái)表示數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)(關(guān)系),數(shù)據(jù)元素存放的地址是否連續(xù)沒(méi)有要求

數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)是密不可分的兩個(gè)方面,一個(gè)算法的設(shè)計(jì)取決于所選定的邏輯結(jié)構(gòu),而算法的實(shí)現(xiàn)依賴于所采用的存儲(chǔ)結(jié)構(gòu)

算法(Algorithm)

是對(duì)特定問(wèn)題求解方法(步驟)的一種描述,是指令的有限序列,其中每一條指令表示一個(gè)或多個(gè)操作。

算法具有以下五個(gè)特性

有窮性: 一個(gè)算法必須總是在執(zhí)行有窮步之后結(jié)束,且每一步都在有窮時(shí)間內(nèi)完成

確定性:算法中每一條指令必須有確切的含義,不存在二義性,且算法只有一個(gè)入口和一個(gè)出口

可行性: 一個(gè)算法是能行的,即算法描述的操作都可以通過(guò)已經(jīng)實(shí)現(xiàn)的基本運(yùn)算執(zhí)行有限次來(lái)實(shí)現(xiàn)

輸入: 一個(gè)算法有零個(gè)或多個(gè)輸入,這些輸入取自于某個(gè)特定的對(duì)象集合

輸出: 一個(gè)算法有一個(gè)或多個(gè)輸出,這些輸出是同輸入有著某些特定關(guān)系的量

算法和程序是兩個(gè)不同的概念

一個(gè)計(jì)算機(jī)程序是對(duì)一個(gè)算法使用某種程序設(shè)計(jì)語(yǔ)言的具體實(shí)現(xiàn)。算法必須可終止意味著不是所有的計(jì)算機(jī)程序都是算法。

評(píng)價(jià)一個(gè)好的算法有以下幾個(gè)標(biāo)準(zhǔn)

正確性(Correctness ): 算法應(yīng)滿足具體問(wèn)題的需

可讀性(Readability): 算法應(yīng)容易供人閱讀和交流,可讀性好的算法有助于對(duì)算法的理解和修改

健壯性(Robustness): 算法應(yīng)具有容錯(cuò)處理,當(dāng)輸入非法或錯(cuò)誤數(shù)據(jù)時(shí),算法應(yīng)能適當(dāng)?shù)刈鞒龇磻?yīng)或進(jìn)行處理,而不會(huì)產(chǎn)生莫名其妙的輸出結(jié)果

通用性(Generality): 算法應(yīng)具有一般性 ,即算法的處理結(jié)果對(duì)于一般的數(shù)據(jù)集合都成立

效率與存儲(chǔ)量需求: 效率指的是算法執(zhí)行的時(shí)間;存儲(chǔ)量需求指算法執(zhí)行過(guò)程中所需要的最大存儲(chǔ)空間,一般地,這兩者與問(wèn)題的規(guī)模有關(guān)
算法的時(shí)間復(fù)雜度

算法中基本操作重復(fù)執(zhí)行的次數(shù)是問(wèn)題規(guī)模n的某個(gè)函數(shù),其時(shí)間量度記作T(n)=O(f(n)),稱作算法的漸近時(shí)間復(fù)雜度(Asymptotic Time complexity),簡(jiǎn)稱時(shí)間復(fù)雜度

算法的空間復(fù)雜度

是指算法編寫(xiě)成程序后,在計(jì)算機(jī)中運(yùn)行時(shí)所需存儲(chǔ)空間大小的度量,記作:S(n)=O(f(n)),其中n為問(wèn)題規(guī)模

遞歸和循環(huán)的簡(jiǎn)單比較:

從程序上看,遞歸表現(xiàn)為自己調(diào)用自己,循環(huán)則沒(méi)有這樣的形式。

遞歸是從問(wèn)題的最終目標(biāo)出發(fā),逐漸將復(fù)雜問(wèn)題化為簡(jiǎn)單問(wèn)題,并且簡(jiǎn)單的問(wèn)題的解決思路和復(fù)雜問(wèn)題一樣,同時(shí)存在基準(zhǔn)情況,就能最終求得問(wèn)題,是逆向的。而循環(huán)是從簡(jiǎn)單問(wèn)題出發(fā),一步步的向前發(fā)展,最終求得問(wèn)題,是正向的。

任意循環(huán)都是可以用遞歸來(lái)表示的,但是想用循環(huán)來(lái)實(shí)現(xiàn)遞歸(除了單向遞歸和尾遞歸),都必須引入棧結(jié)構(gòu)進(jìn)行壓棧出棧。

一般來(lái)說(shuō),非遞歸的效率高于遞歸。而且遞歸函數(shù)調(diào)用是有開(kāi)銷的,遞歸的次數(shù)受堆棧大小的限制。

一起進(jìn)步學(xué)習(xí)

Fork 我的項(xiàng)目并提交你的 idea

Pull Request

Merge

糾錯(cuò)

如果大家發(fā)現(xiàn)有什么不對(duì)的地方,可以發(fā)起一個(gè)issue或者pull request,我會(huì)及時(shí)糾正

補(bǔ)充:發(fā)起pull request的commit message請(qǐng)參考文章Commit message 和 Change log 編寫(xiě)指南
致謝

感謝以下朋友的issue或pull request:

hailwood

zhangxuanru

ifreesec

openset

License

MIT

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25713.html

相關(guān)文章

  • PHP 方式實(shí)現(xiàn)各類算法合集

    摘要:數(shù)據(jù)項(xiàng)是數(shù)據(jù)的不可分割的最小單位。數(shù)據(jù)項(xiàng)是對(duì)客觀事物某一方面特性的數(shù)據(jù)描述。數(shù)據(jù)對(duì)象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。數(shù)據(jù)的邏輯結(jié)構(gòu)數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)。 項(xiàng)目地址 https://github.com/m9rco/algo... 每周最少一更,求出題,求虐待 At least once a week, ask for problems and abuse 簡(jiǎn)...

    pakolagij 評(píng)論0 收藏0
  • PHP 方式實(shí)現(xiàn)各類算法合集

    摘要:數(shù)據(jù)項(xiàng)是數(shù)據(jù)的不可分割的最小單位。數(shù)據(jù)項(xiàng)是對(duì)客觀事物某一方面特性的數(shù)據(jù)描述。數(shù)據(jù)對(duì)象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。數(shù)據(jù)的邏輯結(jié)構(gòu)數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)。 項(xiàng)目地址 https://github.com/m9rco/algo... 每周最少一更,求出題,求虐待 At least once a week, ask for problems and abuse 簡(jiǎn)...

    leonardofed 評(píng)論0 收藏0
  • 超好谷歌瀏覽器、Sublime Text、Phpstorm、油猴插件合集

    摘要:分享一些超好用插件,打造一個(gè)不一樣的瀏覽器編輯器。一谷歌瀏覽器插件谷歌訪問(wèn)助手強(qiáng)烈推薦一鍵安裝,無(wú)需其他配置,即可訪問(wèn)谷歌。谷歌瀏覽器是很耗內(nèi)存的,該插件會(huì)自動(dòng)掛起長(zhǎng)時(shí)間未使用的網(wǎng)頁(yè),來(lái)釋放系統(tǒng)資源。 showImg(https://segmentfault.com/img/remote/1460000014011338); 分享一些超好用插件,打造一個(gè)不一樣的 GitHub、瀏覽器、...

    Rango 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<