二叉搜尋樹中的搜尋
阿新 • • 發佈:2020-08-14
利用問題的普遍性和特殊性來求解,
程式碼如下:
importunittest
fromdatetime importdatetime
classGetFreqNumbersFromList(unittest.TestCase):
defsetUp(self):
print("\n")
self.start_time =datetime.now()
print(f"{self._testMethodName} start: {self.start_time}")
deftearDown(self):
self.end_time =datetime.now()
print(f"{self._testMethodName} end: {self.end_time}")
exec_time =(self.end_time -self.start_time).microseconds
print(f"{self._testMethodName} exec_time: {exec_time}")
defnormal_solution(self, _list, _debug=False):
"""
普遍性解法
利用字典記錄每個元素出現的次數——然後找出元素出現次數超過陣列長度一半的元素
普遍性解法針對任何次數的統計均適用而不光只是針對出現次數超過陣列長度一半的情況
"""
_target =len(_list) //2
_dict ={}
for_member in_list:
if_member notin_dict:
_dict.setdefault(_member, 1)
else:
_dict[_member] +=1
_ret =[_member for_member in_dict if_dict[_member] > _target]
if_debug:
print(_ret)
return_ret
defspecific_solution(self, _list, _debug=False):
"""
特殊性解法
假設有兩個元素出現的次數都超過陣列長度一半就會得出兩個元素出現的次數超出了陣列長度的矛盾結果——所以超過陣列長度一半的元素是唯一的
排序後在陣列中間的一定是目標解
特殊性解法只能針對元素出現次數超過陣列長度一半的情況
"""
_list.sort()
if_debug:
print(_list[len(_list) //2])
return_list[len(_list) //2]
deftest_normal_solution(self):
actual_result =self.normal_solution([2,2,2,2,2,2,1,1,1,1,1], False)
self.assertEqual(actual_result[0], 2)
deftest_specific_solution(self):
actual_result =self.specific_solution([2,2,2,2,2,2,1,1,1,1,1], False)
self.assertEqual(actual_result, 2)
if__name__ =="__main__":
# 找出出現次數超過陣列長度一半的元素
suite =unittest.TestSuite()
suite.addTest(GetFreqNumbersFromList('test_normal_solution'))
suite.addTest(GetFreqNumbersFromList('test_specific_solution'))
runner =unittest.TextTestRunner()
runner.run(suite)
測試結果:
補充知識:Python 用積分思想計算圓周率
早上起來突然想求圓周率,1單位時圓的面積。
程式碼如下:
frommath importpow, sqrt
defcalc_circle_s_with(r, dy, x_slices):
x_from_start_to_cc =sqrt(1-pow(dy, 2))
dx =x_from_start_to_cc /x_slices
x_to_edge =1-x_from_start_to_cc
quarter_circle_s =0
whilex_to_edge < 1:
rect_s =dy *dx
quarter_circle_s +=rect_s
x_to_edge =x_to_edge +dx
dy =sqrt(1-pow((1-x_to_edge), 2))
circle_s =4*quarter_circle_s
print(circle_s)
calc_circle_s_with(1, 0.0001, 10000000)
執行結果接近3.1415926,dy傳的越小,x_slices傳的越大,就越接近。
半徑為:1
初始小矩形到圓周的距離:1 - x_from_start_to_cc
其中dy代表四分之一圓中初始小矩形的高度,x_slices代表小矩形的寬度:(1 - x_from_start_to_cc) / x_slices
四分之一圓的面積積分為:quarter_circle_s
以上這篇Python 找出出現次數超過陣列長度一半的元素例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援。
利用問題的普遍性和特殊性來求解,
程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import unittest
from datetime import datetime
class GetFreqNumbersFromList(unittest.TestCase):
def setUp( self ):
print ( "\n" )
self .start_time = datetime.now()
print (f "{self._testMethodName} start: {self.start_time}" )
def tearDown( self ):
self .end_time = datetime.now()
print (f "{self._testMethodName} end: {self.end_time}" )
exec_time = ( self .end_time - self .start_time).microseconds
print (f "{self._testMethodName} exec_time: {exec_time}" )
def normal_solution( self , _list, _debug = False ):
"""
普遍性解法
利用字典記錄每個元素出現的次數——然後找出元素出現次數超過陣列長度一半的元素
普遍性解法針對任何次數的統計均適用而不光只是針對出現次數超過陣列長度一半的情況
"""
_target = len (_list) / / 2
_dict = {}
for _member in _list:
if _member not in _dict:
_dict.setdefault(_member, 1 )
else :
_dict[_member] + = 1
_ret = [_member for _member in _dict if _dict[_member] > _target]
if _debug:
print (_ret)
return _ret
def specific_solution( self , _list, _debug = False ):
"""
特殊性解法
假設有兩個元素出現的次數都超過陣列長度一半就會得出兩個元素出現的次數超出了陣列長度的矛盾結果——所以超過陣列長度一半的元素是唯一的
排序後在陣列中間的一定是目標解
特殊性解法只能針對元素出現次數超過陣列長度一半的情況
"""
_list.sort()
if _debug:
print (_list[ len (_list) / / 2 ])
return _list[ len (_list) / / 2 ]
def test_normal_solution( self ):
actual_result = self .normal_solution([ 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 ], False )
self .assertEqual(actual_result[ 0 ], 2 )
def test_specific_solution( self ):
actual_result = self .specific_solution([ 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 ], False )
self .assertEqual(actual_result, 2 )
if __name__ = = "__main__" :
# 找出出現次數超過陣列長度一半的元素
suite = unittest.TestSuite()
suite.addTest(GetFreqNumbersFromList( 'test_normal_solution' ))
suite.addTest(GetFreqNumbersFromList( 'test_specific_solution' ))
runner = unittest.TextTestRunner()
runner.run(suite)
|
測試結果:
補充知識:Python 用積分思想計算圓周率
早上起來突然想求圓周率,1單位時圓的面積。
程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from math import pow , sqrt
def calc_circle_s_with(r, dy, x_slices):
x_from_start_to_cc = sqrt( 1 - pow (dy, 2 ))
dx = x_from_start_to_cc / x_slices
x_to_edge = 1 - x_from_start_to_cc
quarter_circle_s = 0
while x_to_edge < 1 :
rect_s = dy * dx
quarter_circle_s + = rect_s
x_to_edge = x_to_edge + dx
dy = sqrt( 1 - pow (( 1 - x_to_edge), 2 ))
circle_s = 4 * quarter_circle_s
print (circle_s)
calc_circle_s_with( 1 , 0.0001 , 10000000 )
|
執行結果接近3.1415926,dy傳的越小,x_slices傳的越大,就越接近。
半徑為:1
初始小矩形到圓周的距離:1 - x_from_start_to_cc
其中dy代表四分之一圓中初始小矩形的高度,x_slices代表小矩形的寬度:(1 - x_from_start_to_cc) / x_slices
四分之一圓的面積積分為:quarter_circle_s
以上這篇Python 找出出現次數超過陣列長度一半的元素例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援指令碼之家。