用python,比較pow的實現演算法
主要對比遞迴和while迴圈。powcircle2函式和powcircle類似,powcircle2更容易理解一些。
from time import ctime
from math import
*def
powrecursion
(x,y):if
(y==0)
:return1if
(y==1)
:return x
t = powrecursion(x,
(int
)(y /2)
)if y&1==
1:return x * t * t
else
:return t * t
defpowcircle
(x,y)
: r=1if
(y&1==1
):r=x
y=y-
1 y = y>>
1while y>0:
x = x*x
y = y >>
1return r*x
defpowcircle2
(x,y)
: r=1if
(y&1==1
):r=x
y=y-
1 i=
2while ix = x*x
i = i*
2return r*x
defpowinternet
(a, b)
: r =
1while b >1:
if b &1==
1:#與運算一般可以用於取某位數,這裡就是取最後一位。
r *= a
a *= a
b = b >>
1#這裡等價於b//=2
return r * a
x =9
y =9
count=
5000000
defmain_recursion()
:print
('%s main_recursion start'
% ctime())
for i in
range
(count)
: powrecursion(x, y)
print
('%s main_recursion end\n'
% ctime())
defmain_pow()
:print
('%s main_pow start'
% ctime())
for i in
range
(count)
:pow
(x, y)
print
('%s main_pow end\n'
% ctime())
defmain_circle()
:print
('%s main_circle start'
% ctime())
for i in
range
(count)
: powcircle(x, y)
print
('%s main_circle end\n'
% ctime())
defmain_circle2()
:print
('%s main_circle2 start'
% ctime())
for i in
range
(count)
: powcircle2(x, y)
print
('%s main_circle2 end\n'
% ctime())
defmain_internet()
:print
('%s main_internet start'
% ctime())
for i in
range
(count)
: powinternet(x, y)
print
('%s main_internet end\n'
% ctime())
if __name__==
'__main__'
:print
('powrecursion(x, y)'
,powrecursion(x, y)
)print
('pow(x, y)'
,pow
(x, y)
)print
('powcircle(x, y)'
, powcircle(x, y)
)print
('powcircle2(x, y)'
, powcircle2(x, y)
)print
('powinternet(x, y)'
, powinternet(x, y)
) main_recursion(
) main_pow(
) main_circle(
) main_circle2(
) main_internet(
)
powrecursion(x, y) 387420489
pow(x, y) 387420489.0
powcircle(x, y) 387420489
powcircle2(x, y) 59049
powinternet(x, y) 387420489
fri sep 11 17:31:39 2020 main_recursion start
fri sep 11 17:31:46 2020 main_recursion end
fri sep 11 17:31:46 2020 main_pow start
fri sep 11 17:31:47 2020 main_pow end
fri sep 11 17:31:47 2020 main_circle start
fri sep 11 17:31:50 2020 main_circle end
fri sep 11 17:31:50 2020 main_circle2 start
fri sep 11 17:31:52 2020 main_circle2 end
fri sep 11 17:31:52 2020 main_internet start
fri sep 11 17:31:56 2020 main_internet end
1、遞迴的函式呼叫要消耗時間,比while要慢
2、python內部的pow介面最快,待進一步研究?!
pow x,y 函式的實現演算法
函式pow x,y 實現運算x y,即x的y次方,這裡x和y都為整數。這裡有演算法的原理剖析 演算法的基本思想是,減少乘法次數,重複利用結算結果,例如 x 4,如果逐個相乘的話,需要四次乘法。如果我們這樣分解 x 2 x 2 就只需要2兩次乘法,因為x 2的結果我們可以重複利用。所以我們最好做對稱的...
文字比較演算法的實現
這段時間很忙,呵呵,沒時間寫blog。前兩天看了乙個文字比較的演算法,演算法的思路我就不多說了,主要說下我的實現。演算法參考 文字比較演算法剖析 1 如何確定最大匹配率 文字比較演算法剖析 2 如何確定最優匹配路徑 我的實現步驟是 1 計算出所有可行的路徑 如下圖中,n l,r 所在的位置如果該位置...
幾種排序演算法的實現與比較
排序演算法比較 利用隨機函式產生n個隨機整數,利用直接插入排序 折半插入排序,起泡排序 快速排序 選擇排序 堆排序,基數排序七種排序方法進行排序 結果為由小到大的順序 並比較次數和交換次數。這裡是源 include using namespace std include include includ...