add suffix_array
This commit is contained in:
55
TinySTL/SuffixArray.h
Normal file
55
TinySTL/SuffixArray.h
Normal file
@@ -0,0 +1,55 @@
|
||||
#ifndef _SUFFIX_ARRAY_H_
|
||||
#define _SUFFIX_ARRAY_H_
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
namespace TinySTL{
|
||||
|
||||
class suffix_array{
|
||||
private:
|
||||
//typedef std::unique_ptr<std::vector<int>> vecPtr;
|
||||
private:
|
||||
std::vector<int> _array;
|
||||
public:
|
||||
template<class InputIterator>
|
||||
//arr - Դ<><D4B4><EFBFBD><EFBFBD>
|
||||
//len - Դ<><D4B4><EFBFBD>鳤<EFBFBD><E9B3A4>
|
||||
//max_len - max_len<65><6E><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȡֵ<C8A1><D6B5>Χ<EFBFBD><CEA7><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ȡ128<32><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><6D><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ֵ<EFBFBD><D6B5>
|
||||
suffix_array(InputIterator arr, int len, int max_len = 128){
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵı<D6B5><C4B1><EFBFBD><EFBFBD>㷨
|
||||
_array.resize(len);
|
||||
int wa[1024], wb[1024], wv[1024], ws[1024];
|
||||
|
||||
int i, j, p, *x = wa, *y = wb, *t;
|
||||
for (i = 0; i < max_len; i++) ws[i] = 0;
|
||||
for (i = 0; i < len; i++) ws[x[i] = arr[i]]++;
|
||||
for (i = 1; i < max_len; i++) ws[i] += ws[i - 1];
|
||||
for (i = len - 1; i >= 0; i--) _array[--ws[x[i]]] = i;
|
||||
for (j = 1, p = 1; p < len; j *= 2, max_len = p)
|
||||
{
|
||||
for (p = 0, i = len - j; i < len; i++) y[p++] = i;
|
||||
for (i = 0; i < len; i++) if (_array[i] >= j) y[p++] = _array[i] - j;
|
||||
for (i = 0; i < len; i++) wv[i] = x[y[i]];
|
||||
for (i = 0; i < max_len; i++) ws[i] = 0;
|
||||
for (i = 0; i < len; i++) ws[wv[i]]++;
|
||||
for (i = 1; i < max_len; i++) ws[i] += ws[i - 1];
|
||||
for (i = len - 1; i >= 0; i--) _array[--ws[wv[i]]] = y[i];
|
||||
for (t = x, x = y, y = t, p = 1, x[_array[0]] = 0, i = 1; i < len; i++)
|
||||
x[_array[i]] = cmp(y, _array[i - 1], _array[i], j) ? p - 1 : p++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const std::vector<int> suffixArray()const{
|
||||
return _array;
|
||||
}
|
||||
private:
|
||||
bool cmp(int *arr, int a, int b, int l){
|
||||
return arr[a] == arr[b] && arr[a + l] == arr[b + l];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -83,6 +83,10 @@
|
||||
<ClCompile Include="Profiler\Profiler.cpp" />
|
||||
<ClCompile Include="Test\AlgorithmTest.cpp" />
|
||||
<ClCompile Include="Test\PairTest.cpp" />
|
||||
<ClCompile Include="Test\PriorityQueueTest.cpp" />
|
||||
<ClCompile Include="Test\StringTest.cpp" />
|
||||
<ClCompile Include="Test\SuffixArrayTest.cpp" />
|
||||
<ClCompile Include="Test\VectorTest.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Algorithm.h" />
|
||||
@@ -102,8 +106,14 @@
|
||||
<ClInclude Include="ReverseIterator.h" />
|
||||
<ClInclude Include="Stack.h" />
|
||||
<ClInclude Include="String.h" />
|
||||
<ClInclude Include="SuffixArray.h" />
|
||||
<ClInclude Include="Test\AlgorithmTest.h" />
|
||||
<ClInclude Include="Test\PairTest.h" />
|
||||
<ClInclude Include="Test\PriorityQueueTest.h" />
|
||||
<ClInclude Include="Test\StringTest.h" />
|
||||
<ClInclude Include="Test\SuffixArrayTest.h" />
|
||||
<ClInclude Include="Test\TestUtil.h" />
|
||||
<ClInclude Include="Test\VectorTest.h" />
|
||||
<ClInclude Include="TypeTraits.h" />
|
||||
<ClInclude Include="UninitializedFunctions.h" />
|
||||
<ClInclude Include="Utility.h" />
|
||||
|
||||
@@ -33,6 +33,18 @@
|
||||
<ClCompile Include="Test\AlgorithmTest.cpp">
|
||||
<Filter>Test</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Test\VectorTest.cpp">
|
||||
<Filter>Test</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Test\StringTest.cpp">
|
||||
<Filter>Test</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Test\PriorityQueueTest.cpp">
|
||||
<Filter>Test</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Test\SuffixArrayTest.cpp">
|
||||
<Filter>Test</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="TypeTraits.h">
|
||||
@@ -104,6 +116,24 @@
|
||||
<ClInclude Include="Test\PairTest.h">
|
||||
<Filter>Test</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Test\AlgorithmTest.h">
|
||||
<Filter>Test</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Test\VectorTest.h">
|
||||
<Filter>Test</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Test\StringTest.h">
|
||||
<Filter>Test</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Test\PriorityQueueTest.h">
|
||||
<Filter>Test</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SuffixArray.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Test\SuffixArrayTest.h">
|
||||
<Filter>Test</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\README.md" />
|
||||
|
||||
Reference in New Issue
Block a user