检索算法 - 二分法

前言

从前端转型搞iOS近三年了,最近技术进阶很艰难,反思和整理之后,觉得是『内功』修炼不够,所以现在的我要忘掉所有招式,回归基本功的修炼,希望有缘看到本篇文章的大神,可以不吝指导,谢谢。

都说天下武功出少林,同样,所有的编程开发语言中万变不离其宗的应该就是算法和理论了,算法可算是程序的灵魂。

要想有个强大的灵魂,我打算重新修炼基本功——算法。

先从『二分法』开始:

算法原理

假设需要查找的值为x,检索的数组为array。

  1. 确定查找范围 from = 0,end = array.count - 1,计算中项 middle= (from + end) / 2。
  2. 若 array[middle] = x 或 from >= end, 则结束查找;否则,向下继续。
  3. 若 array[middle] < x, 说明待查找的元素值只可能在比中项元素大的范围内,则把 middle + 1 的值赋给from,并重新计算middle,转去执行步骤2;
  4. 若 array[middle] > x,说明待查找的元素值只可能在比中项元素小的范围内,则把 middle - 1 的值赋给end,并重新计算middle,转去执行步骤2。

适用范围

二分法是一种非常高效的数据查找算法,通常适用二分法的都有以下特征:

  1. 数据量大;
  2. 数据为有序的;
  3. 需要在大量数据中定位某个值或找出某个值的索引值;

运用

场景:在一个升序的数组 [21, 23, 25, 27, ... , 53 ]中获取 31 的索引值,如31不在数组中,则返回-1;

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *array = @[@11, @23, @29, @31, @33, @35, @37, @47, @71, @99];

    NSInteger key = 23;

    NSLog(@"key 在数组 array 中的索引是:%ld", [self getIndexOfKey:key atArray:array]);
}

- (NSInteger)getIndexOfKey: (NSInteger)key atArray: (NSArray *)array {

    NSInteger min = 0, mid = 0, max = array.count-1;

    while (min <= max) {
    
        mid = (min + max) / 2;
    
        if (key == [array[mid] integerValue]) {
        
            return mid;
        }
    
        else if (key > [array[mid] integerValue]) {
        
            min = mid + 1;
        }
    
        else if (key < [array[mid] integerValue]) {
        
            max = mid - 1;
        }
    }

    return -1;
}

https://baike.baidu.com/item/二分法查找/9751511?fr=aladdin
http://www.baike.com/wiki/二分法

你可能感兴趣的:(检索算法 - 二分法)