導航:首頁 > 源碼編譯 > 用到哪些演算法

用到哪些演算法

發布時間:2025-06-22 12:48:29

1. 軟體編程經常用的演算法都有哪些

排序演算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
分類
在計算機科學所使用的排序演算法通常被分類為:
計算的復雜度(最差、平均、和最好表現),依據串列(list)的大小(n)。一般而言,好的表現是O。(n log n),且壞的行為是Ω(n2)。對於一個排序理想的表現是O(n)。僅使用一個抽象關鍵比較運算的排序演算法總平均上總是至少需要Ω(n log n)。
記憶體使用量(以及其他電腦資源的使用)
穩定度:穩定排序演算法會依照相等的關鍵(換言之就是值)維持紀錄的相對次序。也就是一個排序演算法是穩定的,就是當有兩個有相等關鍵的紀錄R和S,且在原本的串列中R出現在S之前,在排序過的串列中R也將會是在S之前。
一般的方法:插入、交換、選擇、合並等等。交換排序包含冒泡排序(bubble sort)和快速排序(quicksort)。選擇排序包含shaker排序和堆排序(heapsort)。
當相等的元素是無法分辨的,比如像是整數,穩定度並不是一個問題。然而,假設以下的數對將要以他們的第一個數字來排序。
(4, 1) (3, 1) (3, 7) (5, 6)
在這個狀況下,有可能產生兩種不同的結果,一個是依照相等的鍵值維持相對的次序,而另外一個則沒有:
(3, 1) (3, 7) (4, 1) (5, 6) (維持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改變)
不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地時作為穩定。作這件事情的一個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個物件間之比較,就會被決定使用在原先資料次序中的條目,當作一個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。
排列演算法列表
在這個表格中,n是要被排序的紀錄數量以及k是不同鍵值的數量。
穩定的
冒泡排序(bubble sort) — O(n2)
雞尾酒排序 (Cocktail sort, 雙向的冒泡排序) — O(n2)
插入排序 (insertion sort)— O(n2)
桶排序 (bucket sort)— O(n); 需要 O(k) 額外 記憶體
計數排序 (counting sort) — O(n+k); 需要 O(n+k) 額外 記憶體
歸並排序 (merge sort)— O(n log n); 需要 O(n) 額外記憶體
原地歸並排序 — O(n2)
二叉樹排序 (Binary tree sort) — O(n log n); 需要 O(n) 額外記憶體
鴿巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 額外記憶體
基數排序 (radix sort)— O(n·k); 需要 O(n) 額外記憶體
Gnome sort — O(n2)
Library sort — O(n log n) with high probability, 需要 (1+ε)n 額外記憶體
不穩定
選擇排序 (selection sort)— O(n2)
希爾排序 (shell sort)— O(n log n) 如果使用最佳的現在版本
Comb sort — O(n log n)
堆排序 (heapsort)— O(n log n)
Smoothsort — O(n log n)
快速排序 (quicksort)— O(n log n) 期望時間, O(n2) 最壞情況; 對於大的、亂數串列一般相信是最快的已知排序
Introsort — O(n log n)
Patience sorting — O(n log n + k) 最外情況時間, 需要 額外的 O(n + k) 空間, 也需要找到最長的遞增子序列(longest increasing subsequence)
不實用的排序演算法
Bogo排序 — O(n × n!) 期望時間, 無窮的最壞情況。
Stupid sort — O(n3); 遞回版本需要 O(n2) 額外記憶體
Bead sort — O(n) or O(√n), 但需要特別的硬體
Pancake sorting — O(n), 但需要特別的硬體
排序的演算法
排序的演算法有很多,對空間的要求及其時間效率也不盡相同。下面列出了一些常見的排序演算法。這裡面插入排序和冒泡排序又被稱作簡單排序,他們對空間的要求不高,但是時間效率卻不穩定;而後面三種排序相對於簡單排序對空間的要求稍高一點,但時間效率卻能穩定在很高的水平。基數排序是針對關鍵字在一個較小范圍內的排序演算法。
插入排序
冒泡排序
選擇排序
快速排序
堆排序
歸並排序
基數排序
希爾排序
插入排序
插入排序是這樣實現的:
首先新建一個空列表,用於保存已排序的有序數列(我們稱之為"有序列表")。
從原數列中取出一個數,將其插入"有序列表"中,使其仍舊保持有序狀態。
重復2號步驟,直至原數列為空。
插入排序的平均時間復雜度為平方級的,效率不高,但是容易實現。它藉助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加,直至其長度等於原列表的長度。
冒泡排序
冒泡排序是這樣實現的:
首先將所有待排序的數字放入工作列表中。
從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。
重復2號步驟,直至再也不能交換。
冒泡排序的平均時間復雜度與插入排序相同,也是平方級的,但也是非常容易實現的演算法。
選擇排序
選擇排序是這樣實現的:
設數組內存放了n個待排數字,數組下標從1開始,到n結束。
i=1
從數組的第i個元素開始到第n個元素,尋找最小的元素。
將上一步找到的最小元素和第i位元素交換。
如果i=n-1演算法結束,否則回到第3步
選擇排序的平均時間復雜度也是O(n²)的。
快速排序
現在開始,我們要接觸高效排序演算法了。實踐證明,快速排序是所有排序演算法中最高效的一種。它採用了分治的思想:先保證列表的前半部分都小於後半部分,然後分別對前半部分和後半部分排序,這樣整個列表就有序了。這是一種先進的思想,也是它高效的原因。因為在排序演算法中,演算法的高效與否與列表中數字間的比較次數有直接的關系,而"保證列表的前半部分都小於後半部分"就使得前半部分的任何一個數從此以後都不再跟後半部分的數進行比較了,大大減少了數字間不必要的比較。但查找數據得另當別論了。
堆排序
堆排序與前面的演算法都不同,它是這樣的:
首先新建一個空列表,作用與插入排序中的"有序列表"相同。
找到數列中最大的數字,將其加在"有序列表"的末尾,並將其從原數列中刪除。
重復2號步驟,直至原數列為空。
堆排序的平均時間復雜度為nlogn,效率高(因為有堆這種數據結構以及它奇妙的特徵,使得"找到數列中最大的數字"這樣的操作只需要O(1)的時間復雜度,維護需要logn的時間復雜度),但是實現相對復雜(可以說是這里7種演算法中比較難實現的)。
看起來似乎堆排序與插入排序有些相像,但他們其實是本質不同的演算法。至少,他們的時間復雜度差了一個數量級,一個是平方級的,一個是對數級的。
平均時間復雜度
插入排序 O(n2)
冒泡排序 O(n2)
選擇排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
歸並排序 O(n log n)
基數排序 O(n)
希爾排序 O(n1.25)
冒泡排序
654
比如說這個,我想讓它從小到大排序,怎麼做呢?
第一步:6跟5比,發現比它大,則交換。564
第二步:5跟4比,發現比它大,則交換。465
第三步:6跟5比,發現比它大,則交換。456

