在乙個給定的陣列中,判斷是否有i,j,k滿足a i a j a k ,有沒有比較好的演算法?

時間 2021-05-31 05:08:18

1樓:

先按照奇偶性,再由小到大,把S拆分為S1(奇數)+S2(偶數)

S1=S2=

如果a(L)>.b(L) ---- A

技巧性的從S1和S2中各抽取1個數,相加,判斷是否等於a(L)。如果都不等,則從 S1中捨棄a(L),即S發生了優化回到 A或者B.

如果 a(L)<.b(L) ----B

技巧性的從S1中抽取2個數,相加,判斷是否等於b(L)。如果都不等,技巧性的從S2中抽取2個數,相加,判斷是否等於b(L)。如果都不等,則從 S2中捨棄b(L),即S發生了優化

回到 A或者B.

如果S含小數,

按照奇偶性和整數性,由小到大,把S拆分為S1(奇數)+S2(偶數) +S3(帶小數)

【若有必要,則更進一步,S3可細分為(奇數+小數)和(偶數+小數)2個集合】

S3=如果a(L)>.b(L) 且a(L)>.c(L) ---- A

技巧性的從S1和S2中各抽取1個數,相加,判斷是否等於a(L)。如果都不等,則技巧性的從S3中抽取2個數相加。如果都不等,則從 S1中捨棄a(L)。回到 A.

.......

顯然的,這種演算法,不需要遍歷所有的可能,因為人腦已經把至少一半的情況排除了。|S|的平方根。 @Chao Xu

2樓:

作為乙個從沒接觸過演算法理論的渣渣,竟然有點看懂 Chao Xu 博士的方法了。簡而言之是不是這樣的:

想要求集合 S ={a1,a2,a3,a4,a5……}中有沒有能滿足形如a[i]+a[j]=a[k]的,那就把S的相反數也考慮進來 -S = ,看看有沒有能滿足a[i]+a[j]+(-a[k])=0的。但是呢,又擔心,萬一(-a[k])也出現在集合S裡,或者a[i],a[j]也出現在集合-S中怎麼辦?那就把集合S和集合-S拉遠,拉得非常非常遠,以至於在同乙個集合中絕對不會出現三者相加=0的情況。

也就是上面的構建集合+S和-S。

不過因為我不懂嘛,所以想問一下:這樣真的可以減輕計算機的負擔麼?

3樓:「已登出」

更新:4/4/2014. 似乎http://

arxiv.org/abs/1404.0799

好像真存在更小演算法複雜度的演算法了... 我還沒看這個文章有時間看一下...

這個問題是 3SUM-hard . 如果你能給出在real RAM上的演算法(注意是小o不是大O), 則你就解決了幾十年來的未解問題, 整個計算幾何領域的一堆演算法會因此提速.

所以如果這個是面試題的話, 到了就可以停止了.

3SUM-hard的證明:

3SUM問題: 給有n個整數的集合S, 求是否存在x,y,z屬於S, 使得x+y+z=0.

我們將3SUM問題歸約到提問者的問題中.

讓.把+S和-S存到陣列a裡面. (這裡用的是這裡面加減的定義Arithmetic combinatorics).

存在a[i]+a[j] = a[k]有且僅有x+y+z = 0. x,y,z屬於S.

如果存在a[i]+a[j]=a[k], 則只有一種可能:

a[i]-m,a[j]-m屬於S, a[k]-2m屬於-S.

讓x=a[i]-m, y=a[j]-m, -z= a[k]-2m.

則x+y= -z, x+y+z=0.

如果存在x,y,z in S, 使得x+y+z = 0, 則存在i,j,k,使得

a[i]-m = x, a[j]-m = y, a[k]-2m = -z.

a[i}+a[j]-a[k]=0

a[i}+a[j] = a[k]

所以我們用O(n)的時間將3SUM問題歸約到了提問者的問題, 則提問者的問題是3SUM-hard的.

4樓:知三叉乎

列舉k是必須的,於是改變了問題給定乙個sum,判斷是否有a[i] + a[j] = sum.

這是個經典的2sum問題,自己上網查。

5樓:

1, Lower bound 一定是 O(n^2), 因為有約 nC2 種組合。

2, O(n^2) 可以是空間複雜度,那就是用table或者hash table預存;也可以是運算複雜度,那基本就是暴力算,可以優化,但是貌似沒有顯著提公升,因為O(n^2) 擺在那了;

3,拋磚引玉,我能想到的是O(n^2) 的preprocessing time, O(n) 的空間複雜度以及 O(nlogn) 的query time

給定乙個指標,如何判斷這個指標是否已經指向乙個合法的物件?

貓之公爵公之貓 請參考qpointer的實現。一般來說都是智慧型指標加一種檢驗實現的吧。純粹的裸指標。64位系統因為指標沒用完,可以在這裡做手腳 悽臨雨 系統給了判定乙個記憶體位址 長度,能否讀寫的函式,比如windows可以Virtualquery IsValidPtr。Linux我查了,有msy...

C 如何實現乙個給定維度的多維變長陣列型別

Github上有類似的專案 head only庫 給 dynarray 做了些修補和擴充套件,現在還能用,或許可以滿足題主的要求。首先是這個,出現得比較早,就叫做 dynarray Robbepop dynarray 基本能滿足需求,只要不使用自定義分配器 allocator 的話。如果要用自定義分...

乙個長度為n的整數陣列,是否有演算法可以在O n 的時間複雜度內,求出元素兩兩之差的最小值?

有。這是2D closest pair problem的乙個特殊情況,用隨機增量演算法可以做到期望O n 複雜度。注意這不違反高票答案提到的lower bound,因為用到了hashing。 先使用線性時間複雜度演算法進行排序,然後對有序陣列掃瞄一遍即可。ps 需要陣列中的數的絕對值的上界存在,在實...