一、二分查詢:
假如我們來玩乙個猜數的遊戲,隨便想乙個1~100的數字,最多需要幾次能猜對呢?
傻找:什麼是傻找呢,就是從1開始往上猜,如果想的數是99,豈不是要猜99次,你不傻誰傻?
最佳的方案:如果我說50,你說猜小了,哇咔咔我們一下子就排除了50個數,再接下來知道怎麼猜了把,當然是75啦,即每次猜的數都是餘下數的一半,如此下去,不管你想的數是多少,我都能在7次之內猜出來,這就是大名鼎鼎的二分查詢法。
注意:二分查詢法只適用於有序的列表。
一般而言,對於包含n個元素的列表,用二分查詢法最多需要log2的n步,而簡單查最多需要n步。
對數:演算法的世界裡,怎麼可能少得了數字,那什麼叫對數呢?
如果a的x次方等於n(a>0,且a不等於1),那麼數x就叫做以a為底n的對數,記作x=loga(n),其中a為底數,n為真數。例子:2的3次方等於8,那麼3就是以2為底8的對數。
線性時間,簡單查詢(逐個檢查)列表中的元素,換言之,最多需要猜測的次數(之前的猜數)與列表長度相同,這被稱為線性時間。
對數時間,以二分查詢執行的時間稱為對數時間(log時間,log指log2,2為底數)。
三、大o表示法
大o表示法為一種特殊的表示法,指出了演算法的速度有多塊。
舉例:如果說檢查乙個元素需要1毫秒。使用簡單查詢時,需要100毫秒(猜數遊戲為例),那麼二分查詢大約需要(log2的100)7毫秒;由此可以得出簡單查詢所需的時間大約是二分查詢的15倍;如果乙個序列中包含10億個元素,二分查詢需要約30毫秒,那麼簡單查詢所需要的時間為30*15=450毫秒,結果真的是這樣嗎?
其實不是,而且是大錯特錯!!!
簡單查詢與二分查詢執行時間的增速不同,什麼意思呢?
也就是說,隨著元素數量的增多,二分查詢需要的額外時間並不多,而簡單查詢需要的額外時間卻很多。因此,隨著列表的增長,二分查詢的速度比簡單查詢快得多。
有簽於此,僅知道演算法需要多長時間才能鄖西那個完畢還不夠,還需要知道鄖西那個時間如何隨著列表增長而增大,這正是大o表示法的意義所在。
大o表示法指出了演算法有多塊。例如,建設列表包含n個元素,簡單查詢需要檢查每個元素,需要執行n次,使用大o表示法,這個時間為o(n),單位秒?沒有--大o表示法指的並非以秒為單位的速度,而是讓你比較運算元,它指出了演算法執行時間的增速。
二分查詢法大o表示法為o(logn,注意此處log為簡寫,實際為log2的n次方)。
注意:大o表示法指出的永遠都是最糟糕情況下的執行時間。
o(log n),對數時間,這樣的演算法包括二分查詢;
o(n),線性時間,這樣的演算法博愛闊簡單查詢;
o(n * log n),快速排序,一種速度較快的排序演算法;
o(n的2次方),選擇排序,一種速度較慢的排序演算法;
o(n!),旅行商解決方案,一種非常慢的演算法。
總結:演算法的速度指的並非時間,而是運算元的增速;
二分查詢的速度比簡單查詢快得多;
o(log n)比o(n)快。需要搜尋的元素越多,前者比後者就快得越多;
演算法執行時間是從其增速的角度度量的;
演算法執行時間使用大o表示法表示。
演算法基礎( 演算法)
演算法基礎 演算法 hash演算法有兩種,即sha 1和md5演算法這裡先介紹md5演算法.md5產生乙個128位的hash值,在經過一寫初始樹立後,將明文分成了512位的塊,再將每一塊分成16個32位的子塊。演算法的輸出是4個32位的塊,連線起來構成128位的hash值。首先,將訊息填充到比512...
其餘的基礎演算法
for int i 0,j 0 i n i 常見問題分類 1 對於乙個序列,用兩個指標維護一段區間 2 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作 核心思想 for int i 0 i for int j 0 j o n 2 所有的雙指標都是o n 作用 優化 include ...
演算法基礎(一) 基礎
學習了那麼久,一直沒有好好寫寫演算法。下面我簡單描述一下演算法方面知識。在已證明演算法正確性的前提下,評價演算法的好壞主要是關注演算法在時間和 空間上效能的優劣。演算法時間效能 的分析是通過計算 演算法時間複雜度 實現的,其關鍵就是計算演算法的執行時間。乙個演算法的執行時間,就是演算法中每條語句的執...