2. 使用https訪問平台時,用到了哪些類型的演算法

安裝SSL證書後,才能用Https協議加密訪問網站,可激活客戶端瀏覽器到網站伺服器之間的"SSL加密通道"(SSL協議),實現高強度雙向加密傳輸,防止傳輸數據被泄露或篡改。

SSL證書的演算法:
SHA1: SHA1演算法是目前使用最廣泛的簽名演算法,但SHA1演算法已經存在被破解的可能性。微軟根據NIST的安全指引,要求受信任的CA機構於2016年1月1日起全面停止簽發SHA1證書。
SHA2:更安全但不支持Windows XP。SHA2簽名演算法比SHA1更安全,將逐步替代SHA1成為主流簽名演算法。但目前仍有Windows XP系統不支持SHA2簽名演算法,需打補丁SP3升級後才能支持。
沃通CA支持簽發SHA-2證書,用戶可以自主選擇簽發SHA-1證書還是 SHA-2證書。同時,沃通CA會按照國際標准制定的時間表升級PKI系統,支持從中級根證書到用戶證書全鏈SHA-2演算法支持。

3. 澶у﹀叚縐嶇▼搴忓憳瀹炵敤綆楁硶鎺ㄨ崘

紼嬪簭鍛樺疄鐢ㄧ畻娉曟湁鐢ㄦ帹鑽

綆楁硶涓: 蹇閫熸帓搴忕畻娉

