如何理解佇列優化的Bellman Ford SPFA 演算法的檢測負環的條件?

時間 2021-06-04 09:51:17

1樓:Drew

個人看法:在SPFA找負環的過程中,記錄乙個點進入佇列的次數。如果超過了n次,那麼這個圖就一定有環(核心條件)。

這個演算法本身複雜度還是比較優秀的。如果面對更大的資料時可以考慮用堆優化的SPFA。

2樓:Raffica

這個理由並不顯然,dfd的證明是錯的。這裡引入乙個推進的概念:

n 圖節點數 m 邊數

設每次滿足d[e.v] < d[e.u] + e.w為一次對邊e的鬆弛,

設最後一次在佇列中訪問某個點i的時間戳為t[i],

求最短路過程可以看成在佇列中的節點在最短路樹上的『推進』過程,這裡給出以不同形式描述的推進的定義:

1、乙個節點被推進,當且僅當這個節點對應的路徑已經在最短路樹上,(也就是說後面可能被鬆弛的那種不算在內,每次推進不可能使得已經被推進過的節點再被更新)

2、假設我們已知這棵最短路樹,那麼我們SPFA的過程就是在原圖上BFS,當且僅當某個節點以及它的所有祖先全部在這棵最短路樹上時,它被推進,設乙個節點i被推進後的所有節點中最晚的那個時間戳為t[j],則很容易發現t[j] - t[i] < m(雖然這個結論P用沒有);

3、最後一次訪問某個節點並鬆弛對應的邊的過程稱為推進

Lemma.1 最短路樹的高度不可能大於n:顯然。

Lemma.2 假設每個節點i被訪問過f[i]次,f[i]不可能大於節點i在最短路樹的高度h[i]:通俗的理解就是推進h[i]次後這個節點就不可能被訪問了;嚴謹地,對此處語境中的推進進行定義:

一次推進指在最短路樹上某個深度上的點全部通過SPFA的過程確定了距離的過程。

根據2個Lemma,乙個節點i在被訪問超過h[i](這時候還有最短路樹嗎?)次後肯定能確認是否有負環。h[i] < n,QED

如何理解最優化搜尋中的Wolfe準則?

Wolfe conditions i ii with 講講Wolfe準則是怎麼設計出來的,就很容易理解了。Wolfe 準則主要用於線搜尋line search,由兩個條件組成,i Armijo condition和ii curvature condition。Armijo condition是充分下...

電腦太卡,如何最好優化,最好的電腦優化和清理軟體是什麼?

最好的清理軟體 自帶的磁碟清理 不放心選CCleaner最好的優化軟體 感覺是DISM 再說全體。解除安裝掉所有安全軟體,使用Windows Defender。少用國內流氓 一切管家 多用一些好軟體 去知乎的軟體話題去找 要是還卡,至少換塊固態盤。 小奧 更新一下 那個優化程序優先順序的軟體在如今沒...

如何優化 Python 爬蟲的速度?

我之前弄過分布式爬蟲,爬取速度和你的機器數量成正比。整體架構如下 scrapy 從訊息佇列rabbitmq裡獲取起始url,然後處理後的訊息儲存到mongodb裡。然後通過docker批量部署映象到不同的機器。scrapy有致命缺點,就是源站響應很慢的化,大部分cpu會閒置,這樣你即使把併發設定的很...