第一章
1.二分法查找
引入的例子就是大學時候經常玩的助興遊戲,猜數字1到100,其中一個人先确定一個數字,然後其他人來猜,根據先前确定的數字告訴小夥伴是大于了,還是小于了,然後慢慢往結果靠近
其輸入是一個有序的元素清單(必須有序的原因稍後解釋)。如果要查找的元素包含在清單中,二分查找傳回其位置;否則傳回null。
一般而言,對于包含n個元素的清單,用二分查找最多需要log2n步,而簡單查找最多需要n步。
(講的非常詳細,易于了解)
2.運作時間
最多需要猜測的次數與清單長度相同,這被稱為線性時間(linear time)。
關鍵的一句話,運作時間的增速不同
使用大O表示法,這個運作時間為O(n)。機關秒呢?沒有——大O表示法指的并非以秒為機關的速度。大O表示法
讓你能夠比較操作數,它指出了算法運作時間的增速。
3.常用大O時間
O(logn),也叫對數時間,這樣的算法包括二分查找。
O(n),也叫線性時間,這樣的算法包括簡單查找。
O(n*log n),這樣的算法包括第4章将介紹的快速排序——一種速度較快的排序算法。
O(n2),這樣的算法包括第2章将介紹的選擇排序——一種速度較慢的排序算法。
O(n!),這樣的算法包括接下來将介紹的旅行商問題的解決方案——一種非常慢的算法。
使用大O表示法給出下述各種情形的運作時間。
1.3 在電話簿中根據名字查找電話号碼。
1.4 在電話簿中根據電話号碼找人。(提示:你必須查找整個電話簿。)
1.5 閱讀電話簿中每個人的電話号碼。
1.6 閱讀電話簿中姓名以A打頭的人的電話号碼。這個問題比較棘手,它涉及第4章的概
念。答案可能讓你感到驚訝!
練習1.
使用大O表示法給出下述各種情形的運作時間。
1.3 在電話簿中根據名字查找電話号碼。
1.4 在電話簿中根據電話号碼找人。(提示:你必須查找整個電話簿。)
1.5 閱讀電話簿中每個人的電話号碼。
1.6 閱讀電話簿中姓名以A打頭的人的電話号碼。這個問題比較棘手,它涉及第4章的概
念。答案可能讓你感到驚訝!
解答:http://blog.csdn.net/weixin_38313518/article/details/78325412
旅行商問題:
一個旅行商要到不同的城市去,且要保證旅程最短,如果有5個城市,就有120種走法,6個城市就有720種算法
涉及n個城市時,需要執行n!(n的階乘)次操作才能計算出結果。是以運作時間為O(n!),即階乘時間。除非涉及的城市數很少,否則需要執行非常多的操作。如果涉及的城市數超過100,根本就不能在合理的時間内計算出結果——等你計算出結果,太陽都沒了。
小結
二分查找的速度比簡單查找快得多。
O(logn)比O(n)快。需要搜尋的元素越多,前者比後者就快得越多。
算法運作時間并不以秒為機關。
算法運作時間是從其增速的角度度量的。
算法運作時間用大O表示法表示