折半查表法

即对从大到小或从小到大排列的数组中数进行查找时用到的搜索方法

我是在对应热敏电阻阻值与实际温度值时用到

一维数组,标号代表温度,间隔为1,所以正好,每个数组内容对应该阻值下的温度

得到热敏电阻阻值后,开始从中间开始比大小,大了,把低端的指针指向数组中间的数据地址,小了则把高端的指针指向中点

然后再循环比较下去,会有两种情况

1、中间的数刚好跟比较的数相等,那么可以推出循环了

2、数组中没有与比较的数相等的数,那么这个比较的数会处在某两个数之间,可以用中位值代替,或者拟合啥的

附一个C语言的函数代码:

static void Lookup_TAB(Uint16 data,const Uint16 *TABLE,Uint16 *aptr)
{
	register Uint16 i;
	Uint16 *eptr=(Uint16 *)&TABLE[101]; //高端指针  高低端指针即每次折半后数据范围的两头地址
	Uint16 *sptr=(Uint16 *)TABLE; //低端指针
	Uint16 *ptr; //查数指针
	for(i=0;i<8;i++) //搜索全表
	{
		ptr = (Uint16 *)((Uint16)sptr+(((Uint16)(eptr-sptr))>>1));//数组的地址是连续的;
		if(*ptr>data) sptr = ptr;
		else if(*ptr<data) eptr = ptr;
		else //查到相等的节点
		{
			aptr[2] = *ptr; //Y1
			aptr[1] = *(ptr+1); //Y2
			aptr[0] = (Uint16)(ptr-TABLE)*10;//X1*10;放大10倍
			break;
		}
		if(eptr-sptr==1) //查到节点的范围
		{
			aptr[2] = *sptr; //Y1
			aptr[1] = *eptr; //Y2
			aptr[0] = (Uint16)(sptr-TABLE)*10+(*sptr-data)*10/(*sptr-*eptr);//X1*10+(y-y1)*10/(y2-y1);放大10倍,这样就将温度精度提高到一个小数位;
			break;
		}
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值