缺乏數值分析

2021-09-06 23:52:19 字數 1241 閱讀 5144

稱號:以整數陣列給出乙個無序。如何找到第乙個大於

0,而且不在此陣列的整數。

比方[1,2,0]

返回3, [3,4,-1,1]返回2

。最好能

o(1)

空間和o(n)

時間。

該題在首先,給定的整數陣列可能包括負數。並且正數的範圍也能夠超過n。所以最普遍的情況應該例如以下:36

-1-2

4 演算法的基本思想是僅僅考慮範圍在

0的正整數,並將其歸位到其應該在的位置,這和

陣列統計分析非常類似。當在這個範圍內的全部正整數都歸位以後。我們再次從位置1開始遍歷陣列,第乙個a[i]!=i即為所求的結果。

道理也非常easy,當我們將全部在

0的正整數歸位以後,出現過的正整數都會在其正確位置,沒有出現的元素會被其它

a[i]<=0

或者a[i]>n

的元素所占領,因而通過條件a[i]!=i推斷所得的值即為所求。

此外。陣列中還可能會出現在

0範圍內的反覆元素,這會對演算法產生影響嗎?不會。

即使出現反覆元素。該元素也不可能被選為答案。

首先,反覆元素裡面肯定會有乙個會在正確的位置,而其它的反覆元素僅僅可能出如今缺失元素的位置。在遍歷的過程中,當我們遇到乙個反覆元素時,假設其不在正確位置,我們選擇該元素所在的位置。該位置肯定和反覆元素不一樣。假設其在正確位置,則我們直接跳過該元素推斷下乙個位置就可以,由於其已經正確歸位。所以無論哪種可能,我們都不會將反覆元素選出作為結果。

至於範圍

a[i]<=0

或者a[i]>n

的元素,無論其是否反覆,我們都不正確其進行交換操作,它們也僅僅會占領未出現元素的位置。只是它們有可能被宰範圍

0內的正整數交換一次,然後停止交換。

依據上面的分析,我們能夠知道該演算法和

陣列統計分析很類似,演算法的偽**例如以下:

for i=1:n

while canswap(i) do swap(i);

上述偽**的含義是,從第乙個位置開始推斷是否須要交換。假設能交換就一直交換直到該位置滿足下面三種情況時停止,然後推斷下乙個位置:1) a[i]<=0;2) a[i]>n;3) a[a[i]]==a[i]。

實際的**例如以下:

int lostnum(int *a,int n)

}for(int i=1;i對於該演算法分析的複雜性,參考前面的分析,儘管雙週期,但事實是o(n)演算法的複雜性,它被證明是使用攤餘分析。

數值分析 誤差分析

方法誤差與捨入誤差 方法誤差 在用數學模型去 某個值的時候,由於選取的數學模型產生的誤差 例如使用泰勒展開式求取近似f x 時,其對應的拉格朗日餘項即為方法誤差 捨入誤差 計算機進行數值計算時產生的誤差,然後計算時產生的新誤差 比如用計算機用3.14去近似pi 誤差限對於某個演算法或者說數學模型,我...

LOL數值分析

英雄聯盟中攻速計算為直接加成。比如 幻影之舞裝備介紹中為增加50 攻速,就是在原始攻速上直接增加0.5的攻擊速度。原始為0.65攻速,裝備幻影之舞後就為0.65 0.5 1.15攻擊速度。英雄聯盟中攻擊速度是以秒為單位,攻擊速度1代表每秒攻擊1次。英雄攻擊速度上限值為2.5。假設英雄初始攻速0.65...

LOL數值分析

英雄聯盟中攻速計算為直接加成。比如 幻影之舞裝備介紹中為增加50 攻速,就是在原始攻速上直接增加0.5的攻擊速度。原始為0.65攻速,裝備幻影之舞後就為0.65 0.5 1.15攻擊速度。英雄聯盟中攻擊速度是以秒為單位,攻擊速度1代表每秒攻擊1次。英雄攻擊速度上限值為2.5。假設英雄初始攻速0.65...