惊奇算法

Q1

https://www.zhihu.com/question/27547892?sort=created

有一个黑匣子,黑匣子里有一个关于 x 的多项式 p(x) 。我们不知道它有多少项,但已知所有的系数都是正整数。每一次,你可以给黑匣子输入一个整数,黑匣子将返回把这个整数代入多项式后的值。那么,最少需要多少次, 我们可以得到这个多项式每项的系数呢?


Q2

有n>2个交易员,他们想知道他们平均的薪水,但是又不想任何人知道自己的薪水。


Q3

Alice是色盲,她有两个球,外观完全一样,Bob告诉她这两个球颜色不同,问Bob怎么向Alice证明这俩球颜色不同?


Q4

判断两个图G和H是同构的是NP的,只要给出一组顶点的对应关系就可以多项式时间检验,Alice要给Bob证明这两个图是同构的但又不给出这组对应关系。


Q5

有个list,已知存在majority element,就是出现次数多余一半的元素,怎么把它找出来。比如 abaacbbacaa 中的a。 如果不知道list里面是不是有majority element,如果有就把它找出来,没有的话return none呢?

O(n)时间和constant memory。

算法很简单,开始记录0 遍历第i个元素时 ------如果当前记录的是0,那么记录(第i个元素,1) ------如果当前记录是(x,y) ------------如果当前元素是x,那么记录(x,y+1) ------------否则记录(x,y-1)(如果y-1=0,记为0)

在这个例子当中, abaacbbacaa,根据看到的元素我们记录 0->a->(a,1)->b->0 ->a->(a,1)->a->(a,2)->c->(a,1)->b->0 ->b->(b,1)->a->0 ->c->(c,1)->a->0 ->a->(a,1)

大概证明思路就是,按每次记录0划分成sub list,也就是ab,aacb,ba,ca,a,在除去最后一个的sub list的sub list当中,都没有majority element,(因为其中第一个元素刚好出现一半次数),又因为已知整个list存在majority element,那肯定就是最后一个sub list中的majority element,在这个例子就是a。

通过证明我们知道,如果不知道是否有majority element的话没啥区别,就是遍历两遍,第一遍一样,找出来唯一可能的candidate,第二遍count一下出现次数,判断是否真的是majority。

Q6

有一种玻璃杯质量确定但未知,需要检测。 有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎。 现给你两个杯子,问怎样检测出这个杯子的质量,即找到在哪一层楼刚好会碎?

每次扔的区间减少一层,这样做可以保证每个区间查找的最差次数是一样的。 假定第一步在15楼扔,没碎的话则下一步在29楼扔,没碎下一步在42楼扔....碎掉之后则在上一次没碎的楼层开始向上扔。那么最开始在哪一层开始扔呢?? 这里我们需要拿支笔算一下: x+(x-1)+(x-2)+...+2 >=100 求解出答案为14。

即最终给出的解决方案是: 最开始从14楼开始扔,没碎的话在27楼扔,再没碎的话在39楼扔.....一旦碎掉,则从上一次没碎的楼层逐层往上扔,即可快速确认杯子在哪一层刚好会碎掉。

这样的方法可以保证在最差的情况下也能在14次内找到楼层,平均需要的次数不到10次。

https://wenku.baidu.com/view/7c9de809581b6bd97f19ea72.html

你可能感兴趣的:(惊奇算法)