Python算法--计数初步

来源:互联网 发布:qt程序员常用单词 编辑:程序博客网 时间:2024/05/29 09:18

1.sum求和

>>> x=2>>> sum(x*y for y in range(1,101))10100>>> 5050*210100>>> sum(i for i in range(1,101))5050>>> sum(3+i for i in range(1,101))5350

>>> sum(3+i for i in range(1,101))+sum(4*i for i in range(1,101))25550>>> sum(3+i+4*i for i in range(1,101))25550


2.两种赛制的故事:

循环赛:每一个选手都会被安排轮流与其他人比上一回。问题,在n个骑士的格斗比赛中,需要安排多少配对或赛程呢?

对循环赛的理解,可以理解为开会的一群人中每个人都要和别人握手,或者完全图中的边的数量。



答案为n(n-1)/2,确实是:

其他思路:第一位骑士的对手数应该是n-1,第二位骑士的对手数就是n-2了。这样一直推下去,一直到最后那位骑士(他只剩下0场比赛和0个骑士对手了)这样,我们就可以得出它们的求和式:n-1+n-2+...+1+0=n(n-1)/2。若n=100,则需要

>>> sum(i for i in range(100))4950
这么多场比赛~~

淘汰赛:参赛者则通常是被安排成对比赛的,只有每对当中的赢者才能进入下一轮比赛。问题,对于n个骑士来说,我们需要多少轮比赛,需要进行多少场比赛?


2.龟兔赛跑:

淘汰赛:考虑,在首轮比赛中,由于所有骑士都要参与配对,所以应该会有n/2场比赛。而进入第二轮比赛的人数只有原来的一半,因而这一轮的比赛场次应该为n/4。如此以此类推下去,一直到最后一轮比赛,比赛的总场次应该合计为n/2+n/4+n/8+...+1

由于每一场比赛都会有一名骑士被淘汰,所以最终除冠军以外的所有人都会被淘汰(并且他们都是一次性淘汰),所以我们需要n-1场比赛来决定只留下哪一个人。

比赛结构如下图所示,这是一棵带跟的树结构,其每一片叶子是一个骑士,内部各节点(包括根节点)代表一场比赛。一共n个叶子和n-1个内部结点。


该比赛轮次的上限应为h-1(或者该二叉树的高度是h,所以2的h次方=n)

猜数游戏:

>>> from random import randrange>>> n=10**90>>> p=randrange(10**90)>>> p<n/2True>>> p<n/4False>>> n/4<p<3*n/8False>>> from math import log>>> log(n,2)298.9735285398626
p是未知的,让我们只能问问题,回答者只能回答yes/no。问多少个问题可以猜出p的大小。

我们可以持续成倍缩小其可选范围,大致在300个问题之内就能找到答案。

(这是一种所谓超理想对数算法的一个典型示例)

这其实是二分法或二分搜索法的一个实例,也是最重要、最知名的一种对数算法。


指数级算法的例子:

小麦与棋盘的问题:在棋盘的第一个方格放一颗小麦,第二个方格放两颗,第三个方格放四颗,以此类推,最后会有多少小麦呢?

一共有64个方格。最后一个方格中应该放2的63次方个。2的64次方–1 = 18,446,744,073,709,551,615。

从1到n的翻倍数与从n到1的减半数是相同的。