1. 程式人生 > >【編程珠璣】【第二章】書後習題解答

【編程珠璣】【第二章】書後習題解答

到來 family 轉置 是否 標識 一起 珠璣 接下來 bsp

第4題,雜技算法只交換一次,貌似比求逆快,但是時間還與cache與內存的塊交換有關,因為雜技算計訪問的數據不連續,並且每次又只訪問一個元素,頻繁的換進換出,所以實際時間長。

第6題,給每個名字編碼,將編碼一樣的放在一起,並按字典序順序排列,查找的時候二分查找就可以了。

第7題,其實就是把列作為標識,先按列排序,那麽第一列的所有元素就排在最前面,接下來是第二列,第三列……然後再各列內按行排序,轉置後,同一列的中第一行的元素在第二行的前面,接下來是第三行第四行,所以按列內按行號排序即可。

第8題,把最小的K個數找到O(nlogk),然後看這個K個數的和是否小於t,第一感覺想到的是排序,然後看前k個數的和是否不超過t,不超過的話肯定存在。

第8題。n個元素的實數集,確認是否有k個元素的子集可以讓總和至多為t。將n個元素排序,計算頭k個數和與尾k個數和,如果t介於二者之間就有。否存在這樣的k元子集,只要找到前k個最小元素即可。與TopK算法相同,TopK算法具體見《編程之美》2.5節,有多種方法:

  1. 全部數據堆排序:O(nlogn)

  2. 選擇法:O(K*N),直接選擇出前k個最小的數。

  3. 維護k個元素的數組,讀取n個輸入,每次找到k元素數組中最大的數,然後新到來的數與該數比較。這樣對k元素的數組,可以遍歷找到最大的數,也可以用堆,相應的時間復雜度為O(n*logk)和O(n*k).

【編程珠璣】【第二章】書後習題解答