龙空技术网

Python自创时间复杂度O(logk n)的查找算法!快来看看

阿尔法Yang 69

前言:

现在大家对“pythonlog3”大约比较珍视,各位老铁们都需要剖析一些“pythonlog3”的相关内容。那么小编也在网上收集了一些对于“pythonlog3””的相关知识,希望你们能喜欢,同学们快快来了解一下吧!

说起查找算法,常见的就线性查找和二分查找两种

线性查找:

二分查找:

[憨笑]关于查找算法我的讲解:

线性查找的时间复杂度:O(n)

二分查找的时间复杂度:O(log2 n)

我改进的二分查找时间复杂度:O(logk n)

我默认k=3

这差距就太大了![惊呆]

这么说吧,如果n=2^32,二分查找:计算32次

用时:计算机每秒执行10^7次基本操作,时间:32/10^7=3.2e-06秒

线性查找,n=2^32,计算次数:2^32

2^32 和 32 得差多少啊!!!

用时:2^32约等于42亿,4.2^(10^9)/10^7=4200秒

二分查找,永远的“神”!

但在O(logk n)面前还是小巫见大巫:

k=3

n=3^3^3=7625597484987

而二分查找的n约等于42亿

但3^3^3远远大于2^32

但O(log3 n)的计算量呢?

log3 3^3^3=3^3=27次

what!?[给力]

在n差距那么大的情况下,O(log3 n)的计算量竟然比O(log2 n)还少!

我的算法,永远的神!

原因是:

我的算法每次将查找区域减少2/3,而二分查找每次减少1/2

代码上:

def twomidsearch(lst,val):	left=0	right=len(lst)-1		while left<=right:		mid=(left+right)//2		mid1=(left+mid)//2		mid2=(right+mid)//2		if lst[mid1]==val:			return mid1		if lst[mid2]==val:			return mid2		if lst[mid1]>val:			right=mid1-1								if lst[mid2]>val:			right=mid2-1					if lst[mid1]<val:			left=mid1+1					if lst[mid2]<val:			left=mid2+1					  	else:		return False

增加mid的个数O(logk n)中的k也会变化,越多效率越高

麻烦大家看看我的代码有没有问题[谢谢]

下次给大家讲讲思路[可爱]

标签: #pythonlog3 #算法复杂度的o怎么读