提交 7784f65e 编写于 作者: 邹晓航

add suffix_array

上级 c82d8008
#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 - 源数组
//len - 源数组长度
//max_len - max_len代表字符串中字符的取值范围,是基数排序的一个参数,
// 如果原序列都是字母可以直接取128,如果原序列本身都是整数的话,则m可以取比最大的整数大1的值。
suffix_array(InputIterator arr, int len, int max_len = 128){
//采用了罗穗骞论文中实现的倍增算法
_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
\ No newline at end of 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" />
......
......@@ -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" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册