算法-哨兵查找法(OC、Swift、Python)

在這裏插入圖片描述

前言

咱們在一個數組中想查找某個對象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

OC代碼

- (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;
}
複製代碼

Swift代碼

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
    }
複製代碼

Python代碼

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
相關文章
相關標籤/搜索