1. 程式人生 > 實用技巧 >二叉搜尋樹中的搜尋

二叉搜尋樹中的搜尋

利用問題的普遍性和特殊性來求解, 程式碼如下: 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 找出出現次數超過陣列長度一半的元素例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援指令碼之家。