十種值得了解的演算法簡介

2021-10-02 21:38:39 字數 2619 閱讀 3176

我們曾經介紹過二分查詢。在有序的陣列中,二分查詢是十分快速的,但當我們想新增幾個元素時,我們就必須對新的序列進行排序——這使得插入操作變得很慢。為了解決這個問題,我們設計了一種新的資料結構:二叉查詢樹(binary search tree)。

二叉查詢樹類似這樣:

對於每個節點,左子節點都要小於它,而右子節點都要大於它。我們可以像上面的圖一樣用它來儲存使用者名稱,這樣我們的查詢、插入與刪除將都是o(log n)。使用陣列與二分查詢時,這樣的操作執行時間將變成o(log n)、o(n)、o(n)。

二叉查詢樹的查詢、插入與刪除操作都比較快,但缺點是無法隨機訪問。同時,好的二叉樹應該是平衡的,而不能向一側傾斜。

如果我們想進一步研究資料庫或者高階資料結構,我們可以選擇了解b樹、紅黑樹、堆或者伸展樹

反向索引常常用來建立搜尋引擎。

最簡單的,我們將所有頁面包含的乙個個單詞作為字典的鍵,將包含這些單詞的頁面作為值,這樣在我們輸入乙個關鍵字的時候,通過字典就可以得到包含這個關鍵字的頁面。

如果我們對搜尋引擎感興趣,反向索引是乙個很好的開始點。

傅利葉變換是一種少之又少的絕妙、優雅的演算法,常用於處理訊號。例如,給定一首歌曲,傅利葉變換能夠將其中的各種頻率分離出來。

不論是***格式還是jpg(jpeg)格式,都會用到傅利葉變換來壓縮檔案,因為傅利葉變換能夠將訊號分解並指出各個部分的作用,將不重要的部分刪除即可壓縮檔案。

在****、dna分析以及**識別軟體等等領域,傅利葉變換都有廣泛的用途。

我們處在乙個處理器的速度越來越快的時代——摩爾定律還在起作用。但這個時代可能已經接近尾聲,因此,多核處理器登上舞台。為了讓演算法的速度更快,我們需要讓它能夠在多個核心中並行的執行。

雖然並行演算法速度很快(並行版本的陣列排序執行時間為o(n)),但是設計起來很難,要確保其正確工作並實現期望的速度提公升也很難。並且,速度的提公升是非線性的,也就是說,兩個核心的電腦執行演算法的速度不一定是乙個核心電腦的兩倍,原因是

並行時的開銷需要管理。最簡單的,我們將1000個元素的陣列分成兩半交給兩個核來排序,執行完後我們需要額外的步驟——將它們合併起來。

並行的負載不一定均衡。也就是說交給兩個核心的任務難度不一定相同,這種現象將導致某個核心在忙亂,另乙個卻比較空閒——空閒的核心必須等待忙碌的核心。

雖然如此,但是想要改善效能和可擴充套件性時,選擇並行演算法是不錯的選擇。

分布式演算法可以讓你的演算法在多台計算機上執行——你可以通過開源工具apache hadoop來使用它。分布式演算法非常適用於在短時間內完成海量工作,而其基於的原理包括對映(map)函式和歸併函式(reduce)。

在計算機上對大量資料進行查詢時,如果資料集很大,使用傳統的資料庫可能需要花上幾個小時,但使用mapreduce可以將工作時間縮短到幾分鐘。

按照我們以前了解的知識,我們可以使用雜湊表,使用雜湊表的查詢速度永遠是o(1)。但是,我們要為所有發布過的故事建立雜湊表,這個龐大的雜湊表將占用巨大的記憶體空間!

這時,我們可以選擇布隆過濾器——一種概率型資料結構。但是,布隆過濾器存在缺點:

當然,布隆過濾器給出正確答案的機率的高得多。

hyperloglog是一種類似於布隆過濾器的演算法——它能近似的計算出集合中不同的元素。它們的共同特點是占用的儲存空間非常小

sha的輸入是乙個字串,輸出是另乙個字串——這與我們用於建立雜湊表的雜湊函式不同,並非是生成陣列索引。我們將sha生成的字串稱為雜湊值,這個字串通常很長。

sha函式可以用來比較超大型檔案是否相同,只需要計算這兩個檔案的雜湊值並進行對比即可。sha還有乙個更大的用處——檢查密碼。當你登陸乙個**並輸入密碼時,**記錄的是這個密碼的雜湊值而不是密碼本身。這樣,即使有人入侵**,你的密碼也不會暴露,因為sha演算法是單向的,你無法用雜湊值還原出原始字串。

sha包括一系列演算法:sha-0、sha-1、sha-2、sha-3。但是,sha-0和sha-1已經被發現有一些漏洞,目前最安全的密碼雜湊函式是bcrypt。

對於sha,即使原始的字串有乙個小小的改動,雜湊值也將完全不同——有時候我們不希望如此。simhash就是這樣,如果我們對字串做一點小改動,雜湊值也只會存在一點細微的變化,這樣的雜湊函式是區域性敏感的。

simhash在檢查兩項內容的相似程度時很有用,比如**的查重工作。

如何對訊息進行加密,使得只有收件人才能看懂呢?我們可以設計一種加密演算法,比如a=1,b=2,……。這種簡單的加密演算法很容易被蠻力破解。二戰時期德國人使用了複雜的加密演算法,仍然被破解了。

diffie-hellman演算法為我們解決了這個問題。這是一種使用雙方無需協商並且十分難以破解的加密演算法。它提供乙個公鑰和乙個私鑰,我們可以將公鑰以任何方式發布出去——想給我們傳送加密訊息的人只需要使用公鑰進行加密即可。加密後的訊息只有私鑰才能解密——當然,私鑰只有我們自己知道。

如果我們對加密感興趣,我們可以從著手研究diffie-hellman開始。

我們曾經在不少文章中討論最優化。線性規劃就是用於在給定的約束條件下最大限度改善指定指標的。實際上,線性規劃是乙個寬泛的框架,包括所有圖演算法在內都是它的乙個子集。

線性規劃使用複雜的******x演算法,如果我們對最優化感興趣,我們可以從線性規劃開始研究。

值得你跟隨的十種老闆

一 能夠在員工需要的時候給員工提供指導,幫助員工發展的老闆 老闆雖然與下屬是上下級關係,但是沒有下屬的支援和協作,再出色的老闆都無法獨自讓公司正常運作。對企業來說,員工是重要的組成部分,但員工不能完全等同於 零件 過於關心業績增長,而忽略員工的感受以及職業發展的老闆,在團隊中的威信就會降低,隨之而來...

十種排序演算法

1.常見演算法分類 十種常見排序演算法一般分為以下幾種 1 非線性時間比較類排序 交換類排序 快速排序和氣泡排序 插入類排序 簡單插入排序和希爾排序 選擇類排序 簡單選擇排序和堆排序 歸併排序 二路歸併排序和多路歸併排序 2 線性時間非比較類排序 計數排序 基數排序和桶排序。總結 1 在比較類排序中...

LVS 十種演算法

lvs虛擬伺服器是章文嵩在國防科技大學就讀博士期間建立的,lvs可以實現高可用的 可伸縮的網路服務。lvs集群組成 前端 負載均衡層 一台或多台負責排程器構成 中間 伺服器群組層 由一組實際執行應用服務的伺服器組成 底層 資料共享儲存層 提供共享儲存空間的儲存區域 director server 排...