對於不影響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