C++ 朴素后缀数组优化c++;

C++ 朴素后缀数组优化c++;,c++,optimization,suffix-array,C++,Optimization,Suffix Array,您知道如何在仍然使用std::sort()的情况下优化以下函数吗。 它对文本的后缀进行排序,以创建后缀数组。我认为问题出在compare函数中,因为剩下的就没什么可做的了compare基本上是词典编纂的我没有对它进行分析,但是-取决于编译器的聪明程度-我认为非递归公式可能更有效: std::function<bool(uint32_t, uint32_t)> compare = [&](uint32_t a, uint32_t b) { do

您知道如何在仍然使用
std::sort()
的情况下优化以下函数吗。
它对
文本的后缀进行排序,以创建后缀数组。我认为问题出在
compare
函数中,因为剩下的就没什么可做的了
compare
基本上是词典编纂的
我没有对它进行分析,但是-取决于编译器的聪明程度-我认为非递归公式可能更有效:

std::function<bool(uint32_t, uint32_t)> compare = [&](uint32_t a, uint32_t b) {
        do
        {
            if (a>=tsize) return true;
            else if (b>=tsize) return false;
            else if (text[a] < text[b]) return true;
            else if (text[a] > text[b]) return false;
            a += 1;
            b += 1;
        } while (true);
    };
std::function compare=[&](uint32\u t a,uint32\u t b){
做
{
如果(a>=tsize)返回true;
否则如果(b>=tsize)返回false;
else if(text[a]text[b])返回false;
a+=1;
b+=1;
}虽然(正确);
};

我还没有对其进行分析,但是-取决于编译器的聪明程度-我认为非递归公式可能更有效:

std::function<bool(uint32_t, uint32_t)> compare = [&](uint32_t a, uint32_t b) {
        do
        {
            if (a>=tsize) return true;
            else if (b>=tsize) return false;
            else if (text[a] < text[b]) return true;
            else if (text[a] > text[b]) return false;
            a += 1;
            b += 1;
        } while (true);
    };
std::function compare=[&](uint32\u t a,uint32\u t b){
做
{
如果(a>=tsize)返回true;
否则如果(b>=tsize)返回false;
else if(text[a]text[b])返回false;
a+=1;
b+=1;
}虽然(正确);
};

比较中的代码根据字符串的字符按字典顺序进行比较。这与比较数字的方式非常相似-最高有效位/字节,如果不同,则强制比较结果,如果相等,则将结果延迟到较低有效位/字节。因此,如果字符串通常很长,可以使用
uint64\u t
一次比较8个字节


为此,必须填充字符串(使用零值字节),以防止越界读取(或者,仅当距离字符串末尾较远时才进行8字节比较,否则进行原始的1字节比较)。此外,如果您的系统是little endian(最有可能),则必须反转
uint64\u t
数字中的字节。

比较
中的代码按照字母顺序比较字符串。这与比较数字的方式非常相似-最高有效位/字节,如果不同,则强制比较结果,如果相等,则将结果延迟到较低有效位/字节。因此,如果字符串通常很长,可以使用
uint64\u t
一次比较8个字节


为此,必须填充字符串(使用零值字节),以防止越界读取(或者,仅当距离字符串末尾较远时才进行8字节比较,否则进行原始的1字节比较)。此外,如果您的系统是little endian(很可能),您必须反转
uint64\u t
数字中的字节。

我很难理解您的比较逻辑。
sa
text
的内容是什么?如果您可以使用示例输入和预期输出发布a,则最好。如果(a>=tsize)返回true,则比较函数的第一行应该是
-您将离开字符串的末尾。第二行类似。但是如果你需要任何其他帮助,你必须提供更多的信息——正如上面R Sahu所建议的那样。我甚至不清楚您是否要优化或更正它,因为我们没有输入或输出…添加,就在填充
sa
向量之前:
sa.reserve(tsize)
否则,在调用
push_back()
时,必须多次重新定位向量的内部内存。我很难理解您的比较逻辑。
sa
text
的内容是什么?如果您可以使用示例输入和预期输出发布a,则最好。如果(a>=tsize)返回true,则比较函数的第一行应该是
-您将离开字符串的末尾。第二行类似。但是如果你需要任何其他帮助,你必须提供更多的信息——正如上面R Sahu所建议的那样。我甚至不清楚您是否要优化或更正它,因为我们没有输入或输出…添加,就在填充
sa
向量之前:
sa.reserve(tsize)
否则,在调用
push_back()
是的,这很好,它将时间降低到了44毫秒,这很好,它将时间降低到了44毫秒,非常感谢