Python演算法 計數初步

2021-08-02 04:56:49 字數 1800 閱讀 4856

1.sum求和

>>> x=2

>>> sum(x*y for y in range(1,101))

10100

>>> 5050*2

10100

>>> 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-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

這麼多場比賽~~

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>> p>> n/4>> 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的減半數是相同的。

組合計數(初步)

組合數學主要是研究某組離散物件滿足一定條件的安排的存在性 構造及計數等問題。組合計數理論是組合數學中乙個最基本的研究方向,主要研究滿足一定條件的安排方式的數目及其計數問題。本課程主要介紹組合數學中常見的和重要的一些計數原理 計數方法和計數公式,包括一般的排列 組合的計算以及生成函式 容斥原理 反演原...

python演算法之計數比較

計數比較方式實現變位詞判斷 需求 比較兩個字串是否為變位詞 計數比較方式解題思路 對比兩個詞中每個字母出現的次數 如果26個字母出現的次數都相同 則兩個字串一定是變位詞 def count comparison s1,s2 c1 0 26 c2 0 26for i in range len s1 i...

python演算法總結(三) 計數排序

演算法的步驟如下 1 找出待排序的陣列中最大和最小的元素 2 統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項 3 對所有的計數累加 從c中的第乙個元素開始,每一項和前一項相加 4 反向填充目標陣列 將每個元素i放在新陣列的第c i 項,每放乙個元素就將c i 減去1 對於資料2 5 3 0...