From 56ce48330b834a416b398f5a890f57cad0201e0e Mon Sep 17 00:00:00 2001 From: Vincent Hu Date: Thu, 9 May 2019 14:15:44 +0800 Subject: [PATCH 1/3] fix endless loop bug, divide 0 bug and update description fix an endless bug, for example, if collection = [10,30,40,45,50,66,77,93], item = 67. fix divide 0 bug, when right=left it is not OK to point = left + ((item - sorted_collection[left]) * (right - left)) // (sorted_collection[right] - sorted_collection[left]) update 'sorted' to 'ascending sorted' in description to avoid confusion --- searches/.interpolation_search.py.swo | Bin 0 -> 20480 bytes searches/.interpolation_search.py.swp | Bin 0 -> 16384 bytes searches/.test_interpolation_search.py.swm | Bin 0 -> 12288 bytes searches/.test_interpolation_search.py.swn | Bin 0 -> 12288 bytes searches/.test_interpolation_search.py.swo | Bin 0 -> 12288 bytes searches/.test_interpolation_search.py.swp | Bin 0 -> 12288 bytes searches/interpolation_search.py | 80 +++++++++++++----- searches/test_interpolation_search.py | 93 +++++++++++++++++++++ 8 files changed, 152 insertions(+), 21 deletions(-) create mode 100644 searches/.interpolation_search.py.swo create mode 100644 searches/.interpolation_search.py.swp create mode 100644 searches/.test_interpolation_search.py.swm create mode 100644 searches/.test_interpolation_search.py.swn create mode 100644 searches/.test_interpolation_search.py.swo create mode 100644 searches/.test_interpolation_search.py.swp create mode 100644 searches/test_interpolation_search.py diff --git a/searches/.interpolation_search.py.swo b/searches/.interpolation_search.py.swo new file mode 100644 index 0000000000000000000000000000000000000000..4a9cdacff3ee59dc3906b6a3ff66eea8bf69e234 GIT binary patch literal 20480 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 W!gr5;x_-qLfD$d`L`c^uuulNLM)rgN literal 0 HcmV?d00001 diff --git a/searches/.interpolation_search.py.swp b/searches/.interpolation_search.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..33673a883e41b3891716039b35ea16c6beeaeee2 GIT binary patch literal 16384 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 BP=^2j literal 0 HcmV?d00001 diff --git a/searches/.test_interpolation_search.py.swp b/searches/.test_interpolation_search.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..0bdcdb4c64e404e1199df12aeb577d32396074cf GIT binary patch literal 12288 zcmeI2J8#oa7=}+faVsELU_l2uG?84#jvc#2>cFiMDXuA->}zj+@kNX}c7CRv!8C9lzgsU-=}e>c`66>$m8H ztP(;Y zFU8D`YE2fGIE%UE_?$&y;M&{?e5+lP!^Q37v5pB~0(l9vcw>BGglJ_|5kp2VoTsNx z&E}29>zDv0fC*p%m;fe#319-404DGsCcwiXvJAe4JKp5ZeyDHXImI0&fC*p%m;fe# z319-4049J5U;>x`CV&YXzy$0%A^sskE+2-;!~g%gfB*kFLC7cIBk&3cfqQ@goCVg8 z6Y>RE16~5tfD8-)-$n@e47>*Bfob3z@aGsIKYem_yO}<1>OQHz#AX}9s#q!4M2F90e*v@_W*8~049J5U;>x`CU8&_py@^ikCIC* z-{IoLLD{n%zfdGjgIbnvd(5)v)D#`FEK#tmv5O*uR74!~&eEggVCRw`(%wk-peLGK z+PPGAb}@4svK_}P;@6(FY`3u4OOb_SR4s5_Ruk_^ni5T}IGlNAQKGj4pB2-2?Ml+f zNE#s7*U^w2zs?rg6A^8V;vO4TG7T&H<3Z0z>VqEieh>OyJ!qMR+WvSbXC%vm9?Jb5 z%6s*oW*Vv+Jk(i(=Dw$!JPAcuXx-Hi!b6;#v~RPctHBF@U{vq1rBhT*Z|-~AOeoH& z%6wWMr7C4E^O(TpNdpb zB*TzQQ<~JWj^iNWto~0<%c8N7*H~0{+c?jv3YvOeLs6WoNSdTe;4kZ~<&S6VCHIS! x5Hmg-c9%iTg+)TEdGEd#(w`79right: + left = right + right = point + else: + if item < current_item: + right = point - 1 + else: + left = point + 1 return None - def interpolation_search_by_recursion(sorted_collection, item, left, right): """Pure implementation of interpolation search algorithm in Python by recursion - Be careful collection must be sorted, otherwise result will be + Be careful collection must be ascending sorted, otherwise result will be unpredictable First recursion should be started with left=0 and right=(len(sorted_collection)-1) - :param sorted_collection: some sorted collection with comparable items + :param sorted_collection: some ascending sorted collection with comparable items :param item: item value to search :return: index of found item or None if item is not found """ - point = left + ((item - sorted_collection[left]) * (right - left)) // (sorted_collection[right] - sorted_collection[left]) + #avoid devided by 0 during interpolation + if sorted_collection[left]==sorted_collection[right]: + if sorted_collection[left]==item: + return left + else: + return None + + point = left + ((item - sorted_collection[left]) * (right - left)) // (sorted_collection[right] - sorted_collection[left]) + #out of range check if point<0 or point>=len(sorted_collection): return None if sorted_collection[point] == item: return point - elif sorted_collection[point] > item: - return interpolation_search_by_recursion(sorted_collection, item, left, point-1) + elif pointright: + return interpolation_search_by_recursion(sorted_collection, item, right, left) else: - return interpolation_search_by_recursion(sorted_collection, item, point+1, right) + if sorted_collection[point] > item: + return interpolation_search_by_recursion(sorted_collection, item, left, point-1) + else: + return interpolation_search_by_recursion(sorted_collection, item, point+1, right) def __assert_sorted(collection): - """Check if collection is sorted, if not - raises :py:class:`ValueError` + """Check if collection is ascending sorted, if not - raises :py:class:`ValueError` :param collection: collection - :return: True if collection is sorted - :raise: :py:class:`ValueError` if collection is not sorted + :return: True if collection is ascending sorted + :raise: :py:class:`ValueError` if collection is not ascending sorted Examples: >>> __assert_sorted([0, 1, 2, 4]) True >>> __assert_sorted([10, -1, 5]) Traceback (most recent call last): ... - ValueError: Collection must be sorted + ValueError: Collection must be ascending sorted """ if collection != sorted(collection): - raise ValueError('Collection must be sorted') + raise ValueError('Collection must be ascending sorted') return True if __name__ == '__main__': import sys - - user_input = raw_input('Enter numbers separated by comma:\n').strip() + + """ + user_input = raw_input('Enter numbers separated by comma:\n').strip() collection = [int(item) for item in user_input.split(',')] try: __assert_sorted(collection) except ValueError: - sys.exit('Sequence must be sorted to apply interpolation search') + sys.exit('Sequence must be ascending sorted to apply interpolation search') target_input = raw_input('Enter a single number to be found in the list:\n') target = int(target_input) + """ + + debug = 0 + if debug == 1: + collection = [10,30,40,45,50,66,77,93] + try: + __assert_sorted(collection) + except ValueError: + sys.exit('Sequence must be ascending sorted to apply interpolation search') + target = 67 + result = interpolation_search(collection, target) if result is not None: print('{} found at positions: {}'.format(target, result)) diff --git a/searches/test_interpolation_search.py b/searches/test_interpolation_search.py new file mode 100644 index 000000000000..60bb3af22e0f --- /dev/null +++ b/searches/test_interpolation_search.py @@ -0,0 +1,93 @@ +import unittest +from interpolation_search import interpolation_search, interpolation_search_by_recursion + +class Test_interpolation_search(unittest.TestCase): + def setUp(self): + # un-sorted case + self.collection1 = [5,3,4,6,7] + self.item1 = 4 + # sorted case, result exists + self.collection2 = [10,30,40,45,50,66,77,93] + self.item2 = 66 + # sorted case, result doesn't exist + self.collection3 = [10,30,40,45,50,66,77,93] + self.item3 = 67 + # equal elements case, result exists + self.collection4 = [10,10,10,10,10] + self.item4 = 10 + # equal elements case, result doesn't exist + self.collection5 = [10,10,10,10,10] + self.item5 = 3 + # 1 element case, result exists + self.collection6 = [10] + self.item6 = 10 + # 1 element case, result doesn't exists + self.collection7 = [10] + self.item7 = 1 + + def tearDown(self): + pass + + def test_interpolation_search(self): + self.assertEqual(interpolation_search(self.collection1, self.item1), None) + + self.assertEqual(interpolation_search(self.collection2, self.item2), self.collection2.index(self.item2)) + + self.assertEqual(interpolation_search(self.collection3, self.item3), None) + + self.assertEqual(interpolation_search(self.collection4, self.item4), self.collection4.index(self.item4)) + + self.assertEqual(interpolation_search(self.collection5, self.item5), None) + + self.assertEqual(interpolation_search(self.collection6, self.item6), self.collection6.index(self.item6)) + + self.assertEqual(interpolation_search(self.collection7, self.item7), None) + + + +class Test_interpolation_search_by_recursion(unittest.TestCase): + def setUp(self): + # un-sorted case + self.collection1 = [5,3,4,6,7] + self.item1 = 4 + # sorted case, result exists + self.collection2 = [10,30,40,45,50,66,77,93] + self.item2 = 66 + # sorted case, result doesn't exist + self.collection3 = [10,30,40,45,50,66,77,93] + self.item3 = 67 + # equal elements case, result exists + self.collection4 = [10,10,10,10,10] + self.item4 = 10 + # equal elements case, result doesn't exist + self.collection5 = [10,10,10,10,10] + self.item5 = 3 + # 1 element case, result exists + self.collection6 = [10] + self.item6 = 10 + # 1 element case, result doesn't exists + self.collection7 = [10] + self.item7 = 1 + + def tearDown(self): + pass + + def test_interpolation_search_by_recursion(self): + self.assertEqual(interpolation_search_by_recursion(self.collection1, self.item1, 0, len(self.collection1)-1), None) + + self.assertEqual(interpolation_search_by_recursion(self.collection2, self.item2, 0, len(self.collection2)-1), self.collection2.index(self.item2)) + + self.assertEqual(interpolation_search_by_recursion(self.collection3, self.item3, 0, len(self.collection3)-1), None) + + self.assertEqual(interpolation_search_by_recursion(self.collection4, self.item4, 0, len(self.collection4)-1), self.collection4.index(self.item4)) + + self.assertEqual(interpolation_search_by_recursion(self.collection5, self.item5, 0, len(self.collection5)-1), None) + + self.assertEqual(interpolation_search_by_recursion(self.collection6, self.item6, 0, len(self.collection6)-1), self.collection6.index(self.item6)) + + self.assertEqual(interpolation_search_by_recursion(self.collection7, self.item7, 0, len(self.collection7)-1), None) + + + +if __name__ == '__main__': + unittest.main() From 54035ee92d21ee48b47f220f8c2637209f6f024d Mon Sep 17 00:00:00 2001 From: Vincent Hu Date: Thu, 9 May 2019 14:18:21 +0800 Subject: [PATCH 2/3] delete swap files --- searches/.interpolation_search.py.swo | Bin 20480 -> 0 bytes searches/.interpolation_search.py.swp | Bin 16384 -> 0 bytes searches/.test_interpolation_search.py.swm | Bin 12288 -> 0 bytes searches/.test_interpolation_search.py.swn | Bin 12288 -> 0 bytes searches/.test_interpolation_search.py.swo | Bin 12288 -> 0 bytes searches/.test_interpolation_search.py.swp | Bin 12288 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 searches/.interpolation_search.py.swo delete mode 100644 searches/.interpolation_search.py.swp delete mode 100644 searches/.test_interpolation_search.py.swm delete mode 100644 searches/.test_interpolation_search.py.swn delete mode 100644 searches/.test_interpolation_search.py.swo delete mode 100644 searches/.test_interpolation_search.py.swp diff --git a/searches/.interpolation_search.py.swo b/searches/.interpolation_search.py.swo deleted file mode 100644 index 4a9cdacff3ee59dc3906b6a3ff66eea8bf69e234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 W!gr5;x_-qLfD$d`L`c^uuulNLM)rgN diff --git a/searches/.interpolation_search.py.swp b/searches/.interpolation_search.py.swp deleted file mode 100644 index 33673a883e41b3891716039b35ea16c6beeaeee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3ON<;x8OO^B&m@>&!i5A;whueY&c3`MF(c0gC$c3_Y=wC3%Vuf!&eZO-($hWZ zhj&MjL&PNrun-b(Kp=%nh!DiQ;(!tbIHHJ1M&d%mLtG*SK@tlv2SfN(Rrfr0X6;xO zQb5)6&plmTkN*Bu^;Li6_Uhb;PaKi^XXXXR%|d*9=lKVshprcYJ1oShR<2X8c-*^m z``o@eKX&JpGCo3uvr8>?FkFw5AZxYL+55U#D~@JUu^%-FFH&1um;Vo~=#q-zgUM&Clt4d-v>?@85O&vPIlYr+`zyDc}@v3OEIv0!{&^ zfK%ZAOM$F&o%jqUU00ZOTXEj8<$Qf{eWWbUPr}zhxBWr*H_!1)_yK$$9t95$!+y90F5Do* zAK_vG&z z8JhN_`ksY+Y3tmuV2Khe}3ydzI@f zmaD3;EQn;*QZfwEtoA^J7(ETrZaSkj1GGA(9?DhJP_mt;nJ((54HY%1Q>Jl}siv;c z?{vcMuvyZ6j8ZDR*-)KKp76t59ZHfo>C5eTewwNz^K5kkIur&bU7NWt5Oyx>jtnx@ zp2U_!>R+@kb852o&!nADKYw*%a>ba{zco%Kt4_*Ocl^ZHX03K*BW|~Sqs&a2B|)cB zC=|3im@W}X(A}OF`EBKSvR;=Hp4aw+$nz#@j9bZ(s4Pz+xs>F}T$?mMNY#KCm5FIQFw}8NP_iN;a!G3;IW(L9_T1OsN8 zyTxO@(o_& zL0h{ii)Yam$|+ef&WT57zRo%`ii;`|BHI*I?66;{>FqLU5&O^Mgk|`^ocF3lzma0A{{itb&X}vPOx609# zN1a49gGQ#CGY#EMxA}=$%fo?Lysg)*%9tfG+0YKVSid&{yx*#=4B79?6YS8ws*P_n zA7X0RhbCg7p7hHvIrUm)zva~HOmA`uGwp|p79VxK$vLd$DJSrj6{t7n<-noyGidGL zos#oLq4NIl$>;)r{bU~o9a~1wC`4PvYGQXzCJurY=4zQZ2Z*5 z720uH4Bk0o)c?E#e9L>PZGF?|qGewxSTc+LEQ1nUjR{?tL8bd!5X!~|M|p`J2n~9H zOgUl)%Ip)F4hqCt61RCtTFZIG)-T}2d%217NR3Q1CG^NxYVlIYpN@9c9rF?WRr_pH zk&gerP3(D5$EC#oM>y%@4dVKjp$W@y7u*0Bi0xm8U%=z=7QB-Z~4oP{qy1`<9DFB0pYg)V#= zZi8K*^}7JC!+CfXeh9w;cQ^%{0@t8G=`xKY>|OMJ3~hpqNgYZmFYMWEpt%h+0^l+G zjBW$1csCY$rnn8XK{bkPh5kN(+dv!nUz=AI;G590+~RN>Xl?@ym*Y0j*xhy;XnOVG Za2sgXyrsU;3fQ4Gn@k7nW;0t3{{iYE5`s5CAhF>AShGMZ5&z_3+_Y|?VFNm&d~xD4K4<>lV_Q+?u72&(6+T@w z7}^QO_Ah+Ab^rYV#x2GkHalwXuI=)orI)KS)!jO-BVlQ=DbD-%!pM`&R$RKeCYxbU ziiI21nj$Vq5lhDlq=?#~?@BKWoL;QhUfV4_#mND3Aj^S{Y)nm$GqY^ys>?*~EI)N} zDXTZ_CkMy@a)2Bl2gm_(fE*wP$btXR0ofj78_>0{udUeMjty=5Uui=QkOSlZIY17O z1LOcXKn{=tZ(qI8<kpL84*aGc3=jH&*r<#IXJ{eZVv_>H0)$0Cw*4?3=&-)_ZYzT2x7`o5^C zg^*RPcbq3ht6I?bLKuj`XesSfN*gJMD%wRasEgI!KvY?~Fk-<!y`A!MDtmdWwDPdDa!T5$wT)D5W0SJFXzb*l5XDhmMxjaf5sT z+&Z)E!11|lv)NfTY1=Yj+mlxSIiqdY*72K~B6m}~NcmZTPat!Tzuas6QrG+U6Dq2N1sPWBqBeJYj z7_p$4DrojRK;q!ACX7^0W48%o(1ejPaiBZD7ePH$T<;m``WekwIhDJ-+gN$fSUF{E zw8~nlvexIS#_KHeoNlsE3aO3N#Eq16(tev0T@N1xyJjV;E?L!VmTCQ+r-gWA&-Me!T6>di*|j6qgTd~Wz=4t!A1Yab+YoCm_g4< zFN0`9Nj=h*xctoN+KTt_)t_I|GxoJ5qlc`UIrhIW5b=R#ssdJ#67Ds~YAsvI@%Js;TITp`gFCw^lHfvX{JH?u3|& xrDk^D_)@0_G{(mE||2SD$XudL*q-@ET8?_@=}hwAMcv+Pny z0~{v-R%brn|Mhkh)@K2pw%YR39mh<~P%GA?wbR69Ojxe9_!aL_7`vk7C*@m9q7??^ zggbG)#gnq&iLl*3@Hh%RN4Q~NcVeYzX{YoQCjvxZD1kB1E1D{&j9)m!_y^aiAyKm`21c(3;AOb{y2oM1xKm>>Y z5g-CYfC&791e^xIn?nE(4&&nS|Nq|a{~sp+KA_&CUZ5h>9h8bXi&{Sp@CmhsdXAb# zl~5z7FJk~7Q7=&osA<$W)X!r8-%;;StEd&!GOCHXhq{X@qrM&mc#JxOS~~(zLw&>b zy+*x436xx~jiNyWhyW2F0z`la5P`pq0K?G^TpARP z+iOZQlhVYL0~O7Z8#MT0XCbnzS=?vAYNlZIU_2O^l*U#M#-ImdzaI2VLH%GnR5B?m zTRl_;JyiDVLCX}>`aCpvljWY%O*^5OY2*l-IBmhsZBBeGd=_k(m9|ydwrq-N{Vkj6 zZw$_B>cU2RoN0`E+~GJm?haFyQ8)4ocJ;37 zX_2B`WLeKeaWaSsH=*B zuc}g271LBKOPSQOj*~DJyzxg)E3&YeS6D{(S~$t*`<(+*mY&<~Zl&je1a)UMF&}Z8{6`1Qs2z1*RbYs1Y@EiRk BP=^2j diff --git a/searches/.test_interpolation_search.py.swp b/searches/.test_interpolation_search.py.swp deleted file mode 100644 index 0bdcdb4c64e404e1199df12aeb577d32396074cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2J8#oa7=}+faVsELU_l2uG?84#jvc#2>cFiMDXuA->}zj+@kNX}c7CRv!8C9lzgsU-=}e>c`66>$m8H ztP(;Y zFU8D`YE2fGIE%UE_?$&y;M&{?e5+lP!^Q37v5pB~0(l9vcw>BGglJ_|5kp2VoTsNx z&E}29>zDv0fC*p%m;fe#319-404DGsCcwiXvJAe4JKp5ZeyDHXImI0&fC*p%m;fe# z319-4049J5U;>x`CV&YXzy$0%A^sskE+2-;!~g%gfB*kFLC7cIBk&3cfqQ@goCVg8 z6Y>RE16~5tfD8-)-$n@e47>*Bfob3z@aGsIKYem_yO}<1>OQHz#AX}9s#q!4M2F90e*v@_W*8~049J5U;>x`CU8&_py@^ikCIC* z-{IoLLD{n%zfdGjgIbnvd(5)v)D#`FEK#tmv5O*uR74!~&eEggVCRw`(%wk-peLGK z+PPGAb}@4svK_}P;@6(FY`3u4OOb_SR4s5_Ruk_^ni5T}IGlNAQKGj4pB2-2?Ml+f zNE#s7*U^w2zs?rg6A^8V;vO4TG7T&H<3Z0z>VqEieh>OyJ!qMR+WvSbXC%vm9?Jb5 z%6s*oW*Vv+Jk(i(=Dw$!JPAcuXx-Hi!b6;#v~RPctHBF@U{vq1rBhT*Z|-~AOeoH& z%6wWMr7C4E^O(TpNdpb zB*TzQQ<~JWj^iNWto~0<%c8N7*H~0{+c?jv3YvOeLs6WoNSdTe;4kZ~<&S6VCHIS! x5Hmg-c9%iTg+)TEdGEd#(w`79 Date: Wed, 15 May 2019 09:47:02 +0800 Subject: [PATCH 3/3] delete 'address' and add input validation --- searches/quick_select.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/searches/quick_select.py b/searches/quick_select.py index 1596cf040e0c..76d09cb97f97 100644 --- a/searches/quick_select.py +++ b/searches/quick_select.py @@ -14,9 +14,9 @@ def _partition(data, pivot): """ less, equal, greater = [], [], [] for element in data: - if element.address < pivot.address: + if element < pivot: less.append(element) - elif element.address > pivot.address: + elif element > pivot: greater.append(element) else: equal.append(element) @@ -24,6 +24,11 @@ def _partition(data, pivot): def quickSelect(list, k): #k = len(list) // 2 when trying to find the median (index that value would be when list is sorted) + + #invalid input + if k>=len(list) or k<0: + return None + smaller = [] larger = [] pivot = random.randint(0, len(list) - 1) @@ -41,4 +46,4 @@ def quickSelect(list, k): return quickSelect(smaller, k) #must be in larger else: - return quickSelect(larger, k - (m + count)) + return quickSelect(larger, k - (m + count)) \ No newline at end of file