我有一個很長的一維正整數數組。從一端開始,我需要找到數組中最長的片/塊,其值至少與該片的所有組成部分相距一個數字。查找包含分隔值的數組的最長切片
即,我想對數組進行分區(從左邊開始),使得每個分區包含的元素與該分區中的所有其他元素相距不止一個單元。
例如:
- [1,1,9,5,3,8,7,4,1,2] - > [1],[1,9,5,3],[ 8],[7,4,1],[2]
- [1,5,9,1,3,6,4,2,7,0] - > [1,5,9],[1 ,3,6,4],[2,7,0]
Bellow,我在Fortran中編寫了一些代碼,可以讓我找到第一個這樣的重複先前值的點。
- 掩模是LOGICAL陣列
- 陣列是有問題的陣列
- n是陣列
我可以很容易地擴展,以找到完整的分區的長度。
mask = .FALSE.
DO i = 1,n
k = array(i)
IF (mask(k)) THEN
PRINT*, i
EXIT
ELSE
mask(k-1 : k+1) = .TRUE.
END IF
END DO
所以我的問題是,有沒有更好的方法(算法)做到這一點?當我說得更好時,我的意思是速度。我不介意記憶成本。
@ d_1999哦,我想要的是一個分區,使得每個分區只有數量超過該分區的任何其他組成部分的數量。 – physkets
如果您不需要流式解決方案,那麼可以計算第二個增量數組,然後在增量數組中的零點處打破(輸出)數組。使用-O3或一些編譯指示!DIR可以輕鬆獲得delta的矢量化代碼? SIMD或!?OMP SIMD(OpenMP)很容易。然後掩模仍然可以用來顯示零點在哪裏。它取決於一個非常長的數組有多大(?),但是你說內存不是問題......你應該能夠在矢量化增量部分獲得帶寬限制。掩碼也可以是一個整數以跟蹤數組子區 – Holmz
只是一些想法:在第一個示例中,您允許'9'和'8'出現在同一個片段中嗎?它應該不是'[1],[1,9,3],[8],[7,4,1],[2]'?此外,這遵循你從左邊*的規則。在[1,1,9,3,8,10,5,1]的情況下,你想要[1],[1,9,3],[8,10,5,1]'(左)還是你想要拾取較長的最大片[1],[1,9],[3,8,10,5,1]'。 – Steve