add suffix_array

This commit is contained in:
邹晓航
2014-12-30 11:11:47 +08:00
parent c82d80085e
commit 7784f65e21
3 changed files with 95 additions and 0 deletions

55
TinySTL/SuffixArray.h Normal file
View 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

View File

@@ -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" />

View File

@@ -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" />