除法與GCD演算法的相關分析
學習演算法三個要素:
1、驗證演算法的正確性
2、分析演算法的效率
3、如何提高演算法的效率
以下是兩個算除法的“玩具”演算法,請驗證其正確性,分析它們的效率並進行對比,並思考是否可以進一步提高除法的效率。最後這個問題不容易。
def QuoRem(a, b):
q, r = 0, 0
while(a >= b):
a, q = a - b, q + 1
r = a
return q, r
def BinaryQuoRem(a, b):
if(a == 0):
return 0, 0
q, r = BinaryQuoRem(a // 2, b)
q, r = 2 * q, 2 * r
if(a & 1): #if a is an odd number
r = r + 1
if(r >= b):
r, q = r - b, q + 1
return q, r
GCD 與Binary GCD的對比
為什麼需要Binary GCD?
為什麼看上去Binary GCD更高效?
但是,Binary GCD真的更高效嗎?為什麼是,為什麼不是?
請分析下面這兩個演算法,並回答以上問題。
# Function to implement Euclidean Algorithm
def gcd(a, b):
while(b):
a, b = b, a % b
return a
# Function to implement Stein's Algorithm
def binary_gcd( a, b) :
# GCD(0, b) == b; GCD(a, 0) == a,
# GCD(0, 0) == 0
if (a == 0) :
return b
if (b == 0) :
return a
# Finding K, where K is the greatest
# power of 2 that divides both a and b.
k = 0
while(((a | b) & 1) == 0) :
a = a >> 1
b = b >> 1
k = k + 1
# Dividing a by 2 until a becomes odd
while ((a & 1) == 0) :
a = a >> 1
# From here on, 'a' is always odd.
while(b != 0) :
# If b is even, remove all factor of
# 2 in b
while ((b & 1) == 0) :
b = b >> 1
# Now a and b are both odd. Swap if
# necessary so a <= b, then set
# b = b - a (which is even).
if (a > b) :
# Swap u and v.
a, b = b, a
b = (b - a)
# restore common factors of 2
return (a << k)
總結
演算法分析實在是太難了!
參考文獻
1、對Binary GCD的分析
2、Recursive Binary GCD
3、快速乘法及其應用
2018.0518
相關文章
- 【演算法分析與設計】輾轉相除法演算法
- 輾轉相除法(歐幾里得演算法)(gcd)模板及其原理演算法GC
- 證明:輾轉相除法與更相減損術
- gcd與exgcdGC
- GCD原始碼原理分析GC原始碼
- Lca相關演算法演算法
- matlab相關性分析Matlab
- 陪玩原始碼,與時間、日期相關的程式碼分析原始碼
- Linux 檔案系統與日誌分析的相關知識Linux
- Java String的相關性質分析Java
- 與數學相關的類
- 輾轉相除法與更相減損術(求最大公約數)
- GCD與NSOperation之間的區別GC
- 轉錄組GO富集與微生物相關性分析Go
- 雙指標相關演算法指標演算法
- 一個與CONNECT BY相關的BUG
- python 計算矩陣的相關演算法Python矩陣演算法
- 最近學習了限流相關的演算法演算法
- 資料分析相關軟體
- 關於GCD多工處理GC
- JVM相關 - StackOverflowError 與 OutOfMemoryErrorJVMError
- GCD Inside: GCD 宏GCIDE
- HTTP與快取相關的頭部HTTP快取
- 湊個熱鬧-LayoutInflater相關分析
- HandlerThread解析以及相關問題分析thread
- 應用層相關協議分析協議
- SAP MM 採購訂單與相關合同的價格差異問題分析
- 奇怪的GCDGC
- 5G與WiFi6相愛相殺的關係WiFi
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- 【演算法】HashMap相關要點記錄演算法HashMap
- 優化學習率相關演算法優化演算法
- 關聯規則分析 Apriori 演算法 簡介與入門演算法
- CAP 與 Raft 相關知識Raft
- CSS與中文相關的一些特性CSS
- java與作業系統相關的操作Java作業系統
- 與堆和堆排序相關的問題排序
- 動態許可權相關的幾個庫分析