看過的演算法題 未親自實現

2021-07-25 08:26:22 字數 2022 閱讀 7991

1: 題目:

求乙個二叉樹中任意兩個節點間的最大距離,兩個節點的距離的定義是這兩個節點間邊的個數,比如某個孩子節點和父節點間的距離是1,和相鄰兄弟節點間的距離是2,

優化時間空間雜度

思路一:

計算乙個二叉樹的最大距離有兩個情況:

情況a: 路徑經過左子樹的最深節點,通過根節點,再到右子樹的最深節點。

情況b: 路徑不穿過根節點,而是左子樹或右子樹的最大距離路徑,取其大者。

首先算出經過根節點的最大路徑的距離,其實就是左右子樹的深度和;然後分別算出左子樹和右子樹的最大距離,三者比較,最大值就是當前二叉樹的最大距離了。

/*----------------------------- 

------------------------------*/

#include "stdafx.h"

#include

#include

using

namespace

std;

typedef

struct tagsbtreenode

}s_treenode;

void addtreenode(s_treenode *&pstreenode, int nvalue)

else

if (pstreenode->nvalue < nvalue)

else

addtreenode(pstreenode->psleft, nvalue);

} int maxdepth(const s_treenode *pstreenode)

return ndepth;

} int maxdistance(const s_treenode *psrootnode)

return ndistance;

} int _tmain(int argc, _tchar* argv)

問題描述:給出乙個陣列,包含n個整數,那麼需要比較多少次找到最大值和最小值

注意:要想得到最大值和最小值,遍歷一遍陣列是不可避免的。我們能減少的就是減少比較次數來提高效率

方法一、遍歷一遍陣列,同時得到最大值和最小值

具體是,定義乙個max 和 min,每遍歷乙個數,就分別和max 和 min比較一次,直到處理完所有的資料

比較次數: n+n = 2n

方法二、我們可以把陣列中的資料兩兩分組,分組內找出最大值 和 最小值,之後在最大值的那部分找出最大值,在最小值那部分找出最小值

比較次數:

兩兩比較,較小值放到左邊,較大放右邊,這時比較n/2次

之後,得到的最大值部分是 n/2個數,最小值部分是n/2個數

之後在 最大值部分 取出最大值。比較次數n/2

在 最小值部分 取出最小值。比較次數n/2

比較次數:1.5n

評價:雖然比較次數下降了,但是破壞了原陣列,而且由於在比較過程中有資料的交換,效率還是會拖累的。

方法三、引入倆變數min 和 max,每次也是處理兩個資料,直到所有的資料全部都處理完

具體思路:

引入兩個變數min 和 max

取出兩個數,比較一次,得出最大值和最小值

最大值和max比較,最小值和min比較,如果比最值還要大或小,則進行更新

比較次數:每處理兩個數,比較3次,則n/2 *3 = 1.5n次

優點,不會破壞原陣列,較好

方法四、使用分治演算法,其實和方法三是一樣的,分治是一直到兩個數的時候才做,且做完了 把結果合併下就好

思路:在n個數中求最大值和最小值,我們只需求出前後n/2個數的min和max,然後取較小的min,較大的max即可

比較次數:和方法三一樣,比較次數沒有變化

分析:f(2) = 1;

f(n) = 2*f(n/2) + 2;

第2個2的意思是:遞迴分成的兩部分求出最值後,還有結合下求出乙個整體的最值,這時要有兩次比較

可以推出f(n) = 1.5*n -2; 可見總的比較次數仍然沒有減少。

LRU最久未使用淘汰演算法實現

lru 缺頁置換演算法中的一種,當容量滿的時候,新增新的一頁,就會置換淘汰掉最久未使用的一頁。實現 可以採用鍊錶實現 主要是因為該演算法體現在頭部和尾部的操作居多。因此採用雙向鍊錶為佳。介於c stl容器的list實現為乙個方式。由於牽扯到判斷是否存在的問題,因此需要遍歷查詢。該演算法實現時間複雜度...

C 實現LRU(最久未使用)快取演算法

lru快取演算法也叫lru頁面置換演算法,是一種經典常用的頁面置換演算法,本文將用c 實現乙個lru演算法。lru演算法實現並不難,但是要高效地實現卻是有難度的,要想高效實現其中的插入 刪除 查詢,第一想法就是紅黑樹,但是紅黑樹也是一種折中的辦法。插入 刪除效率最高當屬鍊錶,查詢效率當屬hash。所...

C 實現LRU(最久未使用)快取演算法

lru快取演算法也叫lru頁面置換演算法,是一種經典常用的頁面置換演算法,本文將用c 實現乙個lru演算法。lru演算法實現並不難,但是要高效地實現卻是有難度的,要想高效實現其中的插入 刪除 查詢,第一想法就是紅黑樹,但是紅黑樹也是一種折中的辦法。插入 刪除效率最高當屬鍊錶,查詢效率當屬hash。所...