重构
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
#define _SUFFIX_ARRAY_H_
|
#define _SUFFIX_ARRAY_H_
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace TinySTL{
|
namespace TinySTL{
|
||||||
|
|
||||||
@@ -26,20 +25,12 @@ namespace TinySTL{
|
|||||||
calHeight(arr, len);
|
calHeight(arr, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
array_type suffixArray(){
|
array_type suffixArray()const{ return _suffix_array; }
|
||||||
return _suffix_array;
|
array_type heightArray()const{ return _height_array; }
|
||||||
}
|
array_type rankArray()const{ return _rank_array; }
|
||||||
array_type heightArray(){
|
|
||||||
return _height_array;
|
|
||||||
}
|
|
||||||
array_type rankArray(){
|
|
||||||
return _rank_array;
|
|
||||||
}
|
|
||||||
private:
|
private:
|
||||||
template<class InputIteraotr>
|
template<class InputIteraotr>
|
||||||
bool cmp(const InputIteraotr arr, size_t a, size_t b, size_t l){
|
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];
|
|
||||||
}
|
|
||||||
void calRank(){
|
void calRank(){
|
||||||
_rank_array.resize(_suffix_array.size());
|
_rank_array.resize(_suffix_array.size());
|
||||||
for (auto i = 0; i != _suffix_array.size(); ++i){
|
for (auto i = 0; i != _suffix_array.size(); ++i){
|
||||||
@@ -47,7 +38,29 @@ namespace TinySTL{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
template<class InputIterator>
|
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){
|
||||||
//采用了罗穗骞论文中实现的倍增算法
|
//采用了罗穗骞论文中实现的倍增算法
|
||||||
//算法时间复杂度 = O(nlg(n))
|
//算法时间复杂度 = O(nlg(n))
|
||||||
_suffix_array.resize(len);
|
_suffix_array.resize(len);
|
||||||
@@ -65,8 +78,7 @@ namespace TinySTL{
|
|||||||
//下面这层循环中p代表rank值不用的字符串的数量,如果p达到len,那么各个字符串的大小关系就已经明了了。
|
//下面这层循环中p代表rank值不用的字符串的数量,如果p达到len,那么各个字符串的大小关系就已经明了了。
|
||||||
//j代表当前待合并的字符串的长度,每次将两个长度为j的字符串合并成一个长度为2*j的字符串,当然如果包含字符串末尾具体则数值应另当别论,但思想是一样的。
|
//j代表当前待合并的字符串的长度,每次将两个长度为j的字符串合并成一个长度为2*j的字符串,当然如果包含字符串末尾具体则数值应另当别论,但思想是一样的。
|
||||||
//max_len同样代表基数排序的元素的取值范围
|
//max_len同样代表基数排序的元素的取值范围
|
||||||
for (j = 1, p = 1; p < len; j *= 2, max_len = p)
|
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 (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;
|
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++;
|
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
|
#endif
|
||||||
Reference in New Issue
Block a user