首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >寻找一种算法,以在一个空数组的中间找到一组数据的开始和结束。

寻找一种算法,以在一个空数组的中间找到一组数据的开始和结束。
EN

Stack Overflow用户
提问于 2022-11-27 03:41:53
回答 2查看 38关注 0票数 2

假设我有一个5000元素的数组。数组中间的某个位置,比如从a4200到a4300,就是数据。此范围以外的值返回null。

在查询数组时,查找第一个也是最后一个包含数据的条目的最有效方法是什么?有我想做的事的名字吗?

EN

Stack Overflow用户

发布于 2022-11-27 14:16:14

如果您知道长度为n的数组中间有k个非空项,那么您可能需要在找到数据元素之前进行n/k检查,只需检查每个kth元素。在此之后,您可以进行二进制搜索以找到结果。

如果您不知道k,那么您可以递归地将范围划分成越来越小的区域,按照宽度第一的顺序,检查每一个区域的中间。在最坏的情况下,这仍然需要O(n/k)检查。二进制搜索找出终点,然后取O(log k)、O(n/k + log k)所有。

这里是python中的:

代码语言:javascript
运行
复制
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

测试:

代码语言:javascript
运行
复制
$> print(findData([
    None,None,None,1,2,3,4,5,None
]))
(3,8)
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74587327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档