iOS开发中使用算法之二分搜索算法

本人是一名iOS开发程序猿,说实话在之前的开发项目中并没有到多少算法,算法对于本人也可以说是个硬伤。最近在找工作,面试官就会提到一些算法,由于不常用算法也就很难很好地回答面试的问题。由于之前学习过C以及数据结构现在再看看一些常用算法还是能很快理解并掌握的,下面就说说常用的搜索算法--二分搜索算法

为什么要使用算法?

(个人愚见:iOS客户端开始主要是展示界面,将一些数据以界面的方式展示给用户,至于一些数据的处理已经在后台处理过了,我们是直接获取后台的数据的,而且OC是面向对象的,好多算法的东西也已经被某些方法封装了,如:在数组中插入某个位置插入一个元素,所以个人感觉iOS开发中使用算法的场景很少。当然这只是个人愚见,而且很可能被某些大神批判、不屑,而且这种想法很有可能被未来某天的自己所鄙视,但这种想法是现在的我的真实想法。)

使用算法是为了提高开发效率,突然想到之前看到的一副动态图,动态图分为两部分,上部分是一条狗叼着一根木棍往门里冲,可木棍的长度长于门的宽度,导致狗始终无法通过门,而且狗还在一直横冲直撞。下部分同样是一条狗叼着一根木棍往门里冲,可当狗发现木棍的长度长于门的宽度的时候,狗进行了几秒的“思考”,然后把脖子一歪,木棍也随然斜了,正好能让狗通过门。动态图的标题是“不会算法的程序员和会算法的程序员的区别”。动态图很搞笑,可揭露的问题却很深刻。不会算法的程序猿只会蛮干一起,最后可能也无法实现目的,即时实现了也算是暴力实现,效率并不怎么高,而这就是我们要学习使用算法的原因。

在没使用算法之前时间复杂度是O(N),而在使用算法之后,时间复杂度就变成了O(logN),大大节省了时间,提高了开发效率

二分搜索使用的前提是搜索的数据是有序的,如:升序。当然如果数据是无序的我们也可以先利用冒泡算法将无序的数据变成有序的数据,然后再利用二分搜索法进行搜索。

二分搜索的思路:首先我们需要获取三个值,分别是第一个数据、最后一个数据、中间数据。然后我们需要进行数据的比较,先比较中间值是否等于我们的目标值,如果中间值大于我们的目标值,我们则将中间值做为最后一个数据,如果中间值小于我们的目标值,我们则将中间值做为第一个数据,这样就出现了一串新的有序的数据,然后再比较目标值是否等于第一值和最后一个值,就这样进行循环,直到在搜索数据中找到目标值。

OC代码:

// 在某个数组中搜索目标

- (NSInteger)binarySearchTarget:(NSInteger)target inArray:(NSArray *)arr{

    if (arr.count <1) {

        return -1;

    }

    // 定义三个变量第一个值下标、中间值下标、最后一个值下标

    NSInteger start =0;

    NSInteger end = arr.count -1;

    NSInteger mind =0;

    // 进行循环

    while (start < end -1) {   // 数组中第一个对象和最后一个对象之前还有其他对象则进行循环

        mind = start + (end - start) / 2;   // (start + end) / 2;

        if ([arr[mind]integerValue]> target) {// 如果中间值大于目标值

            end = mind; // 中间值做为最后一个值,在前半段再进行相同的搜索

        }else{

            start = mind;

        }

    }

    if ([arr[start]integerValue] == target) { // 如果第一个值和目标值相等则获取第一个值的下标

        return start;

    }

    if ([arr[end]integerValue] == target) {   // 如果最后一个值和目标值想等则获取最后一个下标

        return end;

    }

    return -1;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鹏哥哥加密算法 如果对您有所帮助 请点进下面GitHub链接 送一颗宝贵的星星给我 // GitHub地址 https://github.com/penghero/PGGCrypto.git 超全的加密算法锦集 每个算法都进行了封装 都可以通过类方法直接进行创建使用 而且各个类方法都有详细的说明 使用时请仔细查看 1、AES加密(对称加密算法) AES加密(对称加密) 优点:简单、可并行计算、误差不传递 缺点:不能隐藏明文模式(比如图像加密轮廓仍在)、主动攻击(改明文,后续内容不影响,只要误差不传递该缺点就存在) 用途:需要并行加密的应用 AES加密算法是密码学的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。设计为支持128/192/256位(/32=nb)数据块大小(即分组长度);支持128/192/256位(/32=nk)密码长度,,在10进制里,对应34×1038、62×1057、1.1×1077个密钥 2、DES加密(对称加密解密) 3、RSA加密 (非对称加密) 包括.der和.p12文件加密解密,和公钥私钥字符串加密解密 特点 RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 4、MD5加密 MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。 全写: Message Digest Algorithm MD5(文名为消息摘要算法第五版) 输出: 128bit 特点: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 2、容易计算:从原数据计算出MD5值很容易。 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。 5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。 缺陷:Md5一度被认为十分靠谱。2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。2009年,冯登国、谢涛二人利用差分攻击,将MD5的碰撞算法复杂度从王小云的2^42进一步降低到2^21,极端情况下甚至可以降低至2^10。仅仅2^21的复杂度意味着即便是在2008年的计算机上,也只要几秒便可以找到一对碰撞。Md5已老, 在安全性要求较高的场合,不建议使用。 5、sha1加密(安全[哈希算法])只是叫做一种算法,用于检验数据完整性 全名: 安全哈希算法(Secure Hash Algorithm)输出: 160bit 与Md5比较 相同点: 因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似。 不同点: 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。 6、 HMAC加密消息摘要算法 我们通常在遇到的时候会看到“HMAC”字眼,mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。 7、HMACMD5加密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值