摘要:出現(xiàn)這個問題原因就處在這個取整的操作他不是我們理解的四舍五入,而是簡單的截取整數(shù)部分。上面的例子修改為運行后輸出為所以上面的二分查找也就可以修改成為了實現(xiàn)四舍五入加上一個這樣解決了二分查找中的這個小問題。
在看算法圖解的過程了解到了很多算法的知識,但在中間也遇到了一個小問題。
下面我們就看一下這個小問題時怎么解決的。
下面是書中的源碼:
def binary_search(list, item): low = 0 high = len(list) while low <= high: mid = (low + high) / 2 guess = list[mid] if guess == item: return mid if guess > item: high = mid - 1 else: low = mid - 1 return None
當(dāng)我們用下面的數(shù)據(jù)運行時:
list = [1, 2, 3, 4, 5] item = 3 position = binary_search(list, item) print(position)
會導(dǎo)致如下錯誤:
Traceback (most recent call last): File "binary_search.py", line 17, inposition = binary_search(list, item) File "binary_search.py", line 6, in binary_search guess = list[mid] TypeError: list indices must be integers or slices, not float
上面信息的意思是索引類型錯誤,索引必須為整型而不是float型。
這是因為python中除法即“/”會自動轉(zhuǎn)換類型。將無法整除的數(shù)字轉(zhuǎn)換成浮點型。
下面是我一開始想到的解決辦法:
def binary_search(list, item): low = 0 high = len(list) while low <= high: mid = int((low + high) / 2) # 將結(jié)果加一個類型轉(zhuǎn)換即可 guess = list[mid] if guess == item: return mid if guess > item: high = mid - 1 else: low = mid - 1 return None
但當(dāng)使用下面的數(shù)據(jù)進行測試時:
list = [1, 2, 3, 4, 5] item = 5 position = binary_search(list, item) print(position)
結(jié)果就是循環(huán)不會停止了。
為了找到問題出在哪里。我們在循環(huán)體中加一個pirnt語句輸出一下mid
def binary_search(list, item): low = 0 high = len(list) while low <= high: mid = int((low + high) / 2) # 將結(jié)果加一個類型轉(zhuǎn)換即可 print(mid) guess = list[mid] if guess == item: return mid if guess > item: high = mid - 1 else: low = mid - 1 return None
還是使用上面的數(shù)據(jù)運行一下。
可以在終端中看到一直在循環(huán)輸出3。
出現(xiàn)這個問題原因就處在int() 這個取整的操作他不是我們理解的四舍五入,而是簡單的截取整數(shù)部分。
看下面的例子。
a = 5.4 b = 5.5 c = 5.6 print(int(a)) print(int(b)) print(int(c))
運行后輸出為:
5 5 5
為了解決這個問題我們只需要給要取整的數(shù)加一個0.5即可。
上面的例子修改為:
a = 5.4 b = 5.5 c = 5.6 print(int(a + 0.5)) print(int(b + 0.5)) print(int(c + 0.5))
運行后輸出為:
5 6 6
所以上面的二分查找也就可以修改成:
def binary_search(list, item): low = 0 high = len(list) while low <= high: mid = int((low + high) / 2 + 0.5) # 為了實現(xiàn)四舍五入加上一個0.5 guess = list[mid] if guess == item: return mid if guess > item: high = mid - 1 else: low = mid - 1 return None
這樣解決了二分查找中的這個小問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43798.html
摘要:但是在轉(zhuǎn)化中,浮點數(shù)轉(zhuǎn)化為二進制后,不會精確等于十進制的。一般情況下,只要簡單地將最終顯示的結(jié)果用四舍五入到所期望的十進制位數(shù),就會得到期望的最終結(jié)果。四舍五入內(nèi)建函數(shù)。在中的第二個數(shù),表示要保留的小數(shù)位數(shù),返回值是一個四舍五入之后的數(shù)值。 數(shù)字 基本類型 首先,進入Python交互模式中: //整數(shù) >>> 3 3 //長整數(shù) >>> 3333333333333333333333...
摘要:數(shù)據(jù)科學(xué)其實就是機器學(xué)習(xí),數(shù)據(jù)分析和數(shù)據(jù)可視化。機器學(xué)習(xí)通過實現(xiàn)算法,該算法能夠自動檢測輸入中的模式。一般應(yīng)用于人臉識別語音識別熱門機器學(xué)習(xí)算法包括神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)支持向量機隨機森林進行數(shù)據(jù)分析可視化進行數(shù)據(jù)可視化時,是非常熱門的庫。 ...
摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲存空間小) 無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...
摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲存空間小) 無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...
摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲存空間小) 無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...
閱讀 1682·2019-08-30 15:54
閱讀 3332·2019-08-26 17:15
閱讀 3522·2019-08-26 13:49
閱讀 2582·2019-08-26 13:38
閱讀 2291·2019-08-26 12:08
閱讀 3034·2019-08-26 10:41
閱讀 1368·2019-08-26 10:24
閱讀 3375·2019-08-23 18:35