本節討論陣列有序的判定問題的判定演算法。
1.問題的定義
陣列有序的判定問題
輸入:包含n個數的陣列a。
輸出:若a中元素單調遞增則輸出「是」;否則輸出「否」。
首先看一下這個問題的定義,輸出是判定的結果,這個陣列是否有序?如果需要精確地回答這個問題,就需要訪問n個數,時間是ω(n)。但是要求是設計亞線性演算法,就是不訪問所有的資料也能完成判定,所以採用近似演算法。
要定義近似,需要用到ε-遠離的概念。在這個問題中,ε-遠離意味著必須刪除大於εn個元素才能保證剩下的元素有序。這個問題的近似版本就變成:這個陣列有序還是刪除大於εn個元素才能保證有序?
2.近似求解
下面說明怎樣設計乙個亞線性演算法才能解決這個問題。提到亞線性,讀者可能直接想到採取抽樣的方法,這是可以的。但是如何抽樣,如何處理,如何證明抽樣的正確性就不那麼直觀了。演算法2-6 陣列有序的判定演算法
for k=1 to 2/ε do
選擇陣列中第i個元素xi
用xi在陣列中做二分查詢
if發現ixj then //碰到了「壞」索引
return false
return true
定理2-7和定理2-8分別描述了該演算法的時間複雜度和精度。
定理2-7 演算法2-6是亞線性演算法。
證明 演算法2-6的時間複雜度是2/ε乘以二分查詢的代價o(logn),即o2εlogn,該時間複雜度是logn多項式,因而演算法2-6是亞線性演算法。■
引理2-4 如果「壞」索引的個數小於εn,則其存在乙個長度大於εn的單調遞增子串行。
證明 往證如果在陣列中把壞索引去掉,那麼剩下的序列一定是單調遞增子串行。因為對於任意「好」索引i和j,xi定理2-8 如果輸入數列是有序的,演算法2-6返回true;如果輸入的陣列是ε-遠離有序,演算法2-6返回false的概率大於2/3。
證明 顯然,輸入數列有序,則每次二分搜尋都得到正確的結果,故演算法返回true。
根據引理2-4,如果輸入ε-遠離有序,則存在大於εn個「壞」元素,即陣列的每個元素是「壞」元素的概率大於ε。此時,2/ε次挑選的元素都是好的概率小於(1-ε)2/ε
大資料演算法點滴一
大資料演算法筆記 from 哈爾濱工業大學 大資料演算法設計與分析 王巨集志 一 大資料問題 1byte 8bit,1kb 1024bytes,1mb 1025kb,gb tb pb eb zb yb bb nb db 4v特性 volume variety velocity value,補充 對於...
《大資料演算法》一導讀
本書的緣起 大資料 在今天成為乙個非常時尚的概念,其影響已經遠遠超過了計算機學科本身,甚至影響到了自然科學 社會科學 人文科學等。由於其深遠的影響和廣泛的應用,大資料一直得到it從業人員的重視,他們對大資料相關理論 技術的學習有著強烈的需求。演算法設計與分析 是電腦科學的重要主題,進行大資料計算,演...
演算法 合併兩個有序數組成乙個有序陣列
最近看到乙個演算法題目,覺得很有意義,就自己查資料,摸索著自己實現了 特記錄一下。題目 有兩個陣列a和b,將它們合併成陣列c,需要c也是有序陣列。有兩種實現思路 1.定義乙個新陣列,長度為兩個陣列長度之和,將兩個陣列都copy到新陣列,然後排序。2.給兩個陣列分別定義乙個下標,最大長度是陣列長度減一...