| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
Data.RollingHash
Synopsis
- newtype RollingHash (b :: Nat) = RollingHash {}
- data RollingHashTable (b :: Nat) = RollingHashTable {
- originalRH :: !(Vector Char)
- hashForwardRH :: !(Vector (RollingHash b))
- hashReverseRH :: !(Vector (RollingHash b))
- powCacheRH :: !(Vector (RollingHash b))
- recipPowCacheRH :: !(Vector (RollingHash b))
- buildRollingHashTable :: forall (b :: Nat). KnownNat b => Vector Char -> RollingHashTable b
- rollingHashTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b
- rollingHashFromTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> RollingHash b
- rollingHashReverseTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b
- rollingHashReverseFromTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> RollingHash b
- isPalindromeFromTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> Bool
- appendRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b -> Int -> RollingHash b -> RollingHash b
- longestCommonPrefixRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> Int
- compareSuffixRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> Ordering
- findSubstringIndexRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b -> Maybe Int
- findSubstringIndicesRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b -> Vector Int
- asRollingHashOf :: forall (b :: Nat). RollingHash b -> Proxy b -> RollingHash b
- emptyRH :: forall (b :: Nat). RollingHash b
- singletonRH :: forall (b :: Nat). Int -> RollingHash b
- snocRH :: forall (b :: Nat). KnownNat b => RollingHash b -> Char -> RollingHash b
- isPrimitiveRootRH :: Int -> Bool
- genPrimitiveRootRH :: RandomGen g => g -> Int
- withPrimitiveRootRH :: RandomGen g => g -> (forall (b :: Nat). KnownNat b => Proxy b -> a) -> a
Documentation
newtype RollingHash (b :: Nat) Source #
modulo 2^61-1
b should be a primitive root of 2^61-1
Constructors
| RollingHash | |
Fields | |
Instances
data RollingHashTable (b :: Nat) Source #
Constructors
| RollingHashTable | |
Fields
| |
buildRollingHashTable :: forall (b :: Nat). KnownNat b => Vector Char -> RollingHashTable b Source #
rollingHashTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b Source #
>>>rht = buildRollingHashTable @2047 $ U.fromList "abcdef">>>rollingHashTo rht 3406650978>>>fromString @(RollingHash 2047) "abc"406650978
rollingHashFromTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> RollingHash b Source #
>>>rht = buildRollingHashTable @2047 $ U.fromList "abcdef">>>rollingHashFromTo rht 1 4410843235>>>fromString @(RollingHash 2047) "bcd"410843235
rollingHashReverseTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b Source #
>>>rht = buildRollingHashTable @2047 $ U.fromList "abcdef">>>rollingHashReverseTo rht 3415031394>>>fromString @(RollingHash 2047) "cba"415031394
rollingHashReverseFromTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> RollingHash b Source #
>>>rht = buildRollingHashTable @2047 $ U.fromList "abcdef">>>rollingHashReverseFromTo rht 1 4419223651>>>fromString @(RollingHash 2047) "dcb"419223651
isPalindromeFromTo :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> Bool Source #
O(1)
>>>rht = buildRollingHashTable @2047 $ U.fromList "mississippi">>>isPalindromeFromTo rht 0 11False>>>isPalindromeFromTo rht 1 5True>>>isPalindromeFromTo rht 1 8True>>>isPalindromeFromTo rht 0 0True>>>isPalindromeFromTo rht 11 11True
Arguments
| :: forall (b :: Nat). KnownNat b | |
| => RollingHashTable b | |
| -> Int | length |
| -> RollingHash b | |
| -> Int | length |
| -> RollingHash b | |
| -> RollingHash b |
>>>cacheSize = 10>>>rht = buildRollingHashTable @2047 $ U.replicate cacheSize 'x'>>>ab = "ab">>>cde = "cde">>>appendRH rht (length ab) (fromString ab) (length cde) (fromString cde)1703952588079203>>>fromString @(RollingHash 2047) "abcde"1703952588079203
>>>rht = buildRollingHashTable @2047 U.empty>>>ab = "ab">>>cde = "cde">>>appendRH rht (length ab) (fromString ab) (length cde) (fromString cde)1703952588079203>>>fromString @(RollingHash 2047) "abcde"1703952588079203
longestCommonPrefixRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> Int Source #
LCP(Longet Common Prefix) of s[i..n) and s[j..n)
O(log n)
>>>rht = buildRollingHashTable @2047 $ U.fromList "abcxxxabc">>>longestCommonPrefixRH rht 0 63>>>longestCommonPrefixRH rht 0 09>>>longestCommonPrefixRH rht 8 81>>>longestCommonPrefixRH rht 0 10
compareSuffixRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> Int -> Ordering Source #
O(log n)
>>>import Data.List>>>rht = buildRollingHashTable @2047 $ U.fromList "mississippi">>>sortBy (compareSuffixRH rht) [0..11][11,10,7,4,1,0,9,8,6,3,5,2]>>>rht = buildRollingHashTable @2047 $ U.fromList "abracadabra">>>sortBy (compareSuffixRH rht) [0..11][11,10,7,0,3,5,8,1,4,6,9,2]>>>rht = buildRollingHashTable @2047 $ U.fromList "ababab">>>sortBy (compareSuffixRH rht) [0..6][6,4,2,0,5,3,1]
Arguments
| :: forall (b :: Nat). KnownNat b | |
| => RollingHashTable b | |
| -> Int | length |
| -> RollingHash b | |
| -> Maybe Int |
Rabin–Karp
O(n)
>>>rht = buildRollingHashTable @2047 $ U.fromList "xxxabcxxx">>>abc = "abc">>>findSubstringIndexRH rht (length abc) (fromString abc)Just 3>>>zzz = "zzz">>>findSubstringIndexRH rht (length zzz) (fromString zzz)Nothing
findSubstringIndicesRH :: forall (b :: Nat). KnownNat b => RollingHashTable b -> Int -> RollingHash b -> Vector Int Source #
Rabin–Karp
O(n)
>>>rht = buildRollingHashTable @2047 $ U.fromList "xxxabcxxx">>>abc = "abc">>>findSubstringIndicesRH rht (length abc) (fromString abc)[3]>>>xxx = "xxx">>>findSubstringIndicesRH rht (length xxx) (fromString xxx)[0,6]>>>zzz = "zzz">>>findSubstringIndicesRH rht (length zzz) (fromString zzz)[]
asRollingHashOf :: forall (b :: Nat). RollingHash b -> Proxy b -> RollingHash b Source #
emptyRH :: forall (b :: Nat). RollingHash b Source #
singletonRH :: forall (b :: Nat). Int -> RollingHash b Source #
snocRH :: forall (b :: Nat). KnownNat b => RollingHash b -> Char -> RollingHash b Source #
>>>F.foldl' (snocRH @2047) emptyRH "abc"406650978
isPrimitiveRootRH :: Int -> Bool Source #
check if g is a primitive root of 2^61-1.
>>>isPrimitiveRootRH 2047True>>>take 10 $ filter isPrimitiveRootRH [2..][37,43,55,69,74,86,110,123,133,138]
genPrimitiveRootRH :: RandomGen g => g -> Int Source #
Generate a primitive root of 2^61-1.
>>>genPrimitiveRootRH (mkStdGen 123)1600615663002506808>>>isPrimitiveRootRH 1600615663002506808True