原创 RMQ+1/-1算法

RMQ+1/-1問題要求數列中相鄰兩個元素相差+1或-1。利用這個限定條件可以使該算法複雜度總體上達到<O(n),O(1)>。具體做法是: 1) 設數列A的大小爲n,先對數列A分組,每組大小爲b=1/2.logn (之所以這樣分是爲了將預

原创 Parry圓的反演

最近閒來無事,專門研究了一下Parry圓的性質,發現如果以參考三角形ABC的外接圓作爲反演圓,那麼Parry圓的反演就是自身。原因是:Parry圓與外接圓有兩個交點,一個是Kiepert拋物線的焦點,一個是Parry點,這兩個點反演後不變

原创 費馬點到頂點的距離及正負費馬點之間的距離公式

嚴格說來,第一費馬點或正費馬點的名稱應該叫做稱作X13,因爲當三角形最大角大於120度時X13點就不是傳統意義上的費馬點了。同樣,第二費馬點或負費馬點的名稱應該叫做稱作X14。但處於方便考慮,這裏還是稱作正負費馬點。計算費馬點到頂點的距離

原创 三角形內嵌的相似三角形之間的關係

給定一個參考三角形ABC,在三條邊上(或延長線)各任意取一點X,Y,Z,那麼XYZ叫做內嵌三角形或叫Miquel三角形。與XYZ相似(指同向相似)的內嵌三角形有無數個,那麼所有相似的內嵌三角形具有唯一的一個Miquel點。 下面用文字證明

原创 RMQ問題的樹狀數組解法

樹狀數組中每個元素覆蓋了不同長度的子區間,類似於稀疏表(ST)算法的思想,每一個數組元素存儲了輸入數列A在該區間的最小值下標。注意:這裏樹狀數組不是用來存儲區間累加值,而是區間的最小值下標。 這裏針對預處理階段提供兩個算法:方法1(參考以

原创 壓縮存儲後綴數組的childtab

相比後綴樹,後綴數組的優勢是存儲空間小,相關算法效率高。但是若存放childtab還是使用up,down和nextLIndex三個屬性,這顯然不符合後

原创 RMQ問題的ST算法

ST(Sparse Table)算法的基本思想是,預先計算從起點A[i]開始長度爲2的j次方(j=0,1...logn)的區間的最小值,然後在查詢時將任何一個區間A[i..j]劃分爲兩個預處理好的可能重疊的區間,取這兩個重疊區間的最小值。

原创 使用增強型後綴數組(ESA)的文本匹配算法

設模式串的長度爲m,文本的長度爲n,使用後綴數組做文本匹配,如果只用後綴表suftab和折半查找算法的複雜度爲O(m*logn); 如果使用最長公共前綴表lcptab和折半查找算法,複雜度可以降至O(m+logn);使用增強型後綴數組(E

原创 樹狀數組(Binary Indexed Tree)

樹狀數組(BIT - Binary Indexed Tree)是一個用數組表示的樹型數據結構,最早用於頻次累計表中。樹狀數組中每個元素維護一個頻次表A的特定部分區段的累加和。假設輸入動態序列爲A,A中元素值可以被修改,如果使用直接蠻力法來

原创 後綴樹的自頂向下(top-down)遍歷

與後綴數組的top-down遍歷相比,後綴樹的自頂向下遍歷相對直接一些。下面的實現中首先確定每一個內部結點的左右後綴邊界下標(prepare方法),然後先序遍歷所有內部結點。實現:import java.util.ArrayList; i

原创 LCA的Tarjan離線算法

LCA的Tarjan離線(offline)算法中,通過後序DFS遍歷多叉樹(結點數爲n),利用並查集算法(disjoint sets‘ union-find operations),可以在線性時間O(n+|P|)內找到事先給定(即offl

原创 使用ProGuard合併多個jar文件

ProGuard(http://proguard.sourceforge.net/)對jar文件可以進行縮減,優化和混淆等操作。縮減jar文件將多個輸入jar文件(injar參數)合成一個輸出jar文件(outjar參數)。優化執行與編譯

原创 RMQ問題的Fischer-Heun算法(直接方法)

在普通RMQ問題的<O(n),O(1)>算法中,由於需要構造Cartesian Tree和得到Euler tour,兩個2*n-1大小的數組E和L使得空間消耗增加O(4*n)。本文介紹的Fischer-Heun算法繞過構建Cartesia

原创 First time play with JavaCV/OpenCV to detect faces

JavaCV(http://code.google.com/p/javacv/) is a java wrapper of OpenCV (http://opencv.willowgarage.com/). Because it is j

原创 普通RMQ問題轉化爲LCA問題的算法

該基本思想是通過對問題的轉化,最終得到<O(n),O(1)>時間複雜度。 該算法分以下兩大步驟: 1)將RMQ問題轉化爲LCA問題:先構建輸入數列A的笛卡爾樹,構建笛卡爾樹的複雜度爲O(n)。 2)將LCA問題轉化爲RMQ+1/-1問題: