談談我對旋轉卡殼演算法本質的理解

2021-07-04 17:30:24 字數 1086 閱讀 6034

我學很多東西的過程中,經常無法理解現有的資料的表述,感覺那些講的太膚淺,最後靠自己推倒證明才能理解,旋轉卡殼也是其中的乙個……

關於旋轉卡殼的資料,大概有這幾個:

如果亂碼,注意換一下網頁編碼)

一些基本概念,如對踵點就不說了,也懶得發了,自己畫一畫就知道了。。

用旋轉卡殼最常見的例子:求點對最長距離來說吧,因為最長點對一定是一對對踵點,所以我們可以列舉所有對踵點。

找對踵點的乙個超簡便方法是找對踵的點和邊,為什麼可以這樣做呢?資料的表述不夠清晰:

資料上說「計算這個頂點到該邊兩個端點的距離,並記錄最大的值」,

實際上最後實現中只計算了邊的起點到這個邊的對踵點的距離,這是為什麼呢?

ans=max(ans,max(dist(p[p],p[q]),dist(p[p+1],p[q+1])));

我思考了一下,發現邊的本質就是狀態轉移,

當旋轉過程中沒有碰到邊的時候,「當前對踵點」這個狀態始終沒有轉移,

碰到乙個邊時,可以按照微分的思想,認為平行線又旋轉了無窮小(這是在邊不平行的前提下的,邊平行時有dist2(ch[p+1],ch[q+1]))

設邊(u,v)的對踵點是f(u,v),基於這種思想便可以認為邊就是一次由(u,f(u,v))到(v,f(u,v))的狀態轉移,

也就是說,邊是狀態轉移,狀態轉移也一定是邊,這兩者是等價的,

這樣就解決了剛開始提出的問題「為什麼只需要計算邊的起點到這個邊的對踵點的距離」,因為這相當於只計算了轉移前的狀態,

本次轉移後的狀態一定是某次轉移前的狀態,而且「某次轉移」一定是接下來旋轉最先碰到的對面的或相鄰的邊**移),

那麼我們只需要列舉所有「狀態轉移」,同時發現f(u,v)是乙個單峰函式,

根據單峰函式的性質就可以o(n)時間通過"狀態轉移"得到所有"狀態"了。。

綜上所述,這種簡便方法的本質是:列舉所有狀態轉移得到所有狀態;

而另一種複雜方法的本質是:給定乙個初始狀態,進行模擬從而得到所有狀態。

談談我對bloom filter的理解。

我們都看過封神榜吧,每乙個神位都對應著乙個人。在西周時代,如果乙個人聲稱自己是神,那麼他必須可以通過封神榜的驗證,如果封神榜驗證了下這個人,發現神位上根本沒這號人,那麼這個人絕對不是神。但是封神榜的驗證方式是有漏洞的,那些企圖依靠神的名聲招搖撞騙的人之中,有些人發現了這個秘密,他們可以通過偽造自己的...

談談我對flexbox的理解

寫在開頭 關於flex,學了很久的前端了,偶爾也在用,尤其是當需要水平居中的時候,就用display flex,感覺非常好用。但是其實對於flex的理解並不是很到位,根本都不懂flex,所以正兒八經的來研究一下flexbox。flex布局模型不同於塊和內聯模型布局,塊和內聯模型的布局計算依賴於塊和內...

談談我對DI的理解

本文中di指依賴倒置。依賴的概念 baidu百科 依靠別人或事物而不能自立或自給。軟體開發中的依賴 依賴描述了兩個模型元素之間的關係,如果被依賴的模型元素發生變化就會影響到另乙個模型元素。di的概念 a.上層模組不應該依賴於下層模組,它們共同依賴於乙個抽象。b.抽象不能依賴於具象,具象依賴於抽象。例...