摘自於程式設計珠璣第二章,加入了一些自己的東西。
看起來很困難的問題也可以有乙個簡單的、意想不到的答案。拿到乙個問題,不要急於完成程式的實現,靜下心來多想一想。
首先我們來看兩個問題的描述:
一、將乙個n元的一維向量順時針或逆時針旋轉i個位置,要求其時間複雜度為o(n),空間複雜度為o(1),比如n=8,i=3時,向量abcdefg順時針旋轉為defghabc。
二、給定乙個英語字典,找出其中所有的變位詞集合。比如,「ports」、「stop」和「tops」互為變位詞,因為每個單詞都可以通過改變其他單詞中字母順序來得到。
下面分別就這兩個問題給予討論,你可能會發出感嘆我咋沒有想起來呢,怎麼這麼巧呢。
問題一:我們可以將該問題轉換為陣列ab轉換為ba,同時假定我們擁有函式reverse可以將陣列中特定部分的元素求逆。首先介紹一下本科時期學過的數學矩陣公式:
可改寫為
通過上面公式,對於ab我們可以先對a求逆,然後對b求逆,得到。最後在整體求逆,從而恰好得到ba,
即:reverse(0,i-1);reverse(i,n-1);reverse(0,n-1);其時間複雜度為,空間複雜度為。
引申:如何將向量abc變為向量cba??
當然你可以這樣做:假設該向量為array,length(a),length(b),length(c),然後比較length(a)與length(c)的大小,假設length(a)>length(c).
for(inti=0;i
下面即是對陣列array【i=length(c)……length(abc)】進行逆時針迴圈移位length(a)-length(c)
移位操作轉換為array【i=length(c)……length(a)-1】array【i=length(a)……length(abc)】的置換,似乎看起來程式**看起來較為複雜,但其時間複雜度為,空間複雜度為。
現利用矩陣求逆的性質對其簡單化:
具體演算法同上述。
問題二:對字典中的每乙個單詞進行標識,使得在相同變位詞類中的單詞具有相同的標識,然後將所有相同標識的單詞集中在一起。這樣就將原始的變位詞問題簡化兩個子問題:選擇標識和集中具有相同標識的單詞。
該程式按照三個階段:第乙個程式標識單詞(將單詞中的字母按照字母表順序排列);第二個程式排序標識後的檔案,而第三個程式將這些單詞壓縮為每個變位詞類一行的形式。
具體演算法可參看程式設計珠璣(第二版),第18頁。
又一動易0day
哇哈哈,昨天看到動易出補丁了,甚是鬱悶,俺拿到這個0day都還沒開始玩,就這樣被洗白鳥,鬱悶啊,早知道不玩動易主站,而且是get提交方式,當初如果聽cn的話,也許這個0day還會一直埋在地下,剛看了下動易的補丁,這次補的地方不至這乙個,哈哈,傳說的7個以上的bug,不知道還省幾個呢?下面是大概乙個月...
演算法之一動態規劃
問題描述 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1.我們設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 11揹包問題。資料 物...
演算法(一) 動態規劃法
使用乙個二維陣列 val i j 存放當前容量下的最大價值,其中第 i 行表示可選物品中加入 第 i 個物品,j 為當前揹包的假設容量,val i j 表示假設當前的揹包的最大容量為 j 在可選的物品中加入第 i 個物品後,揹包能裝入的物品的最大價值,val i j 值的選取方法如下 初始化第 0 ...