二、数据结构与算法--数组

来源:互联网 发布:淘宝vip报名入口 编辑:程序博客网 时间:2024/05/20 09:26

        数组有过工作经验的人应该都很熟悉了,对数组的排序操作无处不在。对于新手来说,简单讲,数组就是一些数据的集合。而我们经常会对数据进行操作,比如插入一条记录、删除一条记录、查找、排序

        插入:不用多说大家应该也可以想到,就是往一个数据集合里的固定位置上增加一条记录。

        查找:对于查找来说,就会可能遇到遍历,从头开始,一个一个做匹配,至少需要1次,而如果最多则需要N步,查找时间的算法的时间应该是N/2,

        删除:删除至少要先找到才能够进行删除,所以至少走了查找的时间,而且需要后边的依次往前移,否则下次删除还得做非空的判断,这样算来删除的时间需要N/2+N/2即N次

                   
不允许重复允许重复查找N/2N插入无比较一次无比较一次删除N/2次比较,N/2次移动N次比较,多于N/2次移动

这样可以试着去分析OC中array操作的次数。


介绍两种查找方法,线性查找和二分查找

那我们假设有一个有序的数组

线性查找,有序和无序数组一样,从第一个开始依次查找

二分查找,二分查找体现了有序数组的好处,比如让你找1-100之间的一个数,猜出来会告诉你比那个数大或小,或者对了,那为了最少的次数,一定先猜50,如果说大了,就说明在1-49之间,那下次就猜24,那最多也只需要7次就可以对了,是不是比线性的效率会高很多;

OC实现二分查找代码

   

 NSMutableArray* testArray = [NSMutableArrayarray]; //目标数组

    for (int i =1; i<=100; i++) {

        [testArray addObject:[NSNumbernumberWithInt:i]];

    }

    

    int find =30; //要找到的数字

    

    //===========二分查找=============

    int lower = [[testArrayobjectAtIndex:0]intValue];

    int upper = [[testArrayobjectAtIndex:testArray.count-1]intValue];

    int count =0; //记录一共查找了多少次

    while (1) {

        count ++;

        int between = (lower + upper) /2;

        if (lower > upper) {

            NSLog(@"--------no search result-------");

            break;

        } elseif (find == between) {

            NSLog(@"--------search count:%d",count);

            break;

        } elseif (find > between) {

            lower = between +1;

        } elseif (find < between) {

            upper = between - 1;

        }

    }

二分查找:与log(N)成正比

0 0