小华今天给分享python算法二分查找的知识,其袤中也会对pyth篪on驺二分查找算法编写进行解释,希望能解决你的问题,请看下面的文闳章腌阅读吧!

python二分查找(python二分查找算法编写)python二分查找(python二分查找算法编写)


python二分查找(python二分查找算法编写)


1、在 Python 中,表达式 100螭0000000竑000000 in牰 range(1000000000000001丒) 的执行速度能有多快?判断一个元素 x 是否存在于 y 中简单粗暴地方法就算法是迭代,每次取出砾一个值与锕之比黐较,如果中存在楱一个值 z 等于 x羴就返回 tru魑e ,懋它的时间复杂度是 O(n)晷,使用哈夿希算法的理论时间复锕杂度是踌 O(1),二分查找的时间复杂度是 O(l亜og褫 n),那么 Python 究竟会采用的哪种算法来实敕现呢?先来做个实验:#py篪thon2酬timeit.timeit 媸('1疝000000000 in range(0,魑1000000000,10)'嗤, number=1)5.5035764080啻53籀05timeit.timeit('1000000喌000 in x俦range(0,1000000000,10)', number=1)2.3025菗2008383526# python3impo镑rt timeit 骤timeit.timeit('10砾000000夿00 in range(0,1000000算法00二分0,10)', numbe牰r=1)饬4.49㤘035583歯8248402e查找-06我们都知薨道 python2 中的 range 函数返回的炿是一个列表对象,一次性喌把所有的元素加载到俦内存,所以执行个表达式楱的时候,系统会突然感觉python非常卡顿,它需要鸠的时间是荭5篪秒多。

2、xrange 和 pytho编写n3 中的 r 砺ange 函 雠数类似,都是返鸱回坻一个迭代器对象,但是它俩的执行结偢果相悬饬殊,敕让人大跌。

3、第 瞓三个表达式所花的时间接近0秒,为何 敕pyt峯瘛hon2 的 xrange 与 pyth鳝on3 中 ra编写nge 函数区别这么大瘛?为魉了弄明白其中的怞玄机编写,我们要理解in作是如何执行的。

4、根据 P驺ython 文档 in 的规则:如果该类实现了con墀俦tains(魍)方法歯,那么只要 ypython.contains(x) 返回 true 那么 x in黐 y闳 也返回 true,反之亦然梼。

5、没查找豁有实俦现conta晷ins()方法,但实现了i亜ter()方法,那么在迭殠代过程中如果有某个值 z==x,就返回 true,否则就是 啻编写false。

6、如果以上两个方法都没有实现,就看get()方法,菗 如果存在一个索引i 雠使得 x==y[i] ,就返回 懤true,否则返回 false。

7、明㤘白了查找 in嗤蜯 的规则之后,我们先看看 xrange 提供了鸠哪些方法:dir(xrange)['__class__','墀__ge篪ti紬tem__', '__hash__', '__in酬it_腌_','__iter__',褫 '__len__', '_呪_new__紬', ...]是的,xrange 函数只实现了 ge豁t镬 和 iter,判断 x 是 是否在 y 中需要逐个值迭代进行比较, 峁也就是说 xrang藿e 的时间复杂度是O(n)。

8、嚟再来看雠鳝看 python3 的 range 有哪些方法:dir(range)嚟['__class__', 鸱'__contai镑ns__', '__getit算法em__', '_蜯_iter__','二分count', 'index', 'start', 雠'砥step', 'stop', ...]range 提供的属搒性绉比二分 xra 峁nge胄咮 薨要多很多,不仅实现了 get 媸 和 iter ,还实现了 contain吜s ,所呪以它会优先峯调用contains方法,此疝外,它还提供懋了梼三二分个属 骤性 start、stop、step。

9、那么究竟为什么它的幚执螭行速幚度会如此之快呢?来看看cont砥ains方法 砺是如何 侴实现怞的吧。

1敕0、在 Python3 中,contains 并咮不是逐个值迭代对比,而是采用这样一羴种逻辑:炿首先检查 x锕 是否 魉在 sta懤rt 伬和 stop 范围之间:starpythont 如果在这个区畴间范围,那么再根藿据竑坻 step 计算 x 是否刚好落在 xrange 区间中的某个值上,这里用取模的方式来判断:(x - 篪start) % s篪te殠p == 0此刻真伬相大偢白,x踌range 的时间复杂度是O(籀1),也就是说不管 xrang魍e搒(s锕t畴art, stop, step) 胄中荭的 st 瞓op 值多大镬,时间复杂度都是一个吜常量。

11、所以 python3 中的 rapythonnge 方法不仅可以节省内存,而且执行效率更高,所以不要再纠结学 Python2 还是 Python3 了。

查找

本 侴文到这结束袤,希望绉上面丒文章对大家有所帮助。