假设我有一个5000元素的数组。数组中间的某个位置,比如从a4200到a4300,就是数据。此范围以外的值返回null。
在查询数组时,查找第一个也是最后一个包含数据的条目的最有效方法是什么?有我想做的事的名字吗?
发布于 2022-11-27 14:16:14
如果您知道长度为n的数组中间有k个非空项,那么您可能需要在找到数据元素之前进行n/k检查,只需检查每个kth元素。在此之后,您可以进行二进制搜索以找到结果。
如果您不知道k,那么您可以递归地将范围划分成越来越小的区域,按照宽度第一的顺序,检查每一个区域的中间。在最坏的情况下,这仍然需要O(n/k)检查。二进制搜索找出终点,然后取O(log k)、O(n/k + log k)所有。
这里是python中的:
def findData(A):
if (len(A)<1):
return None
q = [(0,len(A))]
pos = 0
while pos < len(q):
(s,e) = q[pos]
pos += 1
mid = s + (e-s)//2
if A[mid] == None:
# Didn't find data. Subdivide range
if mid > s:
q.append((s,mid))
if mid+1 < e:
q.append((mid+1,e))
continue
# Found data
maxs = mid # max start pos
mine = mid+1 # min end pos
# Binary search to find start
while s < maxs:
mid = s + (maxs-s)//2
if A[mid] == None:
s = mid+1
else:
maxs = mid
# Binary search to find end
while mine < e:
mid = mine + (e-mine)//2
if A[mid] == None:
e = mid
else:
mine = mid+1
return(s,e)
# Searched the whole array and found no data
return None
测试:
$> print(findData([
None,None,None,1,2,3,4,5,None
]))
(3,8)
https://stackoverflow.com/questions/74587327
复制相似问题