蹇閫熸帓搴忔槸鐢變笢灝悸烽湇灝旀墍鍙戝睍鐨勪竴縐嶆帓搴忕畻娉曘傚湪騫沖潎鐘跺喌涓嬶紝鎺掑簭 n 涓欏圭洰瑕丱(nlog n)嬈℃瘮杈冦傚湪鏈鍧忕姸鍐典笅鍒欓渶瑕丱(n2)嬈℃瘮杈冿紝浣嗚繖縐嶇姸鍐靛苟涓嶅父瑙併備簨瀹炰笂錛屽揩閫熸帓搴忛氬父鏄庢樉姣斿叾浠朞(n log n) 綆楁硶鏇村揩錛屽洜涓哄畠鐨勫唴閮ㄥ驚鐜 (inner loop)鍙浠ュ湪澶ч儴鍒嗙殑鏋舵瀯涓婂緢鏈夋晥鐜囧湴琚瀹炵幇鍑烘潵銆

蹇閫熸帓搴忎嬌鐢ㄥ垎娌繪硶絳栫暐鏉ユ妸涓涓涓茶(list)鍒嗕負涓や釜瀛愪覆琛(sub-lists)銆

綆楁硶浜: 鍫嗘帓搴忕畻娉

鍫嗘帓搴(Heapsort)鏄鎸囧埄鐢ㄥ爢榪欑嶆暟鎹緇撴瀯鎵璁捐$殑涓縐嶆帓搴忕畻娉曘傚爢縐鏄涓涓榪戜技瀹屽叏浜屽弶鏍戠殑緇撴瀯錛屽苟鍚屾椂婊¤凍鍫嗙Н鐨勬ц川:鍗沖瓙緇撶偣鐨勯敭鍊兼垨緔㈠紩鎬繪槸灝忎簬(鎴栬呭ぇ浜)瀹冪殑鐖惰妭鐐廣

鍫嗘帓搴忕殑騫沖潎鏃墮棿澶嶆潅搴︿負O(nlogn)

綆楁硶涓: 褰掑苟鎺掑簭

褰掑苟鎺掑簭(Merge sort錛屽彴婀捐瘧浣:鍚堝苟鎺掑簭)鏄寤虹珛鍦ㄥ綊婢′綔涓婄殑涓縐嶆湁鏁堢殑鎺掑簭綆楁硶銆傝ョ畻娉曟槸閲囩敤鍒嗘不娉(Divide andConquer)鐨勪竴涓闈炲父鍏稿瀷鐨勫簲鐢ㄣ

綆楁硶鍥:浜屽垎鏌ユ壘綆楁硶

浜屽垎鏌ユ壘綆楁硶鏄涓縐嶅湪鏈夊簭鏁扮粍涓鏌ユ壘鏌愪竴鐗瑰畾鍏冪礌鐨勬悳緔㈢畻娉曘傛悳緔犺繃紼嬩粠鏁扮粍鐨勪腑闂村厓緔犲紑濮嬶紝濡傛灉涓闂村厓緔犳eソ鏄瑕佹煡鎵劇殑鍏冪礌錛屽垯鎼滅礌榪囩▼緇撴潫:濡傛灉鏌愪竴鐗 瀹氬厓緔犲ぇ騫叉垨鑰呭皬騫蹭腑闂村厓緔狅紝鍒欏湪鏁扮粍澶т簬鎴栧皬騫蹭腑闂村厓緔犵殑閭d竴鍗婁腑鏌ユ壘錛岃屼笖璺熷紑濮嬩竴鏍蜂粠涓闂村厓緔犲紑濮嬫瘮杈冦傚傛灉鍦ㄦ煇涓姝ラゆ暟緇勪負絀猴紝鍒欎唬琛ㄦ壘涓嶅埌銆傝繖 縐嶆悳緔㈢畻娉曟瘡涓嬈℃瘮杈冮兘浣挎悳緔㈣寖鍥寸緝灝忎竴鍗娿傛姌鍗婃悳緔㈡瘡嬈℃妸鎼滅儲鍖哄煙鍑忓皯涓鍗婏紝鏃墮棿澶嶆潅搴︿負O(logn) 銆

綆楁硶浜: BFPRT(綰挎ф煡鎵劇畻娉)

