部分匹配算法

来源:互联网 发布:埃文斯新秀赛季数据 编辑:程序博客网 时间:2024/06/05 01:10

/*部分匹配num*/
BYTE CSubData::SubDataMatchByCallingNum(BYTE *callingnum, WORD *pwPos)
{
    int         wFront, wRear,wPos;
 int         wNextFindPos;

 int   matchCount = 0;

 char        sTmpNum[BCD_MAX*2+1];
    char        sCompNum[BCD_MAX*2+1];

 BYTE        tmpnum[BCD_MAX];/*BCD 格式*/
 CString     sNum;

 BCD2Str(sTmpNum,callingnum,BCD_MAX);
 sNum=(CString)sTmpNum;
    WORD  wLen=(WORD)sNum.GetLength();

    if(m_wSubDataCount == 0)
        return FALSE;

    for (int i = 0 ; i < wLen ; i++)
    {
     memset((void *)sCompNum,(int)0,BCD_MAX*2+1);
  memcpy(sCompNum,sTmpNum,wLen-i);
  memset(tmpnum,int(0),sizeof(BCD_MAX));
        AfxStr2BCD(tmpnum,sCompNum,BCD_MAX);
        wFront = 0;
        wRear = m_wSubDataCount - 1;
        wPos = wFront;
  wNextFindPos = wPos;
  while(wFront <= wRear)
  {
   wCycleCount ++;
   wPos = (wFront + wRear) >> 1;
            if (MatchingNum(tmpnum,m_SubDataUnit[wPos].callingnum) == 0)
   {
    //modify by cx 08/06/23
    wNextFindPos=(WORD)wPos; 
    while ((wPos<=wRear)&&(matchCount<=MAX_MATCH_COUNT))
    {
       /*wNextFindPos=(WORD)wPos;  //找到第一个匹配的号码后,继续找到一个不匹配的号码的前一匹配号码,即是最大的匹配号码
     wPos = wPos+1;
     if (MatchingNum(tmpnum,m_SubDataUnit[wPos].callingnum)!=0)
     {
      break;
     }*/

       matchCount = matchCount + 1;
     wPos = wPos+1;
     
     //找到第一个匹配的号码后,继续找到下一个匹配的号码,直到达到上限,此时匹配号码视为最大匹配号码  
     if (MatchingNum(tmpnum,m_SubDataUnit[wPos].callingnum) == 0)
     {
      wNextFindPos=(WORD)wPos; 
     }
    }
    
    *pwPos = (WORD)wNextFindPos;
    return TRUE;
   }

   if ((wRear-wFront)==1)   //当队头和队尾只差1时,队尾也要比较,否则有可能数据匹配不到。2004/05/22 llj
   {
    if (MatchingNum(tmpnum,m_SubDataUnit[wRear].callingnum)==0)
    {
     *pwPos = (WORD)wRear;
     return TRUE;
    }
   }
         if (MatchingNum(tmpnum,m_SubDataUnit[wPos].callingnum) > 0)
      {
       wFront = wPos + 1;
   }
   else
   {
    wRear = wPos - 1;
   }
     }
 } //end for
    return FALSE;
}

原创粉丝点击