1.一般來說,算法使用時間常量,使得問題變爲原來的一部分(一般是1/2),算法複雜爲0(logN)
使得問題減少量爲一個常數,算法複雜度爲O(N)
2.二分法,爲典型的O(logN),如將一個常數8放入,依次變爲4,2,1;顯然爲logN次。
歐幾里得算法,求兩個數的最大公因數,兩數分別爲M,N,假設M比N大,否則將他們的值互換,利用下面算法,
while(N!=0){
long rem = M%N;
M = N;
N = rem;
}由定理 M%N<M/2,說明兩次循環後M比原來的二分之一還小,那麼總次數即2logN。
冪運算,例如X^63,第一次運算,X^31*X^31*X,變爲一半,起碼要經過兩次乘法,那麼總次數理解爲2logN。
3.時間複雜度可以用O(f(N))表示,將程序實際運行的時間/f(N),若這是個常數,那麼f(N)就是一個正確的,若這個比值是發散的,那麼f(N)就不正確
4.ArrayList的實現是數組,LinkedList的實現是鏈表,所以ArrayList在get(i),set(I,anyType)時效率更高,但在非最後插入、刪除數據時,效率較低;
LinkedList在get()和set()時效率較低,在頭部和尾部插入、刪除效率高,因爲不用移動大量的元素,且有個last指針指向尾元素;在已知位置索引的情況下,它的刪除效率高,但是remove(i或者object)時會先去找索引,這會花費不少時間!
5.若想將這個集合中的偶數都去除,最優算法是利用集合提供的迭代器,Iterator iterator = list.iterator();
while(iterator.hasNext()){
if(iterator.next()%2==0){
iterator.remove();
}
}這種方式下,ArrayList是O(N^2),LinkedList是O(N),因爲調用remove方法時,ArrayList還要移動數組,而LinkedList可以常數操作。