前言
當看到題目是在乙個陣列中查詢某乙個元素,或是在乙個字串中查詢某個字元,我們一般都會寫出如下**。但這樣的**雖然簡潔明瞭,但在陣列元素很多的情況下,並不是乙個很好的解決方案,今天我就來分享乙個提高查詢速度的小技巧.
//在乙個int陣列中查詢某個元素
int find(int a,int n,int element)
return -1;
}//在乙個字串中查詢某個字元
int find(string& str,char c)
return -1;
}雖然每次都是寫出這樣的**,但我總覺得for迴圈中的判斷有點多餘,比如陣列中有100個元素,我們明明知道前99個是不會陣列越界的,根本不需要判斷i程式設計珠璣的時候發現了這個小技巧,今天就來分享一下。
通過哨兵的方式去掉這多餘的判斷,將上面兩個方法改造如下:
//在乙個int陣列中查詢某個元素
int find1(int a,int n,int element)
a[n] = hold;
return i < n ? i : -1;
}//在乙個字串中查詢某個字元
int find1(string& str,char c)
str[n] = hold;
return i < n ? i : -1;
}我勒個去,怎麼變得這麼長,但的確是減少了判斷的次數,如果陣列較大的話提高執行速度肯定是一定的,如果你非要說陣列很小的話,說不定速度還要降低呢,那你不這樣寫不就得了,好了廢話少說,雖然**已經很簡單明瞭了,但我還是簡單說一下思路。
就是在陣列的末尾加乙個哨兵,即使不判斷i
先判斷最後乙個元素的值是不是我們要查詢的數,如果是,返回其下標;如果不是,將最後乙個數的值儲存起來,將要查詢的那個數賦給最後乙個元素,迴圈查詢指定的元素,不用判斷陣列越界,if語句必然break,將最後乙個元素的值還原,最後只用判斷i
最後在做乙個簡單的效能測試,看到底能否提高查詢速度。
測試**如下:
void testfind()
{ int n = 200000;
int* a = new int[n];
a[n-2] = 1;
dword start = ::gettickcount64();
for( intwww.cppcns.com i = 0; i < 10000; i++ )
find(a,n,1);
dword end = ::gettickcount64();
cout 程式設計客棧< endl;
start = ::gettickcount64();
for( int i = 0; i < 10000; i++ )
find1(a,n,1);
end = ::gettickcount64();
cout <
執行結果如下:
速度還是會快一點
總結本文標題: c/c++中提高查詢速度的小技巧
本文位址: /ruanjian/c/177107.html
提高網頁速度小技巧
網際網路頻寬越來越寬,似乎讓網頁的載入速度得到了質的飛躍。其實不然,因為隨著頻寬的提高,網頁上的物件也越來越多,因此加快網頁開啟速度還是乙個重要的課題。加快網頁的開啟速度,有三個路徑,一是提高網路頻寬,二是使用者在本機做優化,三是 設計者對網頁做一定的優化。這篇文章站在乙個 設計者的角度,分享一些優...
乙個提高查詢速度的小技巧
在乙個陣列中查詢某乙個元素,或是在乙個字串中查詢某個字元,我們一般都會寫出如下 這樣的 雖然簡潔明瞭,但在陣列元素很多的情況下,並不是乙個很好的解決方案,今天我就來分享乙個提高查詢速度的小技巧.在乙個int陣列中查詢某個元素 int find int a,int n,int element retu...
Qt中提高sqlite的讀寫速度
sqlite資料庫本質上來講就是乙個磁碟上的檔案,所以一切的資料庫操作其實都會轉化為對檔案的操作,而頻繁的檔案操作將會是乙個很好時的過程,會極大地影響資料庫訪問的速度。例如 向資料庫中插入100萬條資料,在預設的情況下如果僅僅是執行query.exec insert into database va...