编程珠玑 啊哈 算法

看起来很困难的问题也可以有一个简单的、意想不到的答案
##二分搜索
在程序设计中,二分搜索最常见的应用是在有序数组中搜索元素。顺序搜索在搜索一个具有n个元素表时,平均需要n/2次比较,而二分搜索仅仅进行不超过 l o g 2 n log_2n log2n次比较就可以完成。
###问题A
分析问题A,最多40亿个数据:暗示了至少缺一个整数;仅有几百个字节暗示了不能使用第一章介绍的位图算法(当然你使用n趟算法也不是很合理,因为需要几十万趟…)。
解决该问题需要明确的点:为了使用二分搜索技术,我们就必须:

  • 定义一个范围:包含至少一个缺失元素的一系列整数
  • 在该范围内表现元素的方式:文件
  • 确定哪一半范围存在缺失整数的探测方法:统计中间点之上和之下的元素来探测范围
    二分搜索应用广泛:求根程序使用二分搜索技术;树数据结构;程序调试
    ##旋转操作
    ###问题B
    该问题的旋转操作对应于交换相邻的不同大小的内存块。该问题有以下几种解决方案:
  • solution1:将x的前i个元素复制到临时数组里,这种方法产生了过大的存储空间的消耗。
  • solution2:定义一个函数将x向左旋转一个位置(满足时间正比于n)然后调用函数i次,这种方法产生了过多的运行时间消耗。

但是要想在有限的资源里面解决该问题,显然需要更复杂的程序。有以下几个思路:

  • solution1:移动x[0]到临时变量t,然后移动x[i]到x[0],x[2i]到x[i],依此类推,直至返回到取x[0]中的元素,此时改为从t取值然后终止。然后从x[1]继续重复上述步骤,知道x[i-1]。
  • solution2:将旋转向量x分为两个向量ab,需要的是得到ba。假设a比b短,将b分为 b l b_l bl b r b_r br,使得 b r b_r br与a具有相同长度。交换a和 b r b_r br,得到 b r b l a b_rb_la brbla。再交换 b r b l b_rb_l brbl,所以采用迭代的思想,迭代的结束条件是 b r b_r br b l b_l bl任意一个长度为0。
  • solution3:假定我们拥有一个函数可以将数组特定部分的元素求逆。从ab开始,首先对a求逆得到 a r b a^rb arb,然后对b求逆得到 a r b r a^rb^r arbr。最后整体求逆,得到 ( a r b r ) r (a^rb^r)^r (arbr)r
    ##排序
    ###问题C
    这个判断单词是否是变位词,比较普遍。而且解决这个问题的许多方法都出奇地低效和复杂。我们分析问题,发现,要解决这个问题,可以先使得相同变位词有相同的标识。然后再集中具有相同标识的单词。要解决第一个问题可以将单词中的字母排序作为标识。要解决第二个问题,就是将所有的单词按照其标识的顺序排序。
    ##习题
    没有难以理解的
本书的目标读者是准备去硅谷找工作的码农,也适用于在国内找工作的码农,以及刚接触ACM算法竞赛的新手。 市场上讲解算法的书已经汗牛充栋,为什么还要写这本书呢?主要原因是我对目前市场上的大部分算法书都不太满意。 本书有如下特色: 背后有强大的AlgoHub支持。 本书的所有题目,都可以在 www.algohub.org(即将上线) 上在线判断代码。这样的一大好处是,读者可以边看书,边实现自己的代码,然后提交到网站上验证自己的想法是否正确。AlgoHub的使命是成为最好的算法学习和交流平台。AlgoHub囊括了 POJ, ZOJ, leetcode, HackerRank 等网站的经典题目(一些质量不高的题目则忽略),且 AlgoHub有非常简单的加题系统,用户不需要写一行代码即可自己添加题目,所以AlgoHub的题库还在飞速增长中。 每道题都有完整的代码。 市场上的大部分书,都会讲思路,但给出的代码都是片段,不是完整可编译的代码。本书每题都有完整的代码,且每个代码经过千锤百炼,保证可读性的前提下尽可能简短,方面读者在面试中能快速写出来。 每道题都有多种解法。 本书的宗旨是,用尽可能少的题目,覆盖尽可能多的算法。本书中的的每道题都有多种解法,每种解法不是简单的小改进,而是完全不同的思路,力求举一反三,让读者触类旁通。 本书支持多种主流编程语言。 目前支持 Java, C++, C#, Python, Ruby, JavaScript, Swift, Scala, Clojure, 将来还会支持更多编程语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roaring Kitty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值