咱們在一個數組中想查找某個對象item咱們改如何操做呢?很簡單一層遍歷就能夠搞定了,以下:python
- (NSInteger)searchNormal:(NSArray *)array item:(NSString *)item{
for(int i = 0;i<array.count;i++){
if(array[i] == item){
return i;
}
}
return -1;
}
複製代碼
可是咱們有沒有更優的算法來查找呢?git
在數據結構的書中咱們能夠找到「哨兵查找法」,可是什麼又是「哨兵查找法」呢?什麼又是「哨兵」呢?github
所謂「哨兵」就是用一個特殊的值來做爲數組的邊界key,能夠少用一條判斷語句,目的在於免去查找過程當中每一步都要檢測整個表是否查找完畢,以達到提升程序的效率。算法
相對於一層遍歷,沒有使用」哨兵「的,是有兩個判斷條件的i<array.count和if(array[i] == item);可是使用了」哨兵「只有一個判斷條件if(array[i] == item)!swift
若是你的數據量很是小的話,相對於一層遍從來說,差異微乎其微,可是當數據達到十萬或者更多的時候,函數的執行時間就會有明顯差距了!數組
咱們能夠將數組的第一個值做爲」哨兵「,數據存儲下標index從1開始,則list的0號位表示暫無元素,位」哨兵「Key。bash
- (NSInteger)searchItemFromArray:(NSArray *)array item:(NSString *)item{
NSMutableArray *muArray = array.mutableCopy;
if(muArray == nil || muArray.count <= 0){
return -1;
}
NSInteger index = muArray.count - 1;
NSString *firstItem = [muArray firstObject];
if(firstItem == item){
//若是第一個元素等於查找值,直接返回
return 0;
}
//把要查找的值放在數組的第一位上,做爲【標兵】
muArray[0] = item;
while (muArray[index] != item) {
index --;
}
//查找結束,把數組的首位元素改回來
muArray[0] = firstItem;
return index > 0 ? index : -1;
}
複製代碼
func searchItemFromArray(_ array: Array<String>, item: String) -> NSInteger {
var array = array
if array.count == 0{
return -1
}
var index = array.count - 1
let firstItem = array.first
if firstItem == item{
//若是第一個元素等於查找值,直接返回
return 0
}
//把要查找的值放在數組的第一位上,做爲【標兵】
array[0] = item
while array[index] != item {
index -= 1
}
//查找結束,把數組的首位元素改回來
array[0] = firstItem!
return index > 0 ? index : -1
}
複製代碼
def searchItemFromArray(array, item):
if len(array) == 0:
return -1
index = len(array) - 1
firstItem = array[0]
if firstItem == item:
# 若是第一個元素等於查找值,直接返回
return 0
# 把要查找的值放在數組的第一位上,做爲【標兵】
array[0] = item
while array[index] != item:
index -= 1
# 查找結束,把數組的首位元素改回來
array[0] = firstItem
return index if(index > 0) else -1
複製代碼
好比數組中有一千個元素,我查找中間那個元素,運行結果以下:數據結構
2019-10-21 20:52:41.415488+0800 OC_DEMO[86929:3800608] 500
2019-10-21 20:52:41.415618+0800 OC_DEMO[86929:3800608] 普通查找耗時: 0.148964 ms
2019-10-21 20:52:41.415716+0800 OC_DEMO[86929:3800608] 500
2019-10-21 20:52:41.415792+0800 OC_DEMO[86929:3800608] 標兵查找耗時: 0.082257 ms
複製代碼
歡迎各位大神提出寶貴的意見和建議,也歡迎你們進羣交流365152048!函數
CSDN博客 | zfj1128.blog.csdn.net |
---|---|
GITEE主頁 | gitee.com/zfj1128 |
GITHUB主頁 | github.com/zfjsyqk |