綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[原創] 二維搜尋法 實做 Sample

[複製連結] 查看: 970|回覆: 0|好評: 0
跳轉到指定樓層
樓主
jianrupan | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2015-9-25 09:14

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
問題說明:
a.      程式處理 程序過久,每處理 32768 byte 資料約需 10 秒,測試資料為 366548 Bytes,所以全部處理完成約需 110 秒。
修改說明:
a.      先執 排序(qsort ),再執行搜尋程序(MTSearch_SongNo),修改歌曲搜尋程序,改為 2維搜尋法,資料處理時間約需 6 秒。

//==================================================
// Function Name : Search
// 說明  : 搜尋在 buffer  的位置
// Writer : Jim
// Date  : 20131008
// Input : SS  : 比對字串
//          s_type: 搜尋法, 需先處理 排序
//          0 --> 循序搜尋法
//          1 --> 2維搜尋法
// Return : buffer 的位置, -1: 沒找到
//==================================================
int Search( char* SS, int s_type )
{
// 修改搜尋方式, 加速處理, 2維搜尋法
if( 1 == s_type )
{
  char tmp[10];
  unsigned int s_cnt = 0;
  int s_index = g_Total/2;
  int tmp_index = 0;
  int s_max = g_Total;
  int s_min = 0;
  int cmp_status = 0;
  int ret_val = -1;
  
  SSno[MAX_NO] = 0;
  // printf( "SSno: [%s] ", SS );
  
  // 限制搜尋次數
  while( s_cnt++ < g_Total )
  {
   memcpy( tmp, pIndex[s_index].No, MAX_NO );
   tmp[MAX_NO] = 0;
   
   // 比對編號
   cmp_status = strcmp( tmp, SS );
   // 找到
   if( cmp_status == 0 )
   {
    // printf( "Get No: %s ", tmp );
   
    // 回傳 song index
    ret_val = s_index;
    break;
   }
   // tmp > SS, index 往上移
   else if( cmp_status > 0 )
   {
    // printf( "tmp > SSn [%s], index: %d ", tmp, s_index );
   
    s_max = s_index;
    s_index -= ((s_index-s_min)/2);
   
    // printf( "tmp > SS: s_max: %d, s_min: %d, index: %d ", s_max, s_min, s_index );
   }
   // tmp < SS, index 往下移
   else if( cmp_status < 0 )
   {
    // printf( "tmp < SS: [%s], index: %d ", tmp, s_index );
   
    s_min = s_index;
    s_index += ((s_max-s_index)/2);
   
    // printf( "tmp < SSo: s_max: %d, s_min: %d, index: %d ", s_max, s_min, s_index );
   }
   
   // 超出索引範圍
   if( s_index < 0 )
    break;
   
   if( s_index >= (int)g_Total )
    break;
   
   // 若 Index 沒改變,表示沒找到
   if( tmp_index != s_index )
    tmp_index = s_index;
   else
   {
    // printf( "No Find: [%s], index: %d ", SS, s_index );
    break;
   }
  }
  
  return ret_val;
}
else
////////////////////////////
{
  unsigned int i=0;
  char tmp[10];
  
  SSno[MAX_NO]=0;
  // printf( "SS = [%s] ",SS );
  
  // 開始 Search
  for( i=0; i<g_Total; i++ )
  {
   if( pIndex[i].No[0]<0x30 ) //加快 Search 的速度
     continue;
   
   memcpy( tmp, pSIndex[i].No, MAX_NO );
   tmp[MAX_NO]=0;
   // printf( "tmp: %s ", tmp );
   if( strcmp(tmp,SS) == 0 )
   { //找到
    // printf( "Get Song: %s ", tmp );
    return i;
   }
  } //end for

  return -1;
}

return -1;
} //end Search

「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 1碎鑽 +1 幫助 +1 收起 理由
傻庭兒 + 1 + 1 非常讃

查看全部評分

收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則