欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++中提高查找速度的小技巧

 更新時間:2017年01月17日 10:37:16   作者:啊漢  
這篇文章主要給大家介紹了C/C++中提高數(shù)組中查找某個元素或者字符串中查找某個字符效率的小技巧,提高速度對我們?nèi)粘i_發(fā)來說還是很有用的,文中給出了詳細的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

當看到題目是在一個數(shù)組中查找某一個元素,或是在一個字符串中查找某個字符,我們一般都會寫出如下代碼。但這樣的代碼雖然簡潔明了,但在數(shù)組元素很多的情況下,并不是一個很好的解決方案,今天我就來分享一個提高查找速度的小技巧.

//在一個int數(shù)組中查找某個元素
int find(int A[],int n,int element)
{
 for( int i = 0; i < n; i++ )
 {
  if( A[i] == element )
   return i;
 }
 return -1;
}

//在一個字符串中查找某個字符
int find(string& str,char c)
{ 
 for( int i = 0; i < str.length(); i++ )
 {
  if( str[i] == c )
   return i;
 }
 return -1;
}

雖然每次都是寫出這樣的代碼,但我總覺得for循環(huán)中的<判斷有點多余,比如數(shù)組中有100個元素,我們明明知道前99個是不會數(shù)組越界的,根本不需要判斷i<n的,但我們卻多判斷了99次,昨天晚上看編程珠璣的時候發(fā)現(xiàn)了這個小技巧,今天就來分享一下。

通過哨兵的方式去掉這多余的判斷,將上面兩個方法改造如下:

//在一個int數(shù)組中查找某個元素
int find1(int A[],int n,int element)
{
 if( n <= 0 )
  return -1;
 if( A[--n] == element )
  return n;

 int hold = A[n];
 A[n] = element;
 int i = 0;
 for( ; ; i++ ) 
 {
  if( A[i] == element )
   break;
 }
 A[n] = hold;
 return i < n ? i : -1; 
}

//在一個字符串中查找某個字符
int find1(string& str,char c)
{ 
 int n = str.length();
 if( n <= 0 )
  return -1;
 if( str[--n] == c )
  return n;
 int hold = str[n];
 str[n] = c;
 int i = 0;
 for( ; ; i++ ) 
 {
  if( str[i] == c )
   break;
 }
 str[n] = hold;
 return i < n ? i : -1; 
}

我勒個去,怎么變得這么長,但的確是減少了判斷的次數(shù),如果數(shù)組較大的話提高運行速度肯定是一定的,如果你非要說數(shù)組很小的話,說不定速度還要降低呢,那你不這樣寫不就得了,好了廢話少說,雖然代碼已經(jīng)很簡單明了了,但我還是簡單說一下思路。

就是在數(shù)組的末尾加一個哨兵,即使不判斷i<n也能確保數(shù)組不越界,加了哨兵之后if語句是必然會break的。

先判斷最后一個元素的值是不是我們要查找的數(shù),如果是,返回其下標;如果不是,將最后一個數(shù)的值保存起來,將要查找的那個數(shù)賦給最后一個元素,循環(huán)查找指定的元素,不用判斷數(shù)組越界,if語句必然break,將最后一個元素的值還原,最后只用判斷i<n,如果是i即為所求,否則要查找的元素不在數(shù)組中。

最后在做一個簡單的性能測試,看到底能否提高查找速度。

測試代碼如下:

void testFind()
{
 int N = 200000;
 int* A = new int[N];
 A[N-2] = 1; 

 DWORD start = ::GetTickCount64();
 for( int i = 0; i < 10000; i++ ) 
  find(A,N,1);
 DWORD end = ::GetTickCount64();
 cout <<"優(yōu)化前:" << end - start <<" 毫秒" << endl; 

 start = ::GetTickCount64(); 
 for( int i = 0; i < 10000; i++ ) 
  find1(A,N,1);
 end = ::GetTickCount64();
 cout <<"優(yōu)化后:" << end - start <<" 毫秒" << endl; 
}

運行結果如下:

速度還是會快一點

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關文章

  • c++動態(tài)庫調用的實現(xiàn)

    c++動態(tài)庫調用的實現(xiàn)

    本文主要介紹了c++動態(tài)庫調用的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C++中malloc與free、new與delete的詳解與應用

    C++中malloc與free、new與delete的詳解與應用

    今天小編就為大家分享一篇關于C++中malloc與free、new與delete的詳解與應用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 用C語言實現(xiàn)猜數(shù)字

    用C語言實現(xiàn)猜數(shù)字

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)猜數(shù)字,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++函數(shù)指針詳解

    C++函數(shù)指針詳解

    這篇文章主要介紹了C++函數(shù)指針詳解,通過文字描述C++函數(shù)指針基礎概念,內(nèi)涵詳細的代碼實現(xiàn)和解析,希望對你能夠有所幫助
    2021-06-06
  • 使用C++調用Python代碼的方法詳解

    使用C++調用Python代碼的方法詳解

    這篇文章主要介紹了使用C++調用Python代碼并給大家介紹了.py和.pyc的區(qū)別,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • c語言中位字段與結構聯(lián)合的組合使用詳解

    c語言中位字段與結構聯(lián)合的組合使用詳解

    本篇文章是對c語言中位字段與結構聯(lián)合的組合使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C 語言基礎教程(我的C之旅開始了)[七]

    C 語言基礎教程(我的C之旅開始了)[七]

    C 語言基礎教程(我的C之旅開始了)[七]...
    2007-02-02
  • C語言程序中遞歸算法的使用實例教程

    C語言程序中遞歸算法的使用實例教程

    這篇文章主要介紹了C語言程序中遞歸算法的使用實例教程,遞歸經(jīng)常被用來進行階乘和比較大小等計算工作,文中舉的都是一些基礎的例子,需要的朋友可以參考下
    2016-04-04
  • C語言棧順序結構實現(xiàn)代碼

    C語言棧順序結構實現(xiàn)代碼

    一個能夠自動擴容的順序結構的棧 ArrStack 實例 (GCC編譯),有需要的朋友可以參考一下
    2013-10-10
  • 用C語言實現(xiàn)簡單五子棋小游戲

    用C語言實現(xiàn)簡單五子棋小游戲

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)簡單五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論