折半查表法

即對從大到小或從小到大排列的數組中數進行查找時用到的搜索方法

我是在對應熱敏電阻阻值與實際溫度值時用到

一維數組,標號代表溫度,間隔爲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;
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章