專利名稱:改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種數(shù)據(jù)查找算法,特別是涉及一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法。
背景技術(shù):
折半查找算法主要是查找有序表中的某個(gè)元素,如果找到,則查找成功,并返回該元素的位序,如果沒找到,則查找不成功。該算法的優(yōu)點(diǎn)是 查找效率高,時(shí)間復(fù)雜度是O(IogN),N為有序表的長度,空間復(fù)雜度是0(1);缺點(diǎn)是待查找表必須是有序的,而且不能查找該元素在有序表的哪個(gè)區(qū)間(即哪兩個(gè)相鄰元素之間)?,F(xiàn)有的充電管理功能只能表示手機(jī)正在充電,但不能實(shí)時(shí)數(shù)字顯示充電進(jìn)度,SP充電已完成多少,只是在充電完成后會(huì)彈出一個(gè)提示框提示充電已完成。而有時(shí)用戶為了后續(xù)使用方便,是希望知道手機(jī)充了多少電,這樣從用戶體驗(yàn)的角度,人機(jī)界面就不是很友好。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是為了克服現(xiàn)有的充電管理功能不能實(shí)時(shí)數(shù)字顯示充電進(jìn)度的缺陷,提供一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法。本發(fā)明是通過下述技術(shù)方案來解決上述技術(shù)問題的一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法,其特點(diǎn)在于,該方法包括以下步驟=S1、根據(jù)電池充電曲線得到一個(gè)靜態(tài)的充電電壓表;s2、在對(duì)電池充電時(shí),啟動(dòng)一個(gè)實(shí)時(shí)任務(wù),周期地讀取該電池的充電電壓;S3、在所述充電電壓表中用折半查找算法去查找所述電池的充電電壓,若查找成功,則執(zhí)行步驟S4,否則執(zhí)行步驟S5 ;s4、返回所述電池的充電電壓在所述充電電壓表中的位序;s5、讓查找指針回溯,得知所述電池的充電電壓在相應(yīng)的區(qū)間。較佳地,所述靜態(tài)的充電電壓表是一個(gè)二維有序表。較佳地,所述步驟S3包括以下步驟S31、設(shè)置三個(gè)查找指針,分別為一有序表低位指針low、一有序表中位指針mid、一有序表高位指針high,并讓low值為0、high值為N-1,其中N為有序表的長度;S32、利用所述的三個(gè)查找指針在所述充電電壓表中采用所述折半查找算法查找所述電池的充電電壓值;S33、若查找成功,則執(zhí)行步驟S4,否則執(zhí)行步驟S5。較佳地,所述步驟S4之后還包括將所述位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用。較佳地,所述步驟S5包括以下步驟=S51、使所述有序表低位指針low值減一,然后使所述有序表中位指針mid值為所述有序表高位指針high值與所述有序表低位指針low值之和的一半;S52、比較所述有序表中位指針mid所指示元素值與所述電池的充電電壓值的大小,若所述有序表中位指針mid所指示元素值大于所述電池的充電電壓值,則執(zhí)行步驟S53,否則執(zhí)行步驟S54 ;S53、使所述有序表中位指針mid值減一然后將所述有序表中位指針mid所指示的位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用;S54、將所述有序表中位指針mid所指示的位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用。本發(fā)明的積極進(jìn)步效果在于本發(fā)明通過對(duì)折半查找算法進(jìn)行改進(jìn),使改進(jìn)后的折半查找算法不僅可以查找有序表中的某個(gè)元素(如果該元素存在),而且可以查找該元素在有序表中的某個(gè)區(qū)間(如果該元素不存在);進(jìn)而,將改進(jìn)后的折半查找算法用于充電管理中,使在充電過程中可以實(shí)時(shí)數(shù)字顯示充電進(jìn)度,這樣就方便了用戶的使用,擁有了更友好的人機(jī)界面。
圖I為本發(fā)明較佳實(shí)施例的流程圖。圖2為本發(fā)明的折半查找算法的流程圖。
具體實(shí)施方式
·
下面結(jié)合附圖給出本發(fā)明較佳實(shí)施例,以詳細(xì)說明本發(fā)明的技術(shù)方案。圖I為本發(fā)明一較佳實(shí)施方式運(yùn)用折半查找算法在充電管理中的流程圖。步驟100,根據(jù)電池充電曲線得到一個(gè)靜態(tài)的充電電壓表。通常,該充電電壓表為一個(gè)二維且單增的有序表。其中N為這個(gè)電壓有序表的長度,batt_adc[N]為電壓 ADC 值表,vbatt 為當(dāng)前充電電壓 ADC 值,batt_volt [i] [O] (i = O,
1,2,. . . N-1)為電池在各個(gè)時(shí)間節(jié)點(diǎn)的電壓,batt_volt[i] [I] (i = 0,1,2,· . . N-1)為當(dāng)前充電進(jìn)度數(shù)值,返回給上層使用,比如返回10,代表當(dāng)前充電已完成10%。一個(gè)充電電壓表的不例為#define N 20 ;intl6 batt_volt[N] [2] = {{3500,5}, {3580,10}, {3600,15}, {3620,20}, {3640,25}, {3660,30}, {3667,35}, {3674,40},{3682,45}, {3690,50}, {3700,55}, {3739,60}, {3759,65}, {3776,70}, {3787,75}, {3800,80}, {4009,85}, {4138,90}, {4194,95}, {4227,100}}。程序初始化時(shí)先將這個(gè)表中電壓轉(zhuǎn)化成ADC值,這些ADC值存放在數(shù)組batt_adc [N]中,batt_adc[N]的值如下batt_adc[N] = {153,193,204,214,224,234,238,241,245,249,255,274,285,293,299,306,412,478,506,510}步驟101,啟動(dòng)一個(gè)實(shí)時(shí)任務(wù),周期地讀取當(dāng)前電池的充電電壓ADC值。步驟102,在充電電壓表中用改進(jìn)的折半查找算法查找電池的充電電壓。其中,改進(jìn)的折半查找算法的流程圖為圖2所示。該流程開始于步驟200。步驟201,設(shè)置3個(gè)有序表指針,分別為高位指針high、低位指針low、中位指針mid,并使有序表低位指針low值為0,高位指針high值為N-I。步驟202,判斷有序表低位指針low值是否小于或者等于高位指針high值,若是,則執(zhí)行步驟203,否則執(zhí)行步驟206。步驟203,使有序表中位指針mid值為有序表高位指針high值與有序表低位指針low值之和的一半。步驟204,判斷電壓ADC有序表中位指針batt_adc[mid]所指的值是否等于當(dāng)前充電電壓ADC值vbatt,若是,則執(zhí)行步驟205,否則執(zhí)行步驟210。步驟205,返回有序表中位指針mid值。
步驟206,有序表低位指針low值減I然后使有序表中位指針mid值為有序表聞位指針high值與有序表低位指針low值之和的一半。步驟207,判斷電壓ADC有序表中位指針batt_adc[mid]所指的值是否小于或者等于當(dāng)前充電電壓ADC值vbatt,若是,則執(zhí)行步驟209,否則執(zhí)行步驟208。步驟208,返回有序表中位指針mid值減I之后的值。步驟209,返回有序表中位指針mid值。步驟210,判斷電壓ADC有序表中位指針batt_adc[mid]所指的值是否大于當(dāng)前充電電壓ADC值vbatt,若是,則執(zhí)行步驟211,否則執(zhí)行步驟212。步驟211,使有序表聞位指針high值等于有序表中位指針mid值減I之后的值,然 后返回至步驟202之前。步驟212,使有序表低位指針low值等于有序表中位指針mid值加I之后的值,然后返回至步驟202之前。步驟213,該流程圖結(jié)束。步驟103,判斷查找是否成功,若是,則執(zhí)行步驟104,否則執(zhí)行步驟105。步驟104,返回所述電池的充電電壓在所述充電電壓表中的位序。其中,步驟104之后還包括將所述位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用。步驟105,讓查找指針回溯,得知所述電池的充電電壓在相應(yīng)的區(qū)間。其中,步驟105包括S51、使有序表低位指針low值減一,然后使有序表中位指針mid值為有序表高位指針high值與有序表低位指針low值之和的一半;S52、比較有序表中位指針mid所指示元素值與所述電池的充電電壓值的大小,若有序表中位指針mid所指示元素值大于所述電池的充電電壓值,則執(zhí)行步驟S53,否則執(zhí)行步驟S54 ;S53、使有序表中位指針mid值減一然后將該有序表中位指針mid所指示的位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用;S54、將該有序表中位指針mid所指示的位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用。以下通過一具體用戶實(shí)際查看充電進(jìn)度案例進(jìn)一步說明本發(fā)明的技術(shù)方案例如首先,在數(shù)組batt_adc [N]中,為了便于對(duì)照數(shù)據(jù),下面列了兩行數(shù)據(jù),第一行數(shù)據(jù)為數(shù)組batt_adc的元素的下標(biāo),第二行數(shù)據(jù)為數(shù)組batt_adc的元素。第一行0I 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1718 19第二行153193 204 214 224 234 238 241 245 249 255 274 285 293 299306412 478 506 510然后,在此分兩種情況加以討論。情況I :即當(dāng)前讀到的充電電壓在電壓有序表中能找到(查找成功)。假設(shè)我們當(dāng)前讀到的電池電壓ADC值為285,即vbatt = 285,然后我們?nèi)ゲ閎att_adc [N] ο首先設(shè)兩個(gè)指針low和high,并讓low = O, high = N-I = 19。然后進(jìn)入一個(gè)while O 循環(huán)。進(jìn)入該循環(huán)后,mid = (low+high) /2 = (0+19)/2 = 9, vbatt = 285 >batt_adc [9] = 249,因而,low = mid+1 = 9+1 = 10,high = 19,mid = (low+high) /2 =(10+19)/2 = 14,vbatt = 285 < batt_adc [14] = 299,因而,low = 10,high = mid-1 =14-1 = 13, mid = (low+high)/2 = (10+13)/2 = 11, vbatt = 285 > batt_adc[11]=274,因而 low = mid+1 = 11+1 = 12,high = 13,mid = (low+high) /2 = (12+13)/2 = 12,vbatt = batt_adc [12] = 285,查找成功,返回 12。然后將 batt_volt [12] [I]這個(gè)值返回給上層,表示當(dāng)前充電已完成65%。情況2 :即當(dāng)前讀到的充電電壓在電壓有序表中不能找到(查找不成功)。假設(shè)我們當(dāng)前讀到的電池電壓ADC值為2 87,即vbatt = 287。然后我們?nèi)ゲ楸韇att_adc[N],方法同上。首先設(shè)兩個(gè)指針low和high,并讓low = O, high = N-I = 19。然后進(jìn)入一個(gè) while O 循環(huán)。進(jìn)入該循環(huán)后,mid = (low+high) /2 = (0+19)/2 = 9, vbatt =285 > batt_adc [9] = 249,因而,low = mid+1 = 9+1 = 10, high = 19,mid = (low+high) /2=(10+19)/2 = 14,vbatt = 285 < batt_adc[14] = 299,因而 low = 10,high = mid-1=14-1 = 13, mid = (low+high) /2 = (10+13)/2 = 11, vbatt = 285 > batt_adc [11]=274,因而 low = mid+1 = 11+1 = 12,high = 13,mid = (low+high) /2 = (12+13)/2 = 12,vbatt = 287 > batt_adc [12] = 285,因而 low = mid+1 = 12+1 = 13,high = 13,mid
.............1 = (13+13)/2 = 13, vbatt = 287 < batt_adc[13] = 293,因而 low = 13,
high = mid-1 = 13-1 = 12。此時(shí),low > high,退出 while ()循環(huán),查找不成功。退出while ()循環(huán)后,讓指針 low 回溯,即 low = Iow-I = 13-1 = 12, high =12,mid = (low+high)/2 = (12+12)/2 = 12, vbatt = 287 > batt_adc[12] = 285。因此,vbatt e (batt_adc [12], batt_adc[13]),返回 12,然后將 batt_volt [12] [I]這個(gè)值返回給上層,表示當(dāng)前充電已完成65%。最后,綜合上述兩種情況,通常待查找的vbatt e [batt_adc[i], batt_adc[i+l]),在該區(qū)間對(duì)應(yīng)了相應(yīng)的充電進(jìn)度數(shù)值。該結(jié)論表明,如果當(dāng)前充電電壓落在上述右開區(qū)間,那么將相應(yīng)的充電進(jìn)度數(shù)值batt_volt[i] [I]返回給上層顯示(其中i = 0,
1,2,. . . , N-1)。對(duì)于邊界值,如果vbatt < batt_adc
,則返回O給上層,表示當(dāng)前充電已完成0%;如果vbatt >= batt_adc[N_l],貝U返回100給上層顯示,表示當(dāng)前已充滿。上述實(shí)例增量為5%,即、15%、...這樣顯示。如果為了提高充電數(shù)字顯示精度,可以定義N的值為100,這樣可以1%、2%、3%、...這樣顯示。綜上所述,將上述方法運(yùn)用在充電管理中,能高效查找當(dāng)前電池充電電壓在充電電壓表中的相應(yīng)區(qū)間。從而,可以實(shí)時(shí)地?cái)?shù)字顯示當(dāng)前充電已完成多少,這樣就擁有了更友好的人機(jī)界面。雖然以上描述了本發(fā)明的具體實(shí)施方式
,但是本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,這些僅是舉例說明,本發(fā)明的保護(hù)范圍是由所附權(quán)利要求書限定的。本領(lǐng)域的技術(shù)人員在不背離本發(fā)明的原理和實(shí)質(zhì)的前提下,可以對(duì)這些實(shí)施方式做出多種變更或修改,但這些變更和修改均落入本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法,其特征在于,該方法包括以下步驟 S1、根據(jù)電池充電曲線得到一個(gè)靜態(tài)的充電電壓表; S2、在對(duì)電池充電時(shí),啟動(dòng)一個(gè)實(shí)時(shí)任務(wù),周期地讀取該電池的充電電壓; S3、在所述充電電壓表中用折半查找算法去查找所述電池的充電電壓,若查找成功,則執(zhí)行步驟s4,否則執(zhí)行步驟S5 ; S4、返回所述電池的充電電壓在所述充電電壓表中的位序; S5、讓查找指針回溯,得知所述電池的充電電壓在相應(yīng)的區(qū)間。
2.如權(quán)利要求I所述的一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法,其特征在于,所述靜態(tài)的充電電壓表是一個(gè)二維有序表。
3.如權(quán)利要求I所述的一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法,其特征在于,所述步驟S3包括以下步驟 S31、設(shè)置三個(gè)查找指針,分別為一有序表低位指針low、一有序表中位指針mid、一有序表高位指針high,并讓low值為O、high值為N-I,其中N為有序表的長度; S32、利用所述的三個(gè)查找指針在所述充電電壓表中采用所述折半查找算法查找所述電池的充電電壓值; S33、若查找成功,則執(zhí)行步驟S4,否則執(zhí)行步驟S5。
4.如權(quán)利要求I所述的一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法,其特征在于,所述步驟S4之后還包括將所述位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用。
5.如權(quán)利要求3所述的一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法,其特征在于,所述步驟S5包括以下步驟 S51、使所述有序表低位指針low值減一,然后使所述有序表中位指針mid值為所述有序表高位指針high值與所述有序表低位指針low值之和的一半; S52、比較所述有序表中位指針mid所指示元素值與所述電池的充電電壓值的大小,若所述有序表中位指針mid所指示元素值大于所述電池的充電電壓值,則執(zhí)行步驟S53,否則執(zhí)行步驟S54 ; S53、使所述有序表中位指針mid值減一然后將所述有序表中位指針mid所指不的位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用; S54、將所述有序表中位指針mid所指示的位序值在有序表中對(duì)應(yīng)的充電進(jìn)度數(shù)值返回給上層使用。
全文摘要
本發(fā)明公開了一種改進(jìn)的折半查找算法在充電管理中的應(yīng)用方法,該方法包括以下步驟S1、根據(jù)電池充電曲線得到一個(gè)靜態(tài)的充電電壓表;S2、在對(duì)電池充電時(shí),啟動(dòng)一個(gè)實(shí)時(shí)任務(wù),周期地讀取該電池的充電電壓;S3、在所述充電電壓表中用折半查找算法去查找所述電池的充電電壓,若查找成功,則執(zhí)行步驟S4,否則執(zhí)行步驟S5;S4、返回所述電池的充電電壓在所述充電電壓表中的位序;S5、讓查找指針回溯,得知所述電池的充電電壓在相應(yīng)的區(qū)間。本發(fā)明通過對(duì)折半查找算法進(jìn)行改進(jìn),并將改進(jìn)后的算法運(yùn)用在充電管理中,可以實(shí)時(shí)地?cái)?shù)字顯示當(dāng)前充電已完成多少,這樣就擁有了更友好的人機(jī)界面。
文檔編號(hào)H02J7/00GK102957178SQ20111024773
公開日2013年3月6日 申請(qǐng)日期2011年8月24日 優(yōu)先權(quán)日2011年8月24日
發(fā)明者張海斌 申請(qǐng)人:上海晨興希姆通電子科技有限公司