1.基本原理
哨兵顾名思义是处于边界的兵,它的作用是简化边界条件的处理,降低时间复杂度里面的常数因子,用下面的两个程序来说明,应该更通俗易懂,在“search_value2”中,由于设置了哨兵,整个程序会少很多边界判断,“search_value2”的平均计算量是比“search_value1”少。
#include<iostream>
#include<vector>
using namespace std;
/*
判断数组src里面是否包含value
包含:返回True
不包含或者src为空:返回False
*/
bool search_value1(const vector<int>& src, const int& value) {
if (!src.size())
return false;
int src_len = src.size();
for (int i = 0; i < src_len; ++i) {
if (src[i] == value)
return true;
}
return false;
}
bool search_value2(vector<int> src, const int& value) {
if (!src.size())
return false;
if (src[0] == value)
return true;
src[0] = value; //哨兵
int i = src.size() - 1;
while (src[i] != value)
--i;
if (i != 0)
return true;
return false;
}
int main() {
vector<int> src;
const int value = 11;
bool result1 = search_value1(src, value);
bool result2 = search_value1(src, value);
return 0;
}
2.扩展应用
在图像处理中,如果我们用5x5的高斯核处理图像,当图像没做任何处理的时候,程序中是有边界判断(有些大牛的处理手段比较高超,不在讨论范围内),为了减少边界判断,我们可以把图像的上下各补两行和左右各补两列,这也属于哨兵操作。