低於O(n)
解決方案,也可以容納每個分段的可選重量。
我們通過它與X軸的角度(a)用權重(w)對每個段進行建模。分段方向在這一點上並不重要,任何180°的模值都可以。這個想法是爲每個分段循環並跟蹤到目前爲止計算的平均方向;並用平均值更接近平均值180的方向調整此平均值。
的僞代碼(以度爲單位的所有角度):
aa = 0
ww = 0
for a, w in segments:
// Compute delta between angles in range [-180°..+180°[
da = a - aa
if da < -180:
da += 360
if da >= 180:
da -= 360
// Optional direction swap, delta in [-90°..+90°[
if da < -90:
da += 180
if da >= 90:
da -= 180
// The following formula also make sure aa = a mod 180
// when ww = 0 (first iteration).
aa += da * w/(w + ww)
ww += w
// Clamp result to [0°..+360°[
if aa >= 360:
aa -= 360
if aa < 0:
aa += 360
// Clamp final result aa to [0..+180°[ (optional step)
if aa > 180:
aa -= 180
沒表明,結果獨立於迭代順序,但在算法的乍一看是應該的。
在此算法VS輸入的依賴性迭代順序
對於性能良好的輸入數據,算法無論迭代順序的非常穩定。然而,只要輸入數據沒有明確的主方向,該算法的這個結果在很難預測混沌模式下將強烈依賴於迭代順序。數值模擬表明,對於標準偏差爲小於20°的中心的隨機方向(中值附近),算法似乎總是穩定的。標準偏差大於20°時,數值不穩定性開始出現,並且結果強烈依賴於迭代次序(20°至30°之間的差異可能足夠小以至於忽略30°以上的大差異開始出現)。
我並沒有準確計算出確切的混沌/穩定標準偏差截止值,因此以此20°值作爲初始猜測值。一個確切的數學解決方案留給讀者作爲練習。在數值模擬的結果下(對於0到45°的每個標準偏差,對給定標準偏差的各種隨機數據運行1000次算法,並測量10次運行之間的平均增量)。
因此,最好的結果,如果輸入的數據是不能保證有一個小的標準差,它可能是最好的,訂單中的穩定鍵輸入數據(重量更大第一,或任何其他關鍵取決於你的輸入)。
據我所知,這將平均*矢量*。我有*無向段*,所以段和他的對面(兩端交換)應該被認爲是相同的。 –
@LaurentGrégoire,請參閱我已添加到最後的解釋 – maxim1000
非常好,實際上訣竅是將軸承的平均值乘以2,然後將此平均值減半。 Btw爲我的需要,我使用了正弦和餘弦的簡單加權平均值。 –