Python:二进制搜索-“查找第一个匹配项”

时间:2019-12-13 02:33:38

标签: python python-3.x computer-science

对此有一些麻烦。我在下面列出了我所拥有的。当我提交它时,由于某种原因,它总是说“程序超时”。我不确定下一步该怎么做。它在一定程度上有效,即某些测试有效,而不是最后一个测试无效。你有什么建议?

我已经提供了问题的屏幕截图,以及到目前为止的内容。

这是类中的注释(伪代码),我只需要对其进行修改以对其进行修改,以在ordered_list中打印目标的首次出现。如果列表中不存在目标,则它必须返回None。

提前谢谢!

问题: 您将要编写Python函数的代码

binsearch首先(有序列表,目标)

如果给定一个非空有序的项目列表和一个目标项目,且所有目标项目均具有相同的类型,则返回该目标在列表中首次出现的索引(如果目标在列表中),否则返回None。 / p>

例如,因为第一个3位于索引1,所以调用binsearch first([1、3、3、7、9],3)应该返回1。类似地,调用binsearch first([1、3、3 ,7、9],9)应该返回4,而调用binsearch first([1、3、3、7、9],5)应该返回None。

除了可订购的物品外,您不可以假设其他任何有关物品类型的信息。例如,项目可以是字符串,并且调用binsearch first([“ Alice”,“ Bob”,“ Chloe”,“ Chloe”,“ Dave”],“ Chloe”)应返回2。

您的程序将进行效率和样式评估。为了获得满分,它可能只进行一次相等性测试(它可能只有一个“ ==”比较,此外,可能不在任何循环内)。也就是说,唯一的相等性测试发生在执行结束时,即返回之前。

限制:此问题不允许递归。允许使用除

以外的任何其他操作

此外,您不是

  • ,−,//,×,<,

和(一次)==

当然,与搜索相关的所有内置函数和库函数也是不允许的:您必须自己进行编码。

def binsearch_first(ordered_list, target):
    left = 0
    right = len(ordered_list) - 1
    count = 0
    while left <= right:
        mid = (left + right) // 2
        count = count + 1
        if ordered_list[mid] == target:
            while mid > 0 and ordered_list[mid - 1] == target:
                mid = mid - 1
            return mid
        elif target < ordered_list[mid]:
            right = mid - 1
        else:
            left = mid + 1
    return None

Find the first occurrence

2 个答案:

答案 0 :(得分:1)

唯一适用于字符串和整数的运算符是<。 我们必须利用它是一个有序列表的事实-以递增顺序排列。

def binsearch(orderedlist,target):
  candidate = 0
  for i in range(len(orderedlist)):
    if orderedlist[i] < target:
      candidate = candidate
    else:
      if i+1 < len(orderedlist):
        if orderedlist[i] < orderedlist[i+1]:
          #it is an ordered list so if i+1 is not bigger than i, it must be equal
          candidate = candidate
        else:
          candidate = i
          break # can you use break?
  if orderedlist[candidate] == target:
    return candidate
  else:
    return None

答案 1 :(得分:0)

我不是计算机科学专业的学生,​​因此无法评论该计划的有效性,但是您可以使用简单的l = [1] l[0] = 2 # I can mutate the list... l = [2] # ... or I can create a new one 循环

来实现您的目标
for

其结果是:

def binsearch_first(ordered_list, target):
    i=0
    for ele in ordered_list:
        if ele == target:
            return i 
            break
        else:
            i+=1
    return None 

致谢