这里主要记录的是算法学习过程中,值得学习和借鉴的解决问题思路。并不能解决某一特定的现实问题。用做启发和思考。
1.优化思维
在日常工作中,经常会遇到搜索问题。比方红外功能实现的遥控器键值表中,搜索特定键值、其中包括各种呈线性规则的数据表中搜索特定数据。
常规的方式就是遍历搜索
例1.
//a[N]表示某线性数据表
//val为所需查找的特定数据
int func1(int *p, int val)
{
for(int i=0; i<N; i++)
{
if (val == p[i])
return i;
}
return -1;
}
这样的时间复杂度为O(N),功能实现有两种情况,一种是找到数据并返回数据下标,另一种是找不到数据。当出现最坏的情况,和找不到数据的情况都需要遍历整个数组,循环操作N次。
但是如果将特定的线性数据按照顺序排列,那么我们程序的消耗时间就会降低。
例1.1二分法搜索
先对数据进行排序操作,对于很多工作中用到的数据表往往都是排好序的。排序的问题不在这里讨论,排序的算法放在后面讨论。使用二分法进行搜索,理论上N个数据只需要(N+1)/2次就可以实现搜索到目标数据。
//a[N]表示某线性数据表
//val为所需查找的特定数据
int func2(int *p, int val)
{
int start=0, end=N;
while(end >= start)
{
int mid = (start+end)/2;
if (val == p[mid])
{
return mid;
}
if (val < p[mid])
{
end = mid-1;
}
else
{
start = mid+1;
}
}
return -1;
}
例1和例1.1,我们可以从期望每个操作花费的时间去分析,得出我们优化的价值。当N的数值加倍时,例1顺序搜索的运行时间直接加倍,而二分搜索的运行时间是与lgN成正比,运行时间几乎没有改变,随着N的增长,这两种方法之间的差距越来越大。