给定一个长度为 N 的整数排序列表,确定元素 x 是否在列表中

如何解决给定一个长度为 N 的整数排序列表,确定元素 x 是否在列表中

解决的问题是:

给定一个长度为 N 的整数排序列表,确定元素 x 是否在列表中,而不执行任何乘法、除法或位移操作。在 O(log N) 时间内完成此操作。

我已经使用修改后的二进制搜索解决了这个问题,但我不确定这是否满足所需的时间复杂度。有没有更好的解决方案?

def get_mid(start,end):
    mid = start + 1
    sum_ = start + end
    prev = mid
    while mid < end and (mid + mid) != sum_ and (mid + mid + 1) != sum_:
        prev = mid
        mid += mid
    if mid > end:
        return prev
    return mid



def bin_search(arr,x):
    start,end = 0,len(arr) - 1

    while start <= end:
        mid = get_mid(start,end)
        if mid == 1:
            return x in arr[:end]
        if x > arr[mid]:
            start = mid + 1
        elif x < arr[mid]:
            end = mid - 1
        else:
            return True

    return False

解决方法

我们可以通过逐位构造索引来找到x的索引是否存在:

def find_idx_sorted(arr,x):
    powers_of_two = [1]
    while powers_of_two[-1] < len(arr):
        powers_of_two.append(powers_of_two[-1] + powers_of_two[-1])

    idx = 0
    for pot in reversed(powers_of_two):
        if idx + pot < len(arr) and x >= arr[idx + pot]:
           idx += pot
    
    return idx

那么我们需要做的就是:

def contains_sorted(arr,x):
    return arr[find_idx_sorted(arr,x)] == x
,

要使用 log2(N) 调用仅添加而不使用循环查找:

def find_pos(step,arr,val):
    next = step+step
    if next < len(arr):
       choose = find_pos(next,val)
    else:
       choose = step
    next = choose + step
    if next < len(arr) and arr[next] <= val:
        return next
    if arr[choose] <= val:
        return choose
    return 0

def find_val(arr,val):
    index = find_pos(1,val)
    if arr[index] == val:
        print "found %d at %d" % (val,index)
    else:
        print "%d not found" % (val)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?