演算法學習積累

2021-10-10 16:04:31 字數 2882 閱讀 4434

1、map.containskey方法:判斷map集合物件中是否包含指定的鍵名

containskey(object key)map是乙個key和value的鍵值對的集合。有key和value鍵值對,就會有判斷是否有key

2、deque容器為乙個給定型別的元素進行線性處理,像向量一樣,它能夠快速地隨機訪問任乙個元素,並且能夠高效地插入和刪除容器的尾部元素。但它又與vector不同,deque支援高效插入和刪除容器的頭部元素,因此也叫做雙端佇列。

3、linkedlist類是雙向列表,列表中的每個節點都包含了對前乙個和後乙個元素的引用.

linkedlist的建構函式如下

public linkedlist(): ——生成空的鍊錶

public linkedlist(collection col): 複製建構函式

4、

stack1.peek() 返回棧頂元素,但不在堆疊中刪除它。

stack2.pop() 返回棧頂元素,並在程序中刪除它。

5、在描述演算法複雜度時,經常用到o(1), o(n), o(logn), o(nlogn)來表示對應演算法的時間複雜度, 這裡進行歸納一下它們代表的含義:

這是演算法的時空複雜度的表示。不僅僅用於表示時間複雜度,也用於表示空間複雜度。

o後面的括號中有乙個函式,指明某個演算法的耗時/耗空間與資料增長量之間的關係。其中的n代表輸入資料的量。 比如時間複雜度為o(n),就代表資料量增大幾倍,耗時也增大幾倍。比如常見的遍歷演算法。 再比如時間複雜度o(n^2) 就代表資料量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間複雜度。比如氣泡排序,就是典型的o(n^2)的演算法,對n個數排序,需要掃瞄n×n次。

再比如o(logn),當資料增大n倍時,耗時增大logn倍(這裡的log是以2為底的,比如,當資料增大256倍時,耗時只增大8倍,是比線性還要低的時間複雜度)。二分查詢就是o(logn)的演算法,每找一次排除一半的可能,256個資料中查詢只要找8次就可以找到目標。

o(nlogn)同理,就是n乘以logn,當資料增大256倍時,耗時增大256*8=2048倍。這個複雜度高於線性低於平方。歸併排序就是o(nlogn)的時間複雜度。

o(1)就是最低的時空複雜度了,也就是耗時/耗空間與輸入資料大小無關,無論輸入資料增大多少倍,耗時/耗空間都不變。 雜湊演算法就是典型的o(1)時間複雜度,無論資料規模多大,都可以在一次計算後找到目標(不考慮衝突的話)

6、白名單過濾

如果可能,我們的測試用例都會通過模擬實際情況來展示當前演算法的必要性

7、mid=(left+right)>>1的含義

右移運算子》,運算結果正好能對應乙個整數的二分之一值,這就正好能代替數學上的除2運算,但是比除2運算要快。

mid=(left+right)>>1相當於mid=(left+right)/2

8、二分查詢法

①陣列必須是有序的

②被查詢的鍵要麼不存在,要麼必然存在於a[lo…hi]之中

9、arraycopy()的使用

public static native void arraycopy(object src, int srcpos, object dest, int destpos,int length);

src:要複製的陣列(源陣列)

srcpos:複製源陣列的起始位置

dest:目標陣列

destpos:目標陣列的下標位置

length:要複製的長度

nums1 =[1

,2,3

,0,0

,0], m =

3nums2 =[2

,5,6

], n =

3system.

arraycopy

(nums2,

0, nums1, m, n)

;輸出的結果:[1,

2,3,

2,5,

6]

含義:函式在執行時呼叫自己,這個函式就叫遞迴函式,呼叫的過程叫遞迴

比如斐波那契數列:f(0)=0,f(1)=1, f(n)=f(n - 1)+f(n - 2)(n ≥ 2,n ∈ n*)

如果代入f(2)→返回f(1)+f(0)…[如果沒有後面(n ≥ 2,n ∈ n*)的限制條件的話,就會一直的無限迴圈下去]

所以從中可以得到兩個規律:

1、遞迴函式必須要有終止條件,否則會出錯;

2、遞迴函式先不斷呼叫自身,直到遇到終止條件後進行回溯,最終返回答案

列題:

將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

終止條件:當兩個鍊錶都為空時,表示對鍊錶已經合併完成了

遞迴的形式:判斷l1和l2頭結點哪個更小,然後較小結點的next指標指向其餘結點的next指標指向其餘結點的合併遞迴。(呼叫遞迴)

public listnode mergetwolists

(listnode l1, listnode l2)

else

if(l2 ==null)

else

if(l1.valelse

}

動態規劃和遞迴恰恰是相反的,前者是自底向上求解,後者是自上向下求解。

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...

演算法學習 KM演算法

km演算法 用於求二分圖的最佳完美匹配 即權值最大的完美匹配 如果你也是個剛來學習km演算法的人 大概的用途肯定還是知道的吧 還是直接說重點吧 首先 理解km演算法前 必須有以下3個概念 1.可行頂標 對於乙個賦值二分圖g x,y,e,w x,y 代表二分圖的兩邊頂點標號 e代表邊 w代表邊的權值 ...

演算法 演算法學習01

貪婪 可以理解為最簡單基礎的求解方式,特點是 短視性 從這個特點入手很容易理解每一步取其最優的原理。雖然最終結果不一定是最好的,但是一定是較好的而且是最簡便的。因此在不過分追求最優結果或者對速度的要求高於結果的情況下,貪婪是不錯的選擇。分治可以理解為大事化小小事好搞,與貪婪的每一步的 串聯 不同,分...