優化遍歷查詢語句(程式設計珠璣)

2021-07-25 21:47:57 字數 2611 閱讀 2673

在乙個陣列中查詢某乙個元素,或是在乙個字串中查詢某個字元,我們一般都會寫出如下**。這樣的**雖然簡潔明瞭,但在陣列元素很多的情況下,並不是乙個很好的解決方案,今天我就來分享乙個提高查詢速度的小技巧.

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...