对于不影响order of complexity的代码更改,任何候选改进都需要分析(测量性能的测试)来验证。
以下依然是O(n * m),但系数降低,因为如果a[]
具有也存在于b[]
中的重复值,则它可以更快地步进b[]
。这加速了大部分时间消耗的内部循环。
看为不同的值的a[]
图案如此j
可以推进更快。
例子:
#define x 0
bool Pattern3(const int *a, size_t size_a, const int *b, size_t size_b) {
static const unsigned char deltas[2][2][2][2] = { //
// What type of pattern is a[0], a[1], a[2]?
{ { { 1, 1 }, // X Y Z
{ 1, 1 } }, // X Y Y
{ { 1, 2 }, // X Y X
{ x, x } } }, // not possible
{ { { 2, 1 }, // X X Y
{ x, x } }, // not possible
{ { x, x }, // not possible
{ 2, 3 } } } }; // X X X
for (unsigned i = 0; i + 2 < size_a; i++) {
const unsigned char *delta23 = deltas[a[0] == a[1]][a[0] == a[2]][a[1] == a[2]];
for (unsigned j = 0; j + 2 < size_b;) {
if (a[0] != b[j]) {
j++;
} else if (a[0 + 1] != b[j + 1]) {
j += delta23[0];
} else if (a[0 + 2] != b[j + 2]) {
j += delta23[1];
} else {
return true;
}
}
a++;
}
return false;
}
其他小的变化,这可能会有帮助。
在上面,交换a,b
时size_a > size_b
。
使用const
作为更少的编译器可以优化。
// int consecutiveInts(int *a, int sizeA, int *b, int sizeB){
int consecutiveInts(const int *a, int sizeA, const int *b, int sizeB){
从2开始迭代。相应地调整索引。
for (i = 2 ; i < sizeA ; i++){
...
我会在循环之前进行一些测试,以免循环无用。例如,检查A和B的大小是否大于3。 – Badda
您可能希望以更完整的方式撰写您的示例,并在[codereview.se]上征求批评意见。首先,请阅读[Stack Overflow用户的代码评论指南](// codereview.meta.stackexchange.com/a/5778),因为有些事情在那里以不同的方式完成! –
使用动态编程。 – haccks