動態規劃的三要素:最優子結構,邊界和狀態轉移函數,最優子結構是指每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到(子問題的最優解能夠決定這個問題的最優解),邊界指的是問題最小子集的解(初始范圍),狀態轉移函數是指從一個階段向另一個階段過度的具體形式,描述的是兩個相鄰子問題之間的關系(遞推式)
公司主營業務:網站制作、網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。創新互聯是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創新互聯推出大觀免費做網站回饋大家。
重疊子問題,對每個子問題只計算一次,然后將其計算的結果保存到一個表格中,每一次需要上一個子問題解時,進行調用,只要o(1)時間復雜度,準確的說,動態規劃是利用空間去換取時間的算法.
判斷是否可以利用動態規劃求解,第一個是判斷是否存在重疊子問題。
爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1. ?1 階 + 1 階
2. ?2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1. ?1 階 + 1 階 + 1 階
2. ?1 階 + 2 階
3. ?2 階 + 1 階
分析:
假定n=10,首先考慮最后一步的情況,要么從第九級臺階再走一級到第十級,要么從第八級臺階走兩級到第十級,因而,要想到達第十級臺階,最后一步一定是從第八級或者第九級臺階開始.也就是說已知從地面到第八級臺階一共有X種走法,從地面到第九級臺階一共有Y種走法,那么從地面到第十級臺階一共有X+Y種走法.
即F(10)=F(9)+F(8)
分析到這里,動態規劃的三要素出來了.
邊界:F(1)=1,F(2)=2
最優子結構:F(10)的最優子結構即F(9)和F(8)
狀態轉移函數:F(n)=F(n-1)+F(n-2)
class Solution(object):
def climbStairs(self, n):
? ? """
? ? :type n: int
? ? :rtype: int
? ? """
? ? if n=2:
? ? ? ? return n
? ? a=1#邊界
? ? b=2#邊界
? ? temp=0
? ? for i in range(3,n+1):
? ? ? ? temp=a+b#狀態轉移
? ? ? ? a=b#最優子結構
? ? ? ? b=temp#最優子結構
? ? return temp
利用動態規劃的思想計算編輯距離。
編輯距離是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。通常來說,編輯距離越小,兩個文本的相似性越大。這里的編輯操作主要包括三種:
插入:將一個字符插入某個字符串;
刪除:將字符串中的某個字符刪除;
替換:將字符串中的某個字符替換為另外一個字符。
那么,如何用Python計算編輯距離呢?我們可以從較為簡單的情況進行分析。
當兩個字符串都為空串,那么編輯距離為0;
當其中一個字符串為空串時,那么編輯距離為另一個非空字符串的長度;
當兩個字符串均為非空時(長度分別為 i 和 j ),取以下三種情況最小值即可:
1、長度分別為 i-1 和 j 的字符串的編輯距離已知,那么加1即可;
2、長度分別為 i 和 j-1 的字符串的編輯距離已知,那么加1即可;
3、長度分別為 i-1 和 j-1 的字符串的編輯距離已知,此時考慮兩種情況,若第i個字符和第j個字符不同,那么加1即可;如果相同,那么不需要加1。
很明顯,上述算法的思想即為 動態規劃 。
求長度為m和n的字符串的編輯距離,首先定義函數——edit(i, j),它表示第一個長度為i的字符串與第二個長度為j的字符串之間的編輯距離。動態規劃表達式可以寫為:
if i == 0 且 j == 0,edit(i, j) = 0
if (i == 0 且 j 0 )或者 (i 0 且j == 0),edit(i, j) = i + j
if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + d(i, j) },當第一個字符串的第i個字符不等于第二個字符串的第j個字符時,d(i, j) = 1;否則,d(i, j) = 0。
def edit_distance(word1, word2):
len1 = len(word1)
len2 = len(word2)
dp = np.zeros((len1 + 1,len2 + 1))
for i in range(len1 + 1):
? ? dp[i][0] = i? ?
for j in range(len2 + 1):
? ? dp[0][j] = j
for i in range(1, len1 + 1):
? ? for j in range(1, len2 + 1):
? ? ? ? delta = 0 if word1[i-1] == word2[j-1] else 1
? ? ? ? dp[i][j] = min(dp[i - 1][j - 1] + delta, min(dp[i-1][j] + 1, dp[i][j - 1] + 1))
return dp[len1][len2]
edit_distance('牛奶','華西奶')
結果:2
1、點擊“開始”——“ArcGIS”——“ArcMap”,啟動ArcMap程序,并添加兩個點要素類到地圖上。
2、點擊“ArcToolbox”——“分析工具”——“鄰域分析”——“點距離”,打開點距離工具界面。
3、選擇輸入要素,即作為起點的要素類,可以選擇已添加到地圖上的要素類,也可以選擇外部要素類。
4、選擇鄰近要素,即作為終點的要素類,可以選擇已添加到地圖上的要素類,也可以選擇外部要素類。
5、選擇計算結果的存放位置和表名稱。
6、輸入搜索半徑,即要計算多大半徑范圍內的鄰近點要素之間的距離,可以為空,如果為空,則計算起點到鄰近要素類中所有點要素之間的距離。點擊“確定”,開始計算起點要素到鄰近要素之間的距離。
7、計算完成后,計算結果表會自動添加到地圖上,右鍵點擊結果表,點擊打開,可以查看計算結果。
import math
#定義點的函數
class Point:
def __init__(self,x=0,y=0):
self.x = x
self.y = y
#定義直線函數
def getlen(p1, p2):
#用math.sqrt()求平方根
len = math.sqrt(((p1.x - p2.x) ** 2) +((p1.y - p2.y) ** 2))
return self.len
#設置點p1的坐標
p1 = Point(0,0)
#設置點p2的坐標
p2 = Point(3,4)
#獲取兩點之間直線的長度
d =.getlen(p1, p2)
print(d)
import?math
class?Dot:
def?__init__(self,x,y,z):
self.x=float(x)
self.y=float(y)
self.z=float(z)???
t1=input('請輸入點t1的坐標:')
t2=input('請輸入點t2的坐標:')
t1=eval('[%s]'%t1)
t2=eval('[%s]'%t2)
T1=Dot(t1[0],t1[1],t1[2])
T2=Dot(t2[0],t2[1],t2[2])
print('點t1:',T1.x,T1.y,T1.z)
print('點t2:',T2.x,T2.y,T2.z)
s=math.sqrt((T1.x-T2.x)*(T1.x-T2.x)-(T1.y-T2.y)*(T1.y-T2.y)+(T1.z-T2.z)*(T1.z-T2.z))
print("兩點間的距離為:%s"%?s)
網站題目:python距離函數 python計算編輯距離
文章來源:http://m.newbst.com/article10/dogoddo.html
成都網站建設公司_創新互聯,為您提供手機網站建設、、網站建設、Google、微信小程序、軟件開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