求複雜度的時候非常好玩的乙個函式

2021-09-19 14:43:08 字數 1113 閱讀 8699

強調下用matlab,因為以前習慣用,想用python做的可以試試哈!

求解分析t(n)=2(t(n/2))+n^2logn的時間複雜度的時候碰到的,用主方法分析,符合第3種情況,但是我們想求出那個c的取值,最少也得有個範圍,是吧?

用**直接求解,當然,如果你導數公式都記得,那就隨意了,直接求導看看結果了:

syms x y

y=(log(x)-1)/(2*log(x));

result=diff(y)

solve(result)

輸出結果:

result =

1/(2*x*log(x)) - (log(x) - 1)/(2*x*log(x)^2)

ans =

empty sym: 0-by-1

發現沒結果,也就是求導沒等於0的玩意兒,分析不好分析,那就直接畫圖哇!fplot(y,[0,5]),先試試好不?

別猴急,看到沒?函式原來是這個鳥樣,還求什麼極值,最值啊,拉倒吧。

在琢磨下我們限定下範圍,n>1之後的,不就可以了?

繼續琢磨,加大到50000,繼續繪製圖形

從圖中可以看出接近1/2,為哈呢?你取n無窮大,你看看結果是不是1/2=2/4,所以c取3/4應該不成問題,只要c<1就滿足條件麼。

當然你可以琢磨下,利用**求,比如:

x0=5

fun=@(x)[(log(x)-1)/(2*log(x))];

[xm,fvalml,maxfval]=fminimax(fun,x0)

這個太粗糙,迭代達不到我們要的精度,需要設計類似於目標優化之類的策略,反正目的達到,不管了,以後有時間琢磨下了。

複雜度更低的求乙個數的所有約數

最簡單的想法是對所有小於這個數的數逐個遍歷取餘是否為0。但是這種方法的複雜度是o n 的,如下 n int input list1 for i in range 1 n 1 if n i 0 print list1 做題的時候往往這樣複雜度過高,我們將遍歷變成 1,n 0.5 求前一半的約數,求出來...

乙個講的非常好的快速排序

講的非常好,反正我是看懂了 package com.shadow.util 快速排序的乙個實現 author shadow public class myquicksort 一次查詢後,將基準數歸位 arr left arr i arr i pivot 繼續處理左邊的,這裡是乙個遞迴的過程 quic...

O 1 複雜度求乙個棧的最小值

要求乙個棧的最小值,第一反應肯定是乙個個出棧,那樣太蠢了,如何更優呢?第乙個思路就是自己定義乙個指標,始終指向儲存了最小值的那個節點不就行了。看似正確,但是當你最小值的那個節點出棧了,那麼如何找到下乙個最小值呢?因此,我們需要乙個資料結構來儲存每乙個狀態下的最小值。即我們應當知道每當棧中插入乙個新元...