在乙個陣列中查詢某乙個元素,或是在乙個字串中查詢某個字元,我們一般都會寫出如下**。這樣的**雖然簡潔明瞭,但在陣列元素很多的情況下,並不是乙個很好的解決方案,今天我就來分享乙個提高查詢速度的小技巧.
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//在乙個int陣列中查詢某個元素
intfind
(inta[
],intn
,int
element
)
return-1
; }
//在乙個字串中查詢某個字元
intfind
(string
&str
,charc)
return-1
; }
雖然每次都是寫出這樣的**,但我總覺得for迴圈中的,昨天晚上看程式設計珠璣的時候發現了這個小技巧,今天就來分享一下。
通過哨兵的方式去掉這多餘的判斷,將上面兩個方法改造如下:
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//在乙個int陣列中查詢某個元素
intfind1
(inta[
],intn
,int
element)
a[n]
=hold;
return
ii:-1; }
//在乙個字串中查詢某個字元
intfind1
(string
&str
,charc)
str[n]
=hold;
return
ii:-1; }
我勒個去,怎麼變得這麼長,但的確是減少了判斷的次數,如果陣列較大的話提高執行速度肯定是一定的,如果你非要說陣列很小的話,說不定速度還要降低呢,那你不這樣寫不就得了,好了廢話少說,雖然**已經很簡單明瞭了,但我還是簡單說一下思路。
就是在陣列的末尾加乙個哨兵,即使不判斷i也能確保陣列不越界,加了哨兵之後if語句是必然會break的。
先判斷最後乙個元素的值是不是我們要查詢的數,如果是,返回其下標;如果不是,將最後乙個數的值儲存起來,將要查詢的那個數賦給最後乙個元素,迴圈查詢指定的元素,不用判斷陣列越界,if語句必然break,將最後乙個元素的值還原,最後只用判斷i,如果是i即為所求,否則要查詢的元素不在陣列中。
最後在做乙個簡單的效能測試,看到底能否提高查詢速度。
測試**如下:
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void
testfind()
執行結果如下:
速度還是會快一點
查詢語句優化
原查詢 select tid,fid,subject,author,authorid from dz forum thread where authorid in select uid from dz common member where groupid in 1,3,23 and datelin...
MYSQL查詢語句優化
一 日期查詢優化 在mysql中速度最慢的不是in查詢,而是date format以及from unixtime兩個函式的日期時間轉換,執行時間可能超過兩秒,造成 巨卡 用php的函式代替mysql的函式來完成將會大大的縮減時間 今日 from unixtime lastplaytime,y m d...
SQL查詢語句優化
sql查詢語句優化的使用方法 查詢語句的優化是sql效率優化的乙個方式,可以通過優化sql語句來盡量使用已有的索引,避免全表掃瞄,從而提高查詢效率。最近在對專案中的一些sql進行優化,總結整理了一些方法。1 在表中建立索引,優先考慮where group by使用到的字段。2 盡量避免使用selec...