This commit is contained in:
邹晓航
2015-01-12 13:30:33 +08:00
parent b77522e253
commit 7adeaab4f9

View File

@@ -2,7 +2,6 @@
#define _SUFFIX_ARRAY_H_
#include <vector>
#include <memory>
namespace TinySTL{
@@ -26,20 +25,12 @@ namespace TinySTL{
calHeight(arr, len);
}
array_type suffixArray(){
return _suffix_array;
}
array_type heightArray(){
return _height_array;
}
array_type rankArray(){
return _rank_array;
}
array_type suffixArray()const{ return _suffix_array; }
array_type heightArray()const{ return _height_array; }
array_type rankArray()const{ return _rank_array; }
private:
template<class InputIteraotr>
bool cmp(const InputIteraotr arr, size_t a, size_t b, size_t l){
return arr[a] == arr[b] && arr[a + l] == arr[b + l];
}
bool cmp(const InputIteraotr arr, size_t a, size_t b, size_t l);
void calRank(){
_rank_array.resize(_suffix_array.size());
for (auto i = 0; i != _suffix_array.size(); ++i){
@@ -47,7 +38,29 @@ namespace TinySTL{
}
}
template<class InputIterator>
void calSuffix(const InputIterator arr, size_t len, size_t max_len){
void calSuffix(const InputIterator arr, size_t len, size_t max_len);
template<class InputIteraotr>
void calHeight(const InputIteraotr arr, size_t len);
};
template<class InputIteraotr>
bool suffix_array::cmp(const InputIteraotr arr, size_t a, size_t b, size_t l){
return arr[a] == arr[b] && arr[a + l] == arr[b + l];
}
template<class InputIteraotr>
void suffix_array::calHeight(const InputIteraotr arr, size_t len){
_height_array.resize(_suffix_array.size() - 1);
for (auto i = 0; i != _suffix_array.size() - 1; ++i){
auto n = 0;
for (auto j = _suffix_array[i], k = _suffix_array[i + 1];
arr[j] == arr[k] && (arr + j) != (arr + len) && (arr + k) != (arr + len);
++j, ++k)
++n;
_height_array[i] = n;
}
}
template<class InputIterator>
void suffix_array::calSuffix(const InputIterator arr, size_t len, size_t max_len){
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵı<D6B5><C4B1><EFBFBD><EFBFBD>
//<2F>㷨ʱ<E3B7A8><EFBFBD>Ӷ<EFBFBD> = O(nlg(n))
_suffix_array.resize(len);
@@ -65,8 +78,7 @@ namespace TinySTL{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD>rankֵ<6B><D6B5><EFBFBD>õ<EFBFBD><C3B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>ﵽlen<65><6E><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1>ϵ<EFBFBD><CFB5><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˡ<EFBFBD>
//j<><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD>ÿ<EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊj<CEAA><6A><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2*j<><6A><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵӦ<D6B5><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۣ<EFBFBD><DBA3><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ġ<EFBFBD>
//max_lenͬ<6E><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD>ȡֵ<C8A1><D6B5>Χ
for (j = 1, p = 1; p < len; j *= 2, max_len = p)
{
for (j = 1, p = 1; p < len; j *= 2, max_len = p){
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>˶Եڶ<D4B5><DAB6>ؼ<EFBFBD><D8BC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>
for (p = 0, i = len - j; i < len; i++) y[p++] = i;
for (i = 0; i < len; i++) if (_suffix_array[i] >= j) y[p++] = _suffix_array[i] - j;
@@ -84,20 +96,6 @@ namespace TinySTL{
x[_suffix_array[i]] = cmp(y, _suffix_array[i - 1], _suffix_array[i], j) ? p - 1 : p++;
}
}
template<class InputIteraotr>
void calHeight(const InputIteraotr arr, size_t len)
{
_height_array.resize(_suffix_array.size() - 1);
for (auto i = 0; i != _suffix_array.size() - 1; ++i){
auto n = 0;
for (auto j = _suffix_array[i], k = _suffix_array[i + 1];
arr[j] == arr[k] && (arr + j) != (arr + len) && (arr + k) != (arr + len);
++j, ++k)
++n;
_height_array[i] = n;
}
}
};
}
#endif