算法入門

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可以常數操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章