BFPRT綆楁硶瑙e喅鐨勯棶棰樺嶮鍒嗙粡鍏革紝鍗充粠鏌恘涓鍏冪礌鐨勫簭鍒椾腑閫夊嚭絎琸澶(絎琸灝)鐨勫厓緔狅紝閫氳繃宸у欑殑鍒嗘瀽錛孊FPRT鍙浠ヤ繚璇佸湪鏈鍧忔儏鍐典笅浠嶄負綰挎ф椂闂村嶆潅搴︺傝ョ畻 娉曠殑鎬濇兂涓庡揩閫熸帓搴忔濇兂鐩鎬技錛屽綋鐒訛紝涓轟嬌寰楃畻娉曞湪鏈鍧忔儏鍐典笅錛屼緷鐒惰兘杈懼埌o(n)鐨勬椂闂村嶆潅搴︼紝浜斾綅綆楁硶浣滆呭仛浜嗙簿濡欑殑澶勭悊銆

綆楁硶鍏: BFS(騫垮害浼樺厛鎼滅儲)

騫垮害浼樺厛鎼滅儲綆楁硶(Breadth-First-Search)錛屾槸涓縐嶅浘褰㈡悳緔㈢畻娉曘傜畝鍗曠殑璇碆FS鏄浠庢牴鑺傜偣寮濮嬶紝媧葷潃鏍(鍥)鐨勫藉害閬嶅巻鏍(鍥)鐨勮妭鐐廣傚傛灉鎵鏈夎妭鐐瑰潎琚璁塊棶錛屽垯綆楁硶涓姝銆侭FS鍚屾牱灞炰簬鐩茬洰鎼滅儲銆備竴鑸鐢ㄩ槦鍒楁暟鎹緇撴瀯鏉ヨ緟鍔╁疄鐜癇FS綆楁硶銆

4. iOS 開發中都會使用哪些演算法

很少需要自己來寫演算法和數據結構,基本的演算法和數據結構都已經集成到庫中了。但需要你了解各種演算法和數據結構的不同,以便選擇適當的庫。比如各種排序、查找、字典、數組,是經常用到的。
假如連最基本的演算法和數據結構的知識都沒有,就算是寫一些界面邏輯代碼,也經常有性能問題。舉個例子,有一個很大的消息列表按照時間排序,而有新的 20 條消息來了,有些人完全無意識地,將 20 條消息一條條依次在一個大數組前面逐個插入,這樣就會引起數組的重復移動。這樣的代碼初看起來邏輯也正確,但就會很慢。
一個稍微嚴肅一點的 iOS 程序,經常用到三種語言,Swift 編寫看得見的界面,C++ 編寫看不見的底層,而 Objective-C 用於界面和底層之間的相互調用穿透。
但很多人理解的 iOS 開發,就僅僅只是界面、動畫之類的看得見的東西。在界面之下有很多看不見的更深層的東西。這些就需要演算法和數據結構知識。比如需要寫一個繪圖軟體,照相磨皮軟體,就涉及到圖形演算法。一個錄音聲音處理,就需要處理聲音的波形。一個電子書軟體就涉及到排版。一個類似 Flipboard 的內容聚合軟體就涉及網頁的抽取。
當然上述的很多演算法和數據結構不需要自己來寫,但假如完全沒有這方面的知識,就算有庫用了,但很可能連怎麼使用也不會。比如最基本的圖形學知識,矩陣都不知道,OpenGL 介面是不會用的。

閱讀全文

與用到哪些演算法相關的資料

熱點內容
南航app怎麼辦理機票卡 瀏覽:389
一路編程pdf 瀏覽:94
北京北京加工中心編程招聘 瀏覽:472
522為什麼是程序員的情人節 瀏覽:639
電腦輸入什麼進入編譯界面 瀏覽:689
開發編程培訓機構 瀏覽:66
建行生活app怎麼取現 瀏覽:947
程序員成功的八個跡象 瀏覽:359
烏蘭察布市DNS伺服器地址 瀏覽:947
Cnc全自動編程軟體 瀏覽:615
怎麼吸引心儀的app 瀏覽:956
打折公式計演算法 瀏覽:621
c盤下面用戶文件夾可以刪除嗎 瀏覽:872
骨色爭霸解壓碼是多少 瀏覽:127
磊科linux 瀏覽:625
文件後綴名解壓 瀏覽:98
c編程思想第2卷 瀏覽:660
html中怎麼寫php代碼 瀏覽:631
51單片機cpu分哪兩個部分 瀏覽:536
iphoneapp怎麼恢復老版本 瀏覽